第一步:准备系统环境

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装必要工具
sudo apt install -y curl wget unzip git

第二步:下载 Typecho 源码

# 创建项目目录
mkdir -p /var/www/html
cd /var/www/html
# 备份(可选)
mv typecho typecho.bak

# 下载最新版 Typecho(v1.2+)
wget https://github.com/camel52zhang/Typecho-lelez/releases/download/v1.0.1-beta.1/typecho.zip

# 解压
unzip typecho.zip

# 启动 PHP 内置服务器,监听 29080(其它任何端口都可以)
# 1. 确保宿主机防火墙允许 29080 端口
sudo ufw allow 29080/tcp  # 如果你启用了 ufw
或者临时关闭防火墙测试:
sudo ufw disable
测试完再开启:
sudo ufw enable
# 2. 杀掉可能存在的旧 PHP 进程
pkill -f "php -S.*29080"
# 3. 进入 typecho 目录启动 PHP 服务(后台运行)
cd /var/www/html/typecho
nohup php -S 0.0.0.0:29080 > /var/log/typecho.log 2>&1 &
# 4. 验证
ss -tuln | grep 29080  # 应看到 LISTEN
curl -I http://localhost:29080/install.php  # 应返回 200
...

# 清理压缩包
rm typecho.zip

# 授权(确保 PHP 能写入 usr/ 和 var/)
chmod -R 777 /var/www/html/typecho/usr /var/www/html/typecho/var
# 或更安全:
chown -R www-data:www-data /var/www/html/typecho  # 如果用 Web 用户

# 浏览器测试
http://localhost:29080/install.php #打开出现安装界面即正常

# 🔍 获取宿主机对容器可见的 IP(容器访问宿主机用),下边配置default.conf要用:
ip route show default | awk '{print $3}'  # 通常是 172.17.0.1

第三步:安装 MariaDB(简单、兼容、省资源)

  1. 安装 MariaDB 服务 + 客户端

    # Ubuntu/Debian
    sudo apt update
    sudo apt install -y mariadb-server mariadb-client
  2. 启动并启用服务

    sudo systemctl start mariadb
    sudo systemctl enable mariadb
  3. 运行安全初始化(设置 root 密码、删匿名用户等)

    sudo mysql_secure_installation
    按提示操作,建议:
     设置 root 密码(记下来!)110119asd
     删除匿名用户(Y)
     禁止 root 远程登录(Y)
     删除 test 数据库(Y)
     重载权限表(Y)
  4. 登录 MariaDB

    sudo mysql -u root -p
    输入你设置的 root 密码,进入 MariaDB 命令行(提示符变成 MariaDB [(none)]>)。
  5. 执行以下 SQL 命令

    💡 复制粘贴以下整块内容到 MariaDB 中(一行一行也可以):
-- 创建数据库(使用 utf8mb4 支持 emoji 和完整 Unicode)
CREATE DATABASE typecho_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建专用用户(替换 your_strong_password 为你的强密码!)
CREATE USER 'typecho_user'@'localhost' IDENTIFIED BY 'your_strong_password';

-- 授权该用户操作这个数据库
GRANT ALL PRIVILEGES ON typecho_blog.* TO 'typecho_user'@'localhost';

-- 刷新权限使生效
FLUSH PRIVILEGES;

