Wei Wang — 

miuOps:裸机 Docker 基础设施的 GitOps 实践

中小型开发团队正面临一种普遍的架构冗余。即便业务逻辑尚未验证,开发者也倾向于引入 etcd、apiserver 和复杂的 CNI 插件。这种对 Kubernetes 的过度迷信显著抬高了运维门槛,etcd 等核心组件在小规模集群中占据了过高的资源配比,并在无形中增加了系统的故障隐患。

miuOps 提供了一套扁平的基础设施管理方案。它利用 Docker Compose 的成熟度,配合 Ansible 的自动化能力,在单台裸机服务器上构建生产级环境。

设计路径与生命周期

在初始化阶段,miuOps 通过 Ansible 完成防火墙策略、Docker 引擎、Traefik 网关以及 Cloudflare Tunnel 的原子化配置。环境就绪后,基础设施层即进入静默状态。

User ──> Cloudflare ──(Tunnel)──> [cloudflared]
                                       ▼ (127.0.0.1:443)
[Firewall: DROP INPUT]             [Traefik]
                                   /       \
                             [Stack A]   [Stack B]

后续的应用部署完全由 GitOps 逻辑驱动。GitHub Actions 监听代码仓库变动,通过 SSH 和 rsync 协议将配置文件同步至目标服务器,直接调用 docker compose 指令更新容器。由于取消了常驻 Agent 和中心化的控制平面,系统不存在额外的性能损耗或组件崩溃风险,维护成本被压低到了协议层。

零暴露与多维隔离

安全性建立在多重隔离机制之上。miuOps 强制所有入站流量通过 Cloudflare Tunnel 传输。服务器物理机无需在公网环境下开放 80 或 443 端口,iptables 默认策略被严格设定为全量拦截。

容器网络层面采用三层物理隔离模型。每个应用栈拥有独立的 Ingress 网络,通过配置 Docker 禁用容器间通信,有效阻断了潜在的横向移动攻击。后端服务被封锁在 Internal 网络中,剥夺了其访问外网及被跨栈嗅探的权限。CI 系统在部署前会自动扫描网络配置,确保隔离逻辑的完整性。

[ Traefik ] 
     ├──(Ingress A)──> [Web A] ──(Internal)──> [DB A]
     └──(Ingress B)──> [Web B] ──(Internal)──> [DB B]
             ^
        (NO CROSS-TALK)

数据持久化与不可变备份

针对 PostgreSQL 等核心组件,miuOps 集成了 WAL-G 方案。它通过连续归档与定期全量备份,支持分钟级的时间点恢复。

备份文件在写入 S3 存储桶时,强制开启 Object Lock (Governance Mode)。在预设的 30 天保留期内,任何凭证都无法对已存在的备份执行删除操作。这种物理级别的锁定机制为灾难恢复提供了最后一道底线,确保数据在遭受极端攻击时依然保持完整。

垂直扩展的经济性

摩尔定律提供的硬件红利往往被低效的软件抽象所抵消。在现代硬件上,即便考虑到 Cloudflare Tunnel 加密与 Docker 网络的开销,单核 CPU 的接入层吞吐量依然远超绝大多数业务逻辑的计算能力。这使得反向代理成为整个链路中资源消耗最低的环节之一。

37signals 的实践证明,回归裸机并坚持垂直扩展可以显著降低运营成本。我们明确接受了单机环境在极致高可用性上的局限。通过将可用性目标从 99.99% 调整至 99.9%,miuOps 换取了 90% 的复杂度降级。在发生硬件故障时,利用一键引导工具和 S3 的不可变备份,可以在短时间内完成基础设施的整机重建。

实施路径

服务器环境的初始化通过引导脚本一键完成。开发者可以基于 miuOps 提供的应用模板构建私有仓库,所有的部署操作都通过 git push 触发自动化流水线。

目前该项目处于早期阶段,欢迎构建者尝试。代码与文档托管于 GitHub:

ZH / EN