用 Incus OS 搭一套自托管基础设施:默认拒绝网络、没有 SSH
来源:dataswamp.org — 2026-10-15
📋 概述
Solène 用七个月的业余时间重建了家里的自托管环境,思路借自 SecNumCloud 与 ISO 27001 那套做法。硬件只是一台 16GB 内存的笔记本,跑 Incus OS——一个只有 Incus 的小型不可变系统,Secure Boot 开启、A/B 分区更新可回滚、没有本地 shell 与 SSH、磁盘由 TPM 加密。其上约二十个 Ubuntu 系统容器对应各一项服务(Nextcloud、Forgejo、Immich、PeerTube、Vaultwarden、监控栈、CrowdSec 等),敏感部分用两台虚拟机;每个系统容器内部再跑 podman 容器,由 systemd quadlet 管理,形成两层容器。全部由 git 仓库里的 OpenTofu 与 cloud-init 声明,系统容器是非特权容器。网络默认双向拒绝,出站走代理,公网流量经反向代理,其余服务只从 VPN 访问。作者列出的难点包括:sops 不在目标发行版打包里、Incus ACL 双向放行的心智负担、OpenTofu 的启动顺序依赖、CrowdSec 配置、以及 NAT 与容器叠加下取真实来源 IP(最终靠 haproxy 与 PROXY 协议解决)。
🔑 核心要点
- 底层是 Incus OS:只运行 Incus 的不可变系统,Secure Boot、A/B 更新可回滚、无本地 shell 与 SSH、磁盘由 TPM 加密
- 两层容器结构:约二十个 Ubuntu 非特权系统容器跑服务,容器内部再由 systemd quadlet 管理 podman 容器
- 全部声明式:没有任何手工配置,一切由 git 仓库里的 OpenTofu 与 cloud-init 定义
- 网络默认双向拒绝:出站走代理,公网流量经反向代理,其余服务只从 VPN 访问
- 作者自陈这套配置是单机自托管、对多数人明显过度设计,但换来「不必担心重启后服务起不来」
- 踩过的坑包括 sops 需以 podman 容器解密密钥、Incus ACL 的出入站双放行、OpenTofu 的启动顺序依赖、CrowdSec 难配,以及靠 haproxy 与 PROXY 协议取到 NAT 后的真实来源 IP
💡 金句
这花掉了我七个月的业余时间,但我在容器和 cloud-init 上学到了很多。如果你喜欢可抛弃的系统、默认拒绝的网络、以及完全没有 SSH 这套想法,希望这篇文章给了你一些启发。
👍 0
👎 0
← 返回 Lobsters 首页