design.md 3.6 KB

Context

本项目需要一套 Ansible 自动化配置,用于在多台服务器上快速部署代理服务(Trojan + Snell)。参考项目 ansible-proxy-chain 使用了 relay/landing 链式架构和单用户配置,但本项目的需求不同:需要在多台服务器上独立部署服务,且 Trojan 需要支持多用户模式。

Snell 是 Surge 开发团队设计的轻量级加密代理协议,仅支持单用户模式。Trojan 则需要在同一端口上支持多个用户同时连接,用户凭证通过外部 YAML 文件管理。

Goals / Non-Goals

Goals:

  • 提供一键式多服务器 Ansible 部署流程
  • 每台服务器部署完成后具备基础安全能力(SSH 加固、防火墙、入侵检测、自动更新)
  • 支持在服务器上部署单用户 Snell 服务
  • 支持在服务器上部署多用户 Trojan 服务,用户通过 users.yml 配置
  • 自动管理 TLS 证书(Let's Encrypt + certbot)

Non-Goals:

  • 不支持 relay/landing 链式代理架构
  • 不自动生成客户端配置文件(如 Surge/Clash 配置)
  • 不提供 Web 管理面板
  • 不支持 Shadowsocks 或其他代理协议

Decisions

使用 trojan-go 作为 Trojan 实现

  • Rationale: trojan-go 是 trojan-gfw 的 Go 语言重写版,性能更好,维护更活跃,原生支持多用户配置(通过 users 数组)
  • Alternatives considered: trojan-gfw(C++ 版,多用户支持较弱,维护停滞)

多用户配置使用独立 YAML 文件

  • Rationale: 将用户凭证从 group_vars 分离到 users.yml,便于单独管理和权限控制(可设置更严格的文件权限),同时保持 Ansible 变量结构的清晰
  • 格式: users.yml 定义 trojan_users 列表,每个用户含 namepassword
  • Alternatives considered: 直接放在 group_vars/all.yml 中(与其他配置混杂,不利于敏感信息隔离)

使用 systemd 管理所有服务

  • Rationale: 现代 Linux 发行版的标准 init 系统,支持自动重启、日志收集、权限控制
  • Implementation: 每个服务创建独立 service unit,使用专用非 root 用户运行,通过 AmbientCapabilities=CAP_NET_BIND_SERVICE 绑定 443 端口

使用 certbot + Let's Encrypt 管理 TLS 证书

  • Rationale: 免费、自动化、广泛支持。通过 deploy-hook 在证书续期后自动复制到服务目录并 reload 服务
  • 自动续期: 依赖 certbot 内置的 systemd timer 或 cron

单 playbook 多 host group 部署

  • Rationale: 使用单一 site.yml 定义所有 plays,通过 inventory host groups 区分不同角色的服务器
  • Structure: all 组运行基础配置,可选的 snell 组和 trojan 组分别部署对应服务

Risks / Trade-offs

  • [Risk] Snell 二进制文件需要从 GitHub Release 下载,国内服务器可能下载失败
    • Mitigation: 支持通过变量配置自定义下载 URL / 代理;playbook 失败时提供清晰错误信息
  • [Risk] Let's Encrypt 证书申请需要域名已正确解析到服务器 IP
    • Mitigation: 在 certbot 任务前增加域名解析检查;提供详细的部署前置条件文档
  • [Risk] 多用户 Trojan 配置变更后需要重载服务
    • Mitigation: 使用 Ansible handler 监听配置模板变化,自动触发服务 reload
  • [Risk] users.yml 包含敏感凭证,可能意外提交到 Git
    • Mitigation: 默认将 users.yml 加入 .gitignore;提供 users.yml.example 模板
  • [Trade-off] Trojan 使用 trojan-go 的 users 数组方式管理多用户,而非数据库后端
    • 这限制了用户数量和管理灵活性,但保持了部署的简单性和无外部依赖的优势