-- 退出
EXIT;
🔐 密码建议:
长度 ≥ 12 位
包含大小写字母、数字、符号(如 T3chBl0g!2026#)
不要和系统密码相同
  1. 验证是否成功(可选)

    重新登录测试新用户:
    mysql -u typecho_user -p -D typecho_blog

    输入你设置的密码,如果能进入,说明 OK!
    然后退出:

    EXIT;
  2. 回到浏览器安装 Typecho(可以其他配置完后操作)
    在 “初始化配置” 页面填写:
    字段 值
    数据库适配器 Mysql
    数据库地址 localhost
    端口 3306(可留空)
    用户名 typecho_user
    密码 your_strong_password(你刚设的)
    数据库名 typecho_blog
    表前缀 typecho_(默认)

然后填写站点信息(用户名、密码、邮箱),点击 “开始安装”。

第四步:配置 Nginx(Docker 容器)

编辑 default.conf(位置在/home/zhang-fn/camelznav-project/nginx/conf.d/文件夹内):

nano /home/zhang-fn/camelznav-project/nginx/conf.d/default.conf
Nginx当前在运行状态,监控端口是80/443,用于域名nav.camelz.dpdns.org导航站,现只需假如typecho的域名blog.camelz.dpdns.org和端口29080进来即可,修改后如下:
# =============== nav.camelz.dpdns.org ===============
server {
    listen 80;
    server_name nav.camelz.dpdns.org;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name nav.camelz.dpdns.org;

    ssl_certificate /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem;

    location /api/ {
        rewrite ^/api/(.*) /$1 break;
        proxy_pass http://camelznav-backend:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        proxy_pass http://camelznav-frontend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}


# =============== blog.camelz.dpdns.org新增 ===============
server {
    listen 80;
    server_name blog.camelz.dpdns.org;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name blog.camelz.dpdns.org;

    ssl_certificate /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem;

    location / {
        proxy_pass http://172.17.0.1:29080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
    }

    # 可选:允许上传大文件(Typecho 默认限制较小)
    client_max_body_size 64M;
}
172.17.0.1:Linux 上 Docker 默认网桥 docker0 的 IP,容器访问宿主机的标准方式。也可改为host.docker.internal,它是Docker Desktop(Mac/Windows)专用,在 Linux 原生 Docker 默认不支持,假如改后报错不能连接,就用172.17.0.1。
两个域名nav.camelz.dpdns.org和blog.camelz.dpdns.org是一个运营商,都托管在cloudflare,它们的证书目录设为一样的

第四步:配置 docker-compose.yml(含证书新加域名blog.camelz.dpdns.org)
修改

nano /home/zhang-fn/camelznav-project/docker-compose.yml

添加域名

  -d blog.camelz.dpdns.org
  --expand
🔁 注意:必须加上 --expand,否则 Certbot 不会自动覆盖/扩展现有证书。

完整版

# version: '3.8'

services:
  # Certbot for SSL certificates
  certbot:
    image: certbot/dns-cloudflare
    container_name: camelznav-certbot
    volumes:
      - ./certbot/letsencrypt:/etc/letsencrypt
      - ./certbot/credentials.ini:/credentials.ini
    command: certonly --dns-cloudflare --dns-cloudflare-credentials /credentials.ini -d nav.camelz.dpdns.org -d blog.camelz.dpdns.org --expand --agree-tos --email eric.zhng@gmail.com --non-interactive

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    container_name: camelznav-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./certbot/letsencrypt:/etc/letsencrypt
    depends_on:
      - camelznav-backend
      - camelznav-frontend

  # 后端服务
  camelznav-backend:
    build: ./camelznav-backend
    container_name: camelznav-backend
    restart: always
    environment:
      - PORT=8080
      - GIN_MODE=release
    volumes:
      # 挂载宿主机 ./data 文件夹到容器内的 /app 目录
      - ./data/nav.db:/app/nav.db
      - ./data/uploads:/app/uploads
      - /etc/localtime:/etc/localtime:ro
    ports:
      # 🚀 左边是外面访问的端口,可随意修改,右边容器内端口8080不能修改
      - "18081:8080"

  # 前端服务
  camelznav-frontend:
    build: 
      context: ./camelznav-frontend
      args:
        # 🚀 根据实际情况修改IP地址,必须与后端左侧的宿主机端口一致
        - NEXT_PUBLIC_API_URL=http://camelznav-backend:18081
    container_name: camelznav-frontend
    restart: always
    environment:
      # 🚀 根据实际情况修改IP地址,必须与后端左侧的宿主机端口一致
      - NEXT_PUBLIC_API_URL=http://camelznav-backend:18081
    ports:
      # 🚀 左边是外面访问的端口,可随意修改,右边容器内端口3000不能修改
      - "30001:3000"
    depends_on:
      - camelznav-backend
      

第五步:申请证书

停止当前项目

docker compose down

申请证书

docker compose run --rm certbot

输出Successfully received certificate表示成功了

Container camelznav-project-certbot-run-da8d151e1ae7 Creating 
Container camelznav-project-certbot-run-da8d151e1ae7 Created 
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewing an existing certificate for nav.camelz.dpdns.org and blog.camelz.dpdns.org
Unsafe permissions on credentials configuration file: /credentials.ini
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.cloudflare.com', port=443): Read timed out. (read timeout=5)")': /client/v4/zones?name=blog.camelz.dpdns.org&per_page=1
Waiting 10 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem
This certificate expires on 2026-04-04.
These files will be updated when the certificate renews.

重新启用项目

docker compose up -d
# 或
docker compose up --build -d

第六步:重载 Nginx,测试连接

# 测试配置
nginx -t
# 重载
nginx -s reload
# 重启 Nginx 容器
docker restart camelznav-nginx

测试连接

docker exec -it camelznav-nginx curl -I https://blog.camelz.dpdns.org/install.php

查看日志

# 查看日志确认启动成功
docker logs camelznav-nginx
# Nginx 启动日志(最近10行)
docker logs --tail 10 camelznav-nginx

✅ 安装完成后记得

删除 install.php(重要!)
~~~
rm /var/www/html/typecho/install.php
~~~
限制 config.inc.php 权限
~~~
chmod 600 /var/www/html/typecho/config.inc.php
~~~
确保 usr/ 目录可写(用于上传、缓存)
~~~
chmod -R 777 /var/www/html/typecho/usr
~~~

🎉 恭喜!
你现在有了:

一个安全的 MariaDB 数据库
一个专用数据库用户
即将上线的 Typecho 博客!

去完成安装吧!完成后访问:

前台:https://blog.camelz.dpdns.org
后台:https://blog.camelz.dpdns.org/admin/

标签: none

添加新评论

🔝