因为一时兴起,想要自己搭建一个博客,但在动手过程中,遇到了不少问题。于是改为先用AI根据需求出方案,再一步步实施,中间遇到的新问题也都通过AI来解决。最后结合我遇到的困难,在AI辅助下,写成此文。
本篇主要解决「动手之前的三件事」:定方案、备服务器、备域名,先把后面所有动作的地基打好。
一、方案蓝图与选型
1.1 目标与整体架构
目标:一个跑在自己服务器上的个人博客,通过域名,采用HTTPS加密访问。
最终架构:
用户浏览器 ──HTTPS──▶ Caddy(Docker 反向代理 + 自动 HTTPS 证书)
│
Typecho(PHP + SQLite,博客本体)| 组件 | 职责 |
|---|---|
| Caddy | 反向代理、自动申请和续期 HTTPS 证书 |
| Typecho | 博客本体(PHP + SQLite,无需独立数据库) |
两个组件有一个共同点:都极轻。整套跑在 2 核 2G 的服务器上绰绰有余。
1.2 为什么是 Caddy,而不是 Nginx
反向代理这一层,最主流的选择是 Nginx,但我用了 Caddy。两者差别主要集中在「证书」这件事上:
| 维度 | Caddy | Nginx |
|---|---|---|
| HTTPS 证书 | 自动申请、自动续期,零配置 | 需手动配 certbot 或自己管理证书 |
| 配置复杂度 | Caddyfile 几行搞定 | server / location / upstream 结构更繁琐 |
| 性能 | 个人站绰绰有余 | 极致,久经考验 |
| 生态 / 资料 | 较小 | 巨大,教程遍地 |
| 内存占用 | 约 50MB | 几 MB 起,同样很轻 |
对我来说,决定性因素是第一条:Caddy 的自动 HTTPS。Nginx 上 HTTPS 要额外装 certbot、配定时续期,比较麻烦;而Caddy 则是开箱即用——第一次访问自动申请证书,到期自动续期,全程不用管。
Nginx 的极致性能和庞大生态,在「单博客、日访问量个位数」的场景下用不上;而 Caddy 省下的证书维护成本,是每天都能感受到的。所以选 Caddy。
(顺带一提 Traefik:它更适合大规模容器编排,个人博客用它偏重了。)
1.3 为什么是 Typecho
博客引擎选型,横向对比三家常客:
| 维度 | Typecho | WordPress | Halo |
|---|---|---|---|
| 资源占用 | 极低(约 50~150MB) | 中高 | 中(Java,内存偏高) |
| 数据库 | SQLite 可选,免装 | 需 MySQL | 需 MySQL/PostgreSQL |
| 上手复杂度 | 简单 | 插件生态大但重 | 中等 |
| Markdown | 原生支持 | 插件实现 | 原生支持 |
选 Typecho 的决定性理由是:PHP + SQLite,一个容器跑完。不用额外起数据库,不用配连接,资源占用低到可以忽略。对资源有限的小服务器以及精力有限的个人来说比较方便。
1.4 镜像选型:手动部署,而不是第三方成品镜像
Typecho 社区虽然有成品镜像 joyqi/typecho,但我并没有选择,原因如下:
- 国内 Docker Hub 镜像站经常对第三方镜像返回 403,拉取失败;
- 成品镜像的内部端口不透明,排查问题费劲。
我选择改用 php:8.2-apache 官方镜像,进容器手动下载 Typecho 解压。透明、可控、不依赖第三方镜像的可用性。具体步骤在下一篇。
1.5 为什么单服务还要留一层 Caddy
博客只有一个服务,严格说可以不用 Caddy,让 Typecho 直接暴露 443。但我仍然保留 Caddy,三个理由:
- 自动 HTTPS:Caddy 自动申请、续期 Let's Encrypt 证书,不用碰 certbot;
- 缩小攻击面:Typecho 容器不需要对外暴露任何端口,只通过内部网络被 Caddy 访问;
- 架构弹性:将来想加书库、代码仓库之类的服务,Caddy 加几行就行,不用推倒重来。
单服务时 Caddy 的边际成本极低——一份 Caddyfile + 一个约 50MB 内存的容器——换来的却是自动证书和扩展性,这笔账很划算。
二、准备服务器
2.1 选规格
Typecho 极轻量,2 核 2G 完全够用,4G 更从容。系统选 Ubuntu 22.04 LTS 或 Debian 12,磁盘 40GB 起步。
2.2 连接服务器
ssh root@你的服务器IP三个注意点:
- 首次连接会提示确认主机指纹,输入
yes; - 密码输入时不回显,这是正常现象,不是没反应;
- 建议后续切换到密钥登录(第三篇会讲),更安全也更省事。
2.3 更新系统、装基础工具
apt update && apt upgrade -y
apt install -y curl wget vim git ufw2.4 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
docker --version
docker compose versionget.docker.com 官方脚本会自动装好 Compose 插件(命令是 docker compose,中间没有连字符)。
2.5 配置 Docker 镜像加速(国内服务器必做)
国内服务器直接拉 Docker Hub 会超时或极慢。配置镜像加速:
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://mirror.ccs.tencentyun.com",
"https://dockerproxy.com"
]
}
EOF
systemctl daemon-reload
systemctl restart docker避坑:不配加速会导致docker pull超时(报dial tcp ... i/o timeout)。加速器列表多备几个,单个镜像站可能不稳定。
2.6 配置防火墙
ufw allow 22/tcp
ufw enable
ufw status端口规划最好一开始就想清楚,避免反复改:
| 端口 | 用途 | 状态 |
|---|---|---|
| 22 | SSH 管理 | 始终保留 |
| 9000 | Typecho 搭建阶段临时访问 | 上线后关闭 |
| 80/443 | Caddy HTTP/HTTPS | 上线时开放 |
2.7 目录结构与 Docker 网络
关于路径:下文所有 /xxx 都是占位符,代表你的部署目录。动手前把它统一替换成你实际想用的路径(比如 /srv/blog 或 /data/blog),全文保持一致即可。
mkdir -p /xxx/{caddy,typecho,backups}
docker network create services-network| 目录 | 用途 |
|---|---|
| /xxx/caddy/ | Caddy 配置和证书 |
| /xxx/typecho/ | Typecho 程序和文件 |
| /xxx/backups/ | 备份文件 |
services-network 是 Docker 共享网络,Caddy 和 Typecho 靠它互相通信(用容器名互访),这是后面反向代理能跑通的关键。
三、准备域名
3.1 买域名
注册商可选:
- Namesilo:价格透明,免费 Whois 隐私保护;
- GoDaddy:全球最大,常有优惠;
- 阿里云 / 腾讯云 / 华为云:国内用户方便,但需实名认证和 ICP 备案。
后缀建议 .com / .net / .org。买完尽快提交实名认证(国内注册商)。
3.2 ICP 备案(国内注册商必读)
流程:实名认证 → 提交备案 → 审核(1~20 天)。
这里有个关键认知:备案等待期不是干等,而是「并行推进」的黄金窗口。等备案期间可以先把服务器环境和博客本体搭好(用 http://IP:9000 验证),备案通过后再切域名上线。
等待期安排:
- 下一篇的「部署 Typecho」可以提前做,用 IP 访问验证;
- 搭完先停容器、关临时端口,缩小攻击面,等备案通过再正式上线。
3.3 添加 DNS 解析记录(备案通过后)
备案通过后,到域名注册商的管理后台,添加一条 A 记录把域名指向服务器:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ | 服务器公网 IP |
@ 代表裸域名(example.com)。如果想让 www.example.com 也能访问,再补一条主机记录为 www 的 A 记录即可。
验证生效:
nslookup example.com返回你的服务器 IP 即表示解析生效。解析通常几分钟内完成。
3.4 公安备案预告
网站开通后 30 日内还要做公安联网备案(beian.mps.gov.cn),它和 ICP 备案是两套独立程序。先记住有这么一回事,具体操作在第三篇细讲。
暂无评论