如何搭建一个个人网站-零:前期准备工作

技术 暂无评论

因为一时兴起,想要自己搭建一个博客,但在动手过程中,遇到了不少问题。于是改为先用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。两者差别主要集中在「证书」这件事上:

维度CaddyNginx
HTTPS 证书自动申请、自动续期,零配置需手动配 certbot 或自己管理证书
配置复杂度Caddyfile 几行搞定server / location / upstream 结构更繁琐
性能个人站绰绰有余极致,久经考验
生态 / 资料较小巨大,教程遍地
内存占用约 50MB几 MB 起,同样很轻

对我来说,决定性因素是第一条:Caddy 的自动 HTTPS。Nginx 上 HTTPS 要额外装 certbot、配定时续期,比较麻烦;而Caddy 则是开箱即用——第一次访问自动申请证书,到期自动续期,全程不用管。

Nginx 的极致性能和庞大生态,在「单博客、日访问量个位数」的场景下用不上;而 Caddy 省下的证书维护成本,是每天都能感受到的。所以选 Caddy。

(顺带一提 Traefik:它更适合大规模容器编排,个人博客用它偏重了。)

1.3 为什么是 Typecho

博客引擎选型,横向对比三家常客:

维度TypechoWordPressHalo
资源占用极低(约 50~150MB)中高中(Java,内存偏高)
数据库SQLite 可选,免装需 MySQL需 MySQL/PostgreSQL
上手复杂度简单插件生态大但重中等
Markdown原生支持插件实现原生支持

选 Typecho 的决定性理由是:PHP + SQLite,一个容器跑完。不用额外起数据库,不用配连接,资源占用低到可以忽略。对资源有限的小服务器以及精力有限的个人来说比较方便。

1.4 镜像选型:手动部署,而不是第三方成品镜像

Typecho 社区虽然有成品镜像 joyqi/typecho,但我并没有选择,原因如下:

  1. 国内 Docker Hub 镜像站经常对第三方镜像返回 403,拉取失败;
  2. 成品镜像的内部端口不透明,排查问题费劲。

我选择改用 php:8.2-apache 官方镜像,进容器手动下载 Typecho 解压。透明、可控、不依赖第三方镜像的可用性。具体步骤在下一篇

1.5 为什么单服务还要留一层 Caddy

博客只有一个服务,严格说可以不用 Caddy,让 Typecho 直接暴露 443。但我仍然保留 Caddy,三个理由:

  1. 自动 HTTPS:Caddy 自动申请、续期 Let's Encrypt 证书,不用碰 certbot;
  2. 缩小攻击面:Typecho 容器不需要对外暴露任何端口,只通过内部网络被 Caddy 访问;
  3. 架构弹性:将来想加书库、代码仓库之类的服务,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 ufw

2.4 安装 Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

docker --version
docker compose version

get.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

端口规划最好一开始就想清楚,避免反复改:

端口用途状态
22SSH 管理始终保留
9000Typecho 搭建阶段临时访问上线后关闭
80/443Caddy 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 备案是两套独立程序。先记住有这么一回事,具体操作在第三篇细讲。

暂无评论

发表评论