Blog 部署流程:从 Docker 到 HTTPS

这篇文章记录本站从零切到线上可访问的完整流程。它不是一份只适合复制粘贴的命令清单,而是我这次实际部署时的路径:先跑起来,再把域名、HTTPS、主题和后台管理慢慢补齐。

1. 架构选型

博客最终选择的是 Typecho + Butterfly 风格主题

选择 Typecho 的原因很简单:它比 Halo 更轻,后台也足够直接,可以在线写文章、改分类、传附件,不用每次在本地写完再同步到服务器。主题层面保留 Butterfly 这种更接近 Hexo 的视觉风格,首页更清爽,阅读页也更有个人站的感觉。

当前线上结构大致是这样:

用户浏览器
  -> sjhibqi.cn / blog.sjhibqi.cn
  -> Nginx HTTPS 入口
  -> Typecho 博客容器
  -> MySQL 数据库

AI 主站和博客共用服务器上的 Docker 基础设施,但域名和服务入口分开:

  • AI 主站:https://sjhibqi.cn/
  • 博客:https://blog.sjhibqi.cn/

2. 准备服务器环境

服务器上统一使用 Docker 管理服务。这样后续迁移、重建、回滚都会简单很多,不需要把 PHP、Nginx、MySQL 的环境散装在系统里。

核心服务包括:

  • test-claw-web:统一的 Nginx HTTPS 入口
  • test-claw-mysql:MySQL 数据库,AI 主站和博客复用不同库
  • typecho-blog:Typecho 博客运行容器

敏感信息没有写进文章,也不应该写进 Git 仓库。数据库密码、访问密钥、证书目录这类内容只保留在服务器配置或被 .gitignore 忽略的文件里。

3. 部署 Typecho

Typecho 本体跑在单独容器里,持久化目录挂载到服务器:

/opt/typecho-blog/html

这个目录保存 Typecho 程序、主题、上传文件和本地自定义资源。即使容器重建,只要这个目录和数据库还在,博客内容就不会丢。

数据库使用独立库:

typecho_blog

这样博客数据和 AI 主站业务表分开,后续备份、迁移、排查都清楚。

4. 配置域名和反向代理

博客使用二级域名:

blog.sjhibqi.cn

Nginx 根据 server_name 区分不同站点。博客域名进入 Nginx 后,反向代理到 Typecho 容器:

server {
    listen 443 ssl;
    server_name blog.sjhibqi.cn;

    location / {
        proxy_pass http://typecho-blog:80;
        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 https;
    }
}

这里最重要的是 HostX-Forwarded-Proto。Typecho 后台、主题资源、跳转链接都依赖站点地址,如果代理层没告诉它外面是 HTTPS,就很容易出现跳回 HTTP 或资源路径混乱的问题。

5. 申请 HTTPS 证书

HTTPS 使用 Let's Encrypt 证书。证书申请后挂载到 Nginx 容器内,Nginx 直接读取:

/etc/letsencrypt/live/sjhibqi.cn/fullchain.pem
/etc/letsencrypt/live/sjhibqi.cn/privkey.pem

同一张证书覆盖了:

  • sjhibqi.cn
  • blog.sjhibqi.cn

HTTP 入口只保留两个用途:

  • Let's Encrypt 的 ACME 校验
  • 自动跳转到 HTTPS

也就是访问 http://blog.sjhibqi.cn/ 会自动跳到 https://blog.sjhibqi.cn/

6. 配置自动续期

证书不是一次申请永久有效,所以服务器上配置了定时续期任务。续期成功后 reload Nginx,让新证书立即生效。

流程是:

定时任务
  -> certbot renew
  -> nginx -s reload

这样证书到期前会自动刷新,不需要手动盯日期。

7. 安装和调整主题

主题使用 Butterfly 风格主题。部署后做了几件调整:

  • 设置二次元风格头像
  • 设置首页顶图
  • 恢复文章、标签、分类入口
  • 配置备案号链接
  • 修复空文章时主题初始化 views 字段导致首页 500 的问题

这个主题有些配置项是存到数据库里的,例如头像、首页图和侧栏入口链接。以后在后台改主题配置时,要注意不要把这些链接清成 #null

8. 后台内容管理

Typecho 的好处就是后台简单。常用入口:

  • 写文章:后台 -> 撰写 -> 撰写文章
  • 管理文章:后台 -> 管理 -> 文章
  • 管理标签:后台 -> 管理 -> 标签
  • 管理分类:后台 -> 管理 -> 分类
  • 修改主题:后台 -> 控制台 -> 外观

后续写文章不需要重新部署。登录后台写完发布即可。

9. 这次踩到的问题

这次部署里遇到过几个典型问题:

  1. HTTPS 证书配置好了,但外网打不开:最后确认是云服务器安全组 443 入方向没放行。
  2. Typecho 站点地址还是 HTTP:需要把 siteUrl 改成 https://blog.sjhibqi.cn/
  3. 主题配置被写坏后首页 500:Butterfly 配置需要保持主题能识别的格式。
  4. 文章删空后首页 500:主题用第一篇文章判断字段,空表时会报错,已改成检查表结构。

10. 后续计划

这个博客后面可以继续优化:

  • 增加文章封面上传规范
  • 做一个更统一的二次元视觉风格
  • 加常用代码块样式和目录
  • 增加备份脚本,把数据库和上传目录定期备份
  • 给后台入口加更严格的访问限制

目前最重要的是:博客已经可以在线写、在线管理、域名 HTTPS 访问,并且内容数据独立持久化。