这是「把自己部署到互联网上」系列的第 36 篇。
从第 31 篇开始,我进入了个人博客真正部署和上线的阶段:用 Docker 部署博客,处理数据库、迁移和管理员初始化,复盘 HTTPS 到对象存储,解决 Navicat 连接 Docker 数据库,又处理了防爬、静态资源和发文问题。
到这里,个人博客这一段可以做一次完整复盘。真正做完后,我确定一件事:博客上线,不是一个单点成功,而是一整条链路跑通。
服务器、Docker、数据库、Nginx、HTTPS、对象存储、后台、发文流程,任何一环没处理好,都会影响最终体验。
踩过的坑
坑1. 容器状态 running,博客不可用
看到 docker compose ps 里应用、数据库、Nginx 都在 running,很容易以为部署完成了。
但博客不是静态页面,它需要数据库、迁移、管理员、后台、静态资源、上传和发文流程。
容器运行,只说明服务进程启动了,不代表业务链路可用。
真正要检查的是:应用是否能连数据库,表结构是否初始化,迁移是否执行,管理员是否创建,后台是否能登录,文章是否能发布,数据是否能保存,页面资源是否正常加载。
对博客来说,核心动作是登录后台、写文章、上传图片、发布文章、前台正常访问。
坑2. Docker 里的 localhost 不是我以为的 localhost。
传统方式部署项目,应用连数据库可能写:
DB_HOST=localhost
但在 Docker 容器里,localhost 指当前容器自己。
如果应用容器里写 localhost,它会尝试连接应用容器内部,而不是数据库容器。
正确方式通常是写 Compose 里的数据库服务名:
DB_HOST=db
这个坑很小,但很容易卡住。
数据库容器明明在运行,应用却一直连接失败。如果不理解 Docker 网络,就会绕到密码、端口、防火墙、数据库版本上去排查。
坑3. 数据库初始化变量不是每次都生效。
MySQL 镜像里的 MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD 通常只在数据目录为空时用于初始化数据库和用户。
如果数据卷已经存在,后面修改 .env,不一定会重新创建数据库或修改密码。
所以你可能会遇到:明明改了 .env,数据库还是旧密码。
原因是数据库已经初始化过,volume 里已经有数据。
测试阶段可以删 volume 重来,但一旦有真实数据,就不能随便删。数据库数据不是配置缓存,它在任何项目里都属于核心资产。
坑4. 数据库迁移和初始化不能混在一起
项目通常有迁移命令和初始化命令。
迁移命令用于创建表、修改表结构、同步 schema;
初始化命令可能用于创建默认管理员、初始化站点配置、导入默认数据。
第一次部署时,两类命令可能都要执行。但后续升级时,迁移命令可能仍然需要执行,初始化命令却可能只适合第一次执行。
重复执行初始化脚本,可能导致重复数据、覆盖配置、重置管理员。
坑5. 是数据库不能为了方便直接暴露公网
部署成功后,确实需要用 Navicat 查看表结构、确认数据写入、排查后台问题。
但如果为了方便直接把数据库端口暴露到公网,就违背了前面安全阶段的原则。
数据库端口不是普通访问入口,不应该对全网开放。我更倾向的方式是:数据库端口只绑定服务器本机地址,本地通过 SSH 隧道连接;简单查询时直接进入数据库容器操作。
这个坑本质上是便利和安全之间的取舍,个人项目里很多风险都是“先方便一下”留下的。
坑6. 是静态资源问题比想象中多
博客上线后,页面能打开,但 CSS 可能没加载,后台样式可能不对,图片可能 404,上传图片可能无法显示,对象存储权限可能不对,HTTPS 页面可能引用了 HTTP 图片,出现 Mixed Content。
排查静态资源时,浏览器开发者工具的 Network 面板通常最有效。它能直接看到哪个资源失败、状态码是多少、请求 URL 是什么、是不是跨域、是不是混合内容、是不是 403 权限问题。静态资源问题说明,博客上线不只是后端服务跑起来,前台展示、后台样式、文章图片、对象存储路径都属于上线体验。
坑7. 对象存储不能随便当图床
对象存储解决资源承载,但也带来权限问题。
公开图片可以公开读,私有文件不能误公开;
桶策略要控制范围;
资源路径要规范;
自定义域名要配置 HTTPS;
防盗链和 CORS 不能无脑全开。
一开始很容易把对象存储当成云端文件夹。上传成功,图片能打开,就觉得完成了。
但长期看,资源路径和权限策略很重要。文章图片路径混乱,以后很难整理;公开桶里误传私密文件,会有风险;对象存储域名不稳定,未来迁移会影响历史文章图片。
坑8. HTTPS 不只是证书能用
HTTPS 配好了,还要考虑证书过期、证书路径、Nginx reload、HTTP 跳转 HTTPS、资源也要走 HTTPS。
如果后面有多个子域名,证书管理会更复杂。
这也是我从手动证书继续研究通配符证书和 acme.sh 的原因。
HTTPS 不是配一次证书就结束,它是一套长期维护机制:申请、安装、续期、reload、资源协议统一。
坑9. 是发文流程不顺会影响持续更新。
博客上线后,真正发文章时,发现后台发文有些地方不舒服,需要进行自行改造。
Markdown 支持、代码块展示、图片上传、封面图、分类标签、文章 URL、公众号和博客同步
收获
这一阶段最大的收获,不仅仅是学会许多命令,而是对整个链路有了更深刻的理解。
这条链路包括服务器安全、部署方式、Nginx 入口、HTTPS、对象存储、数据库初始化、管理员后台、静态资源、发文流程和日志排查。
写到这里,我的博客(楸木笔记)终于跑起来了。它可以承载文章,可以通过域名访问,可以使用 HTTPS,可以保存数据,可以上传资源,可以进入后台发文。
博客上线在我的规划中,不是个人品牌完成,只是迈出了第一步。
博客解决的是内容沉淀问题。它能让我持续写技术文章、部署日志、项目复盘、踩坑记录。但如果一个人第一次访问我的网站,他可能还需要更快知道:我是谁,在做什么,擅长什么,有哪些代表项目,写过哪些高质量内容,如何联系我。
这些问题,单靠博客很难一下子描述清楚。所以接下来,我会从个人博客走向个人官网,把博客从内容阵地进一步升级成个人品牌入口。
下一篇进入新阶段:个人博客上线之后,我发现它还不是个人品牌。因为博客解决了内容沉淀,但还没有完全解决个人展示、作品表达和快速建立信任的问题。
本文由 楸木 原创,转载请注明出处。
这篇文章暂未开放评论。