四个站挤进一台小机器的选型
机器大概是 1 vCPU、961MB 内存、不到 20GB 磁盘。要同时挂门户、网盘、Git、博客。先定能常驻什么,再定每个站用哪类软件。分站怎么做见后面四篇,这篇只写为什么是这个组合。
预算从内存倒推
空闲时要留下系统、反向代理,以及网盘和 Git 两个常驻进程。实测大约:Git 一百多兆、网盘一百兆上下、反向代理几十兆。剩下可用内存经常不到 500MB,偶发已经在用交换分区。再加一个常驻解释器或数据库,页面会开始换页。
所以有三条硬约束:
- 访问路径上不跑 Node / PHP / Java。 它们只允许出现在「构建那一两分钟」。
- 不引入第二套数据库服务。 Git 用 SQLite 文件;网盘用自己的库;门户和博客没有库。
- 不容器化。 Docker 自己就要一块常驻内存和一层镜像盘,这台机付不起。
四个主机名共用一张 Let’s Encrypt 证书(apex、www、disk、git、blog)。80 只做证书校验和跳到 HTTPS。对外的 HTTPS 由一层反向代理按 Host 切开:www 和 blog 读目录,git 和 disk 转到 127.0.0.1 上的进程。应用进程不绑公网网卡。根域名 308 到网盘,避免 apex 再占一份内容。
四个站各选什么、不选什么
门户要的是「打开就能看」,不是用户系统。Next.js / Nuxt 的 Node 服务、带后台的 CMS 都不上。React 加 Vite 打成静态包就够。新闻如果编进 JS,每次改条目都要重编整站,所以脉冲是另一份 JSON:定时任务拉公开 RSS,模型只做归类去重,写完文件就退出。页面加载拉一次,不轮询。模型放空闲价时段,高峰直接跳过,省的是钱也是 CPU。
网盘对照过 Nextcloud:PHP、数据库、定时任务,1GB 上不该作为常驻。对象存储要另付流量和密钥,个人几 GB 文件不值得。AList 一个二进制、本地磁盘驱动、账号和二次验证在应用内,反向代理只做 TLS。缩略图用 ffmpeg 但并发锁到 2,避免单核被预览打满。
Git对照过三档。裸仓库最轻,没有网页。GitLab 社区版现在单机基线是数 GB 内存加 Postgres、Redis、后台队列,这台机装上会先交换再 OOM。Forgejo 单二进制加 SQLite,关掉 Actions、包仓库、公开注册,网页登录才可见。SSH 复用系统 22,不再为 Git 开第二个 SSH 口。大文件走网盘,不进 Git LFS。
博客对照过 Ghost、WordPress、Halo:都要常驻运行时和库,和 Git 抢内存。静态生成(Astro 输出 HTML)访问成本接近零。公开阅读没有门禁;写作走口令后面的一次构建,构建结束 Node 就退出。不接评论、不接投稿,省掉一整类存储和反垃圾。
反向代理为什么是 Caddy
机器上已经有 Caddy:网盘 PDF 预览需要同域静态文件,当时就用它反代 AList。继续用同一份配置按 Host 分四个站,比再装 Nginx、再维护一套证书钩子更省。自动 HTTPS 关掉,证书放到固定路径给 Caddy 用,免得签发和站点配置各管一套。配置必须整份一起维护:只更新门户、漏掉博客 Host,博客会在下次发布时消失。
常驻 vs 短时
常驻:反向代理、AList、Forgejo,外加一个几乎空闲的博客写作小服务(只听回环)。短时:门户和博客构建时的 Node、每天一轮的新闻聚合、偶尔一次的证书续期。
不上的清单可以记成:Docker、GitLab、Nextcloud、WordPress / Ghost / Halo、独立 CI Runner、对象存储网关、第二套 SSH。不是功能不够好,是这台机的内存账算不平。