分类

技术笔记

通配符证书和 acme.sh:我如何解决多域名证书管理

这是「把自己部署到互联网上」系列的第 28 篇。

上一篇写了单域名 SSL 证书从申请、下载到部署的完整流程。

从申请证书,完成域名验证,下载证书和私钥,放到全局 Nginx 的证书目录,配置 443,检查 Nginx,重载服务,最后验证 HTTPS。

这条链路适合把 HTTPS 跑通,对整个流程有个完整的理解。

接下来,又会遇到一个问题,

假如我有多个子域名,我该如何处理呢,难道说,也是一个一个的申请?

多个子域名应如何处理?

业务发展需要,会产生多个服务,比如 blog.aicultiv.com、www.aicultiv.com、api.aicultiv.com、admin.aicu...

为什么个人博客也需要对象存储?

这是「把自己部署到互联网上」系列的第 29 篇。

前面几篇把 HTTPS 这段基本走完了:

  1. 先讲为什么个人网站需要 HTTPS
  2. 再写 SSL 证书申请、下载和部署
  3. 最后用通配符证书和 acme.sh 解决多域名证书管理。

到这里,个人博客的访问入口已经比较完整:

服务器、域名、备案、安全边界、部署架构、全局 Nginx 和 HTTPS 都有了基本方案。

一个不起眼的问题

接下来要处理一个容易被忽略的问题:图片、附件和静态资源应该放在哪里?

最简单、粗暴的做法是放在服务器本地。

博客项目本身也有上传目录,图片传到上传目录里,文章直接引用本地资源。

这很简单直接,运行没问题。但项目要...

对象存储桶策略、JSON 配置和域名访问控制实战

这是「把自己部署到互联网上」系列的第 30 篇。

上一篇讲了为什么个人博客也需要对象存储。

图片、附件、项目截图和静态资源会随着文章不断增长,如果全部放在服务器本地,后面会遇到磁盘膨胀、迁移麻烦、备份边界不清晰和带宽压力等问题。

但对象存储真正有坑的地方,是文件权限到底该怎么开?

  1. 图片既要能被文章访问,也要不能被别人随便访问
  2. 图片等相关资源能通过自己的域名访问,但又不希望任何地方都无限制引用
  3. 桶策略、JSON 配置、访问域名、防盗链、CORS 混在一起,很容易出错

我刚开始使用对象存储时,就把它当成云端文件夹:

创建桶,上传图片,复制链接,放进文章里,图片能打开,好像就结束了。

应该...

我是如何用 Docker 部署个人博客的

这是「把自己部署到互联网上」系列的第 31 篇。

前面已经处理了服务器、域名、备案、安全边界、Docker 选型、全局 Nginx、HTTPS 和对象存储。

到这一篇,能想到的处理步骤已经都处理了,大家还有更好的见解,欢迎评论区友好交流一下。

进入主线动作:用 Docker 容器部署个人博客。

部署思路

这篇不是传统意义上的教程,而是按我的部署思路,把博客从

代码目录、环境变量、数据库、Docker Compose、启动检查,到接入全局 Nginx

的流程串起来。

具体命令要按项目调整,重点是理解一个博客项目要稳定运行,哪些东西必须放到可维护的位置。

部署过程

这一篇的目标是:把个人博...

博客部署后,我遇到的数据库、迁移和管理员初始化问题

这是「把自己部署到互联网上」系列的第 32 篇。

上一篇,把个人博客通过 Docker 部署起来了:

  • 项目目录有了,代码拉下来了

  • .env 配好了

  • Dockerfile 和 Compose 文件也整理了
  • 应用容器和数据库容器跑起来
  • 全局 Nginx 能转发请求
  • 域名和 HTTPS 也开始接入

到这一步,博客已经算基本部署成功。

但接着做下来我发现:容器跑起来,不等于博客真的可用,这篇文章主要记录下使用过程中踩到坑的问题,供大家参考下,避免再次踩坑。

遇到的问题

问题1 数据库容器正常运行,但应用连不上

查看容器日志,日志里可能会出现 connection refused、ac...

从 HTTPS 到对象存储,我的博客终于有了上线条件

这是「把自己部署到互联网上」系列的第 33 篇。

从第 26 篇到第 32 篇,我把个人博客上线前很关键的一段走完了。

这一段主要解决三个问题:

  1. 网站如何可信访问
  2. 资源如何长期承载
  3. 博客如何真正跑起来

可信访问这条线包括 HTTPS、SSL 证书、通配符证书和 acme.sh

资源承载这条线包括对象存储、桶策略、JSON 配置和域名访问控制

博客运行这条线包括 Docker 部署、数据库连接、迁移和管理员初始化

写到这里,我的博客开始具备上线条件了。注意,是具备上线条件,后续还要持续完善。

具备上线条件,意味着核心链路已经打通:能访问,能通过 HTTPS 访问,能运行,能存数据,...

Navicat 如何连接 Docker 里的数据库?

这是「把自己部署到互联网上」系列的第 34 篇。

上一篇复盘了从 HTTPS 到对象存储,再到 Docker 部署和数据库初始化。博客具备上线条件后,很快会遇到一个实际维护问题:我想用 Navicat 看一下 Docker 里的数据库,应该怎么连?

这个需求很常见。比如确认表是否创建成功,检查迁移有没有执行,看管理员账号是否初始化,排查某条数据为什么没写进去,导出部分数据,或者临时执行一条 SQL。Navicat、DataGrip、DBeaver 这类工具确实方便。

但前提必须明确:不要为了让数据库工具连上,就直接把数据库端口暴露到公网。

MySQL 服务在哪儿?

先看 Docker 里...

个人博客上线后,我又处理了防爬、静态资源和发文问题

这是「把自己部署到互联网上」系列的第 35 篇。

上一篇写了 Navicat 如何连接 Docker 里的数据库。

那是博客上线后的维护问题:数据库不能直接暴露公网,但我又需要安全、方便地查看和排查数据。

到这里,博客已经不只是“部署起来”,而是进入上线后的真实使用阶段。

部署前与上线后的心理变化

部署前,我主要关心容器能不能启动,Nginx 能不能代理,HTTPS 能不能访问,数据库能不能连接,管理员能不能创建。

真正上线后,问题变得更加具体:

  • 访问日志出现异常请求
  • 爬虫和扫描开始访问博客
  • 静态资源加载失败
  • 对象存储图片路径要调整
  • HTTPS 下出现混合内容
  • 后台发文流程也没有想象中...

个人博客上线后,我踩过的几个真实坑

这是「把自己部署到互联网上」系列的第 36 篇。

从第 31 篇开始,我进入了个人博客真正部署和上线的阶段:用 Docker 部署博客,处理数据库、迁移和管理员初始化,复盘 HTTPS 到对象存储,解决 Navicat 连接 Docker 数据库,又处理了防爬、静态资源和发文问题。

到这里,个人博客这一段可以做一次完整复盘。真正做完后,我确定一件事:博客上线,不是一个单点成功,而是一整条链路跑通。

服务器、Docker、数据库、Nginx、HTTPS、对象存储、后台、发文流程,任何一环没处理好,都会影响最终体验。

踩过的坑

坑1. 容器状态 running,博客不可用

看到 docker...

博客上线之后,我发现它还不是个人品牌

这是「把自己部署到互联网上」系列的第 37 篇。

前面很长一段,我终于把博客从想法推进到了上线:服务器、域名、备案、安全边界、Docker、全局 Nginx、HTTPS、对象存储、数据库迁移、管理员初始化、静态资源和发文流程,都踩过一轮坑。

到这里,按理说可以松一口气。博客(楸木笔记)终于上线了,开心。

但真正打开发布了几篇文章之后,我又有了一个新判断:博客有了,但它还不等于个人品牌,简单说,单一个博客无法支撑起个人品牌。

这个想法有点意思了。因为我前面一直说,博客是程序员个人品牌的基础设施。

现在博客搭起来了,为什么又说它还不是个人品牌?

当第一次通过自己的域名打开博客页面时,很有成就...

发现更多