我的自建服务器架构全解析:从一台 VPS 到整套服务
这篇文章记录我当前这台自托管服务器的完整架构,既是给自己留档,也希望能给想上船「自建服务」的朋友一份参考。文中已隐去所有敏感信息(公网 IP、域名、密钥、密码等一律脱敏)。
一、硬件与系统
| 项目 | 配置 |
|---|---|
| 虚拟化 | KVM 云主机(QEMU) |
| CPU | Intel Xeon Platinum 8259CL,4 核 |
| 内存 | 8 GiB |
| 磁盘 | 30 GB(系统盘) |
| 系统 | Debian GNU/Linux 12 (bookworm) |
| 内核 | 6.1.x LTS |
整体是一台标准的中小规格云主机,4 核 8G 的配置足以扛住下面这一整套容器化服务,还有富余跑几个小进程。
二、技术选型的核心思想
整台机器围绕 Docker + Compose 组织。原则只有一句:「一个容器只干一件事,所有状态都落到数据卷」。这样升级、迁移、备份都只需动容器,不动宿主。
- 反向代理:Nginx Proxy Manager(NPM),统一入口、自动签发 SSL 证书。
- 数据库:PostgreSQL(主打)+ MySQL(个别服务)。
- 代码托管:Gitea,自建 Git 服务。
- 对象/文件与文档:自建博客、代码仓库等。
- AI 网关:new-api,统一聚合多家模型 API,供内部和外部调用。
- 邮件:docker-mailserver,完整的收发信栈(Postfix + Dovecot + Rspamd + ClamAV)。
- 游戏服务:MC 的 Paper 服务端 + 一个 Java 进程常驻。
三、网络与反向代理拓扑
公网流量只从 80 / 443 两个端口进入,由 NPM 统一接管,再按域名分发到各个容器:
┌─→ blog.example.top → Halo(博客)
公网 ──▶ NPM (80/443) ──┼─→ git.example.top → Gitea(Git 服务,SSH 走 2222)
└─→ ai.example.top → new-api(AI 网关)
- SSL 证书由 NPM 通过 Let's Encrypt 自动申请与续期,域名共若干个,全走 HTTPS。
- Gitea 的 SSH 端口映射到宿主的
2222,避免和宿主自带的22冲突。 - 邮件相关端口(25/465/587/993/995 等)单独暴露给 mailserver 容器,不经 NPM。
四、容器服务清单
| 服务 | 镜像 | 作用 | 对外端口 |
|---|---|---|---|
| nginx-proxy-manager | jc21/nginx-proxy-manager | 反向代理 + 证书 | 80/443(81 为管理界面) |
| halo | halohub/halo:2 | 博客系统 | 8090 |
| gitea | docker.gitea.com/gitea | 代码托管 | 8088(SSH 2222) |
| postgresql | postgres:18-alpine | 主数据库 | 5432 |
| pgadmin4 | dpage/pgadmin4 | 数据库管理界面 | 8080 |
| mailserver | mailserver/docker-mailserver | 邮件服务 | 25/110/143/465/587/993/995/4190 |
| new-api | calciumion/new-api | AI 模型网关 | 3000 |
| dpanel | dpanel/dpanel:lite | 容器可视化管理 | 8080 |
宿主层面还有几个非容器进程:frps(内网穿透服务端)、MC 服务(paper + Java,监听 25565 和 19132)、一个游戏 Mod 载入器(StardewModdingAPI,用 cpulimit 限流)。
五、数据与存储
- 所有容器的持久化数据都挂在 Docker volume 或 bind mount 里,集中在
/var/lib/docker(当前约 3.5 GB)。 - 系统盘整体已用约 68%,可用空间约 9 GB,属于「够用但需要关注」的水平。
- 数据库跑在 Postgres 上,Halo、Gitea 等都能吃到它的稳定性;MySQL 作为少数服务(如某些怀旧项目)的补充。
六、安全与运维要点
- SSH 只留密钥认证,密码登录关闭,避免暴力破解。
- 公网暴露面最小化:非必要端口不对外,数据库、管理界面默认只对 NPM 内网开放。
- 证书全自动:NPM 负责申请与续期,减少人工维护成本。
- 邮件反垃圾:mailserver 自带 Rspamd(内容过滤)+ ClamAV(病毒扫描)。
- 资源治理:游戏类进程用
cpulimit限流,避免单个进程拖垮整机。 - 备份:Postgres 靠
pg_dump,容器卷靠定时快照,双保险。
七、给想自建的人的建议
- 从 NPM 起步:先拿下反向代理 + SSL,这是所有自建服务的地基。
- 数据库优先 Postgres:生态好、扩展强,一个实例能服务多套应用。
- SSH 是命门:第一时间关密码、只留密钥,改掉默认端口可再加一道保险。
- 监控磁盘和内存:容器多了资源会悄悄吃紧,
df -h和free -h是日常亲爹。 - 一个容器一个职责:宁可多跑几个小容器,也别把一堆功能塞进一个容器。
本文为个人自建记录,所有 IP、域名、账号、密钥等均已脱敏处理。如果你也在折腾自托管,欢迎交流。