用 docker-compose 统一管理自建服务器全套服务配置
Traefik 作反向代理统一入口,nginx 可横向扩展,各服务独立文件夹由 compose 聚合管理
方案简介
make-my-server 是一套基于 docker-compose 的自建服务器完整配置方案。它将服务器上的各个服务(如 Traefik 反向代理、nginx、Minecraft、Discord MusicBot 等)分别放在独立文件夹中,每个文件夹包含该服务的全部配置,再通过 docker-compose 把所有 docker-compose 文件聚合到一起统一启动与管理。
这个方案解决的问题是:自建服务器往往要跑多个服务,各服务的启动命令、配置文件、数据卷、日志分散各处,难以维护。make-my-server 用统一的目录架构和环境变量(.env 文件)把这些配置收拢,提供了带默认配置的完整模板。
适合想用 Docker 管理自己服务器的个人开发者,或希望以模块化方式增删服务、并通过 lint 与 CI 测试保证配置质量的团队。
亮点与能力
- 一个命令聚合启动全部服务:
SITE=tom.moulard.org docker-compose up -d - 每个服务独立文件夹,包含 conf/data/logs/docker-compose 文件/README,结构统一
- 提供
.env.default默认环境变量模板,一键复制为.env后按需修改 - 支持通过
.env设置多组 Basic Auth 用户凭证 - 支持服务横向扩展,如
docker-compose scale nginx=2 - 本地开发可通过修改
/etc/hosts调试 Traefik - 使用 yamllint 强制检查所有 YAML 文件(PR 强制执行)
- 提供测试脚本
./test.sh校验 compose 文件有效性、可解析性与.env.default一致性,GitHub Action 会自动运行并生成 patch 文件
组成与分工
- docker-compose:核心编排工具,把散落在各服务文件夹中的 compose 文件聚合为一份完整配置统一管理
- Traefik:反向代理服务,
traefik/文件夹包含运行它所需的全部配置,其他服务位于其后 - nginx:可被 scale 扩展的 Web 服务,数据库密码等服务处于反向代理之后
- yamllint:用于 lint 所有 YAML 配置文件,PR 强制执行
- GitHub Action:自动运行测试脚本,并生成
patch.patch帮助修复问题 - Discord MusicBot / Minecraft:由社区贡献者通过 PR 添加的服务示例(见 PR #6)
前置要求
- Docker 与 docker-compose;若 docker compose 版本低于 2.20,需要用自定义 bash 函数聚合配置文件:
bash
docker-compose ()
docker-compose $(find -name 'docker-compose.*.yml' -type f -printf '%p\t%d\n' 2>/dev/null | sort -n -k2 | cut -f 1 | awk '{print "-f "$0}') $@
- 如需运行 lint 测试,需安装 yamllint:
bash
yamllint .
实施步骤
1. 启动整套服务
bash
SITE=tom.moulard.org docker-compose up -d
2. 使用 .env 管理配置
bash
cp .env.default .env
然后编辑 .env 文件填入正确的配置。
3. 设置访问密码
bash
echo "USERS=$(htpasswd -nB $USER)" >> .env
也可在 .env 中添加多组凭证:
env
USERS=toto:pass,tata:pass, ...
4. 新增服务
每个文件夹代表一个可用服务,目录必须遵循以下架构:
service/
├── conf
│ └── ...
├── data
│ └── ...
├── docker-compose.servicename.yml
├── logs
│ ├── access.log
│ └── error.log
└── README.md
其中 data/ 存服务数据,conf/ 存服务配置,logs/ 存 Docker 日志之外的服务日志。欢迎通过 Pull Request 添加新服务。
使用与配置要点
- 启动后可通过
docker-compose config查看聚合后的完整配置 - 关停全部服务:
bash
docker-compose down
- 扩容服务:
bash
docker-compose scale nginx=2
- 本地调试 Traefik 时,编辑
/etc/hosts给反向代理提供正确的 URL,例如添加:
bash
127.0.0.1 traefik.moulard.org
.env.default可用以下命令重新生成:
bash
grep '${' */docker-compose..yml | sed "s/.\${\(.\)}.*/\1/g" | cut -d":" -f 1 | sort -u | sort | xargs -I % echo "%=" >> .env.default
注意事项与常见问题
- 不要忘记修改:数据库密码(可能不需要,因为它们位于反向代理之后)、VPN 密钥(未提供时会自动生成)
- yamllint 与
./test.sh(即 docker-compose config 校验)对所有 PR 强制执行 - 测试失败时会生成一批被修改的文件(如
test_config.yml)指出问题所在 - GitHub Action 会自动运行测试脚本,并生成
patch.patch文件,应能解决大部分问题
优缺点
- ✓ 配置集中一处管理
- ✓ 服务按文件夹模块化组织
- ✕ compose 版本低于2.20需自定义
- ✕ 需自行修改数据库密码与VPN密钥
出处
本方案挖掘自开源项目 tomMoulard/make-my-server,方案内容与实施命令均来自其 README 原文。
本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。