🚀 SWAG:将彻底革新您的 homelab 的 Reverse Proxy Docker!
Source: Dev.to
那么 SWAG 到底是什么?
SWAG 是一个基于 nginx 的一体化反向代理,能够自动管理 Let’s Encrypt SSL 证书。简而言之,它就是你的数字门卫,能够:
- 🔒 自动使用 SSL 证书为你的服务加密
- 🌐 在干净的子域名上公开 Docker 服务
- 🛡️ 通过集中式认证保护你的应用
- 📋 用简洁的配置完成以上所有工作
为什么选择 SWAG 而不是别的方案?
在使用 SWAG 之前,我一直在用普通的 nginx 加 certbot……真是麻烦!证书续期经常出错、nginx 配置需要手动维护、域名管理也很头疼。SWAG 一次性解决了这些问题:
- 自动通配符证书
- 为流行服务预置的配置
- 与 Docker 原生集成
- 支持多种认证方式(Authelia、OAuth 等)
我们的目标架构
在你的运营商处的配置(以 Free 为例)
- 登录 Freebox 管理界面:
- Freebox 参数 → 端口管理
- 创建端口转发:
| 外部端口 | 内部端口 | 目标 IP | 协议 |
|---|---|---|---|
| 443 (HTTPS) | 443 | 192.168.1.100(示例) | TCP |
| 80 (HTTP) | 80 | 192.168.1.100 | TCP |
💡 安全小贴士:不要直接暴露 80/443 端口,可以使用自定义端口(例如 8443)并进行转发。
DuckDNS 配置
- 在 DuckDNS 注册账号
- 创建你的域名:
monhomelab.duckdns.org - 记录下你的 token(后面会在 Docker 中使用)
其他 DNS 提供商
| 免费 | 收费 |
|---|---|
| DuckDNS | Cloudflare |
| FreeDNS | OVH |
| No‑IP | Gandi |
| Route53 | |
| DigitalOcean | |
| Namecheap |
Cloudflare 示例配置:
environment:
- URL=mondomaine.com
- VALIDATION=dns
- DNSPLUGIN=cloudflare
- EMAIL=votre-email@example.com
- CLOUDFLARETOKEN=votre-api-token-cloudflare
公网 IP 检查
# 检查你的公网 IP
curl ifconfig.me
# 检查 DuckDNS 是否指向该 IP
nslookup monhomelab.duckdns.org
如果两者 IP 一致,说明配置正确 🎯
连通性测试
# 在本地服务器启动一个简易的 Web 服务
python3 -m http.server 8080
# 从外部使用域名进行访问测试
curl http://monhomelab.duckdns.org:8080
如果能够正常返回,则可以继续部署 SWAG!
使用 Docker Compose 安装
环境变量准备
version: "3.8"
networks:
web-proxy:
external: false
services:
swag:
image: lscr.io/linuxserver/swag:latest
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- URL=monhomelab.duckdns.org # 你的 DuckDNS 域名
- VALIDATION=duckdns # 使用 DuckDNS 进行验证
- DUCKDNSTOKEN=12345678-1234-1234-1234-123456789012 # 你的 DuckDNS token
- SUBDOMAINS=wildcard # 生成 *.monhomelab.duckdns.org 通配符证书
- EMAIL=votre-email@example.com
- ONLY_SUBDOMAINS=false # 让主域名也能正常工作
volumes:
- ./swag/data:/config
ports:
- "80:80" # HTTP(会重定向到 HTTPS)
- "443:443" # HTTPS(你的服务将通过此端口安全访问)
networks:
- web-proxy
restart: unless-stopped
关键变量说明
URL:完整域名(DuckDNS、Cloudflare 等)VALIDATION:根据 DNS 提供商选择的验证方式SUBDOMAINS=wildcard:为所有子域名生成证书DUCKDNSTOKEN:DNS 提供商的 token/API keyONLY_SUBDOMAINS=false:同时支持根域名访问
启动 SWAG
docker-compose up -d swag
docker logs swag # 你应该能看到 “Server ready” 与 “Certificate renewal successful”
创建的目录结构
swag/data/
├── nginx/
│ ├── nginx.conf
│ ├── site-confs/
│ └── proxy-confs/ # ← 各服务的代理配置
├── keys/
│ └── letsencrypt/ # ← SSL 证书存放位置
└── log/
添加我们的第一个服务
服务 1 :Home Assistant
在同一个 docker‑compose.yml 中加入以下内容:
homeassistant:
image: homeassistant/home-assistant:stable
container_name: homeassistant
environment:
- TZ=Europe/Paris
volumes:
- ./homeassistant/data:/config
networks:
- web-proxy
ports:
- "8123:8123" # 可选,供本地直接访问
restart: unless-stopped
在 SWAG 中配置代理
在 swag/data/nginx/proxy-confs/ 目录下创建文件 homeassistant.subdomain.conf:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name homeassistant.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app homeassistant;
set $upstream_port 8123;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
# 支持 WebSocket(Home Assistant 必需)
location /api/websocket {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app homeassistant;
set $upstream_port 8123;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
配置测试
# 确认容器已启动
docker ps | grep homeassistant
# 从外部访问测试
curl -k https://homeassistant.monhomelab.duckdns.org
如果返回 Home Assistant 的登录页面,说明配置成功。
网络故障排查
专用 Docker 网络
确保所有服务(SWAG、Home Assistant 等)都在同一个 Docker 网络 web-proxy 中。这样代理才能通过容器名称(homeassistant、swag 等)直接访问,而无需在外部暴露端口。
日志管理
docker logs swag # 反向代理日志
docker logs homeassistant
SWAG 的日志同样会写入 swag/data/log/ 目录。
配置检查
- 确认证书已生成:
ls swag/data/keys/letsencrypt/live/monhomelab.duckdns.org/ - 测试 HTTP → HTTPS 重定向:
curl -I http://monhomelab.duckdns.org
通配符证书
SWAG 会自动为 *.monhomelab.duckdns.org 生成通配符证书,无需为每个子域单独申请。
使用 Authelia 加固(可选)
可以将 Authelia 作为身份验证中间件加入:
authelia:
image: authelia/authelia
container_name: authelia
environment:
- TZ=Europe/Paris
volumes:
- ./authelia/config:/config
networks:
- web-proxy
restart: unless-stopped
随后在对应服务的代理配置中加入:
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
auth_request /authelia;
auth_request_set $user $upstream_http_remote_user;
proxy_set_header Remote-User $user;
# …
}
详细配置请参考 Authelia 官方文档。
最终效果
- 唯一入口
https://monhomelab.duckdns.org,通过子域名分发到各个服务 - SSL 证书自动续期
- 日志与 Docker 网络统一管理
常见调试表
| 问题 | 检查项 | 解决方案 |
|---|---|---|
| 证书未生成 | docker logs swag | 检查 DuckDNS token 与网络连通性 |
| 443 端口被阻断 | nc -zv your-ip 443 | 确认运营商盒子上的端口转发 |
| 服务不可访问 | curl -I https://homeassistant.monhomelab.duckdns.org | 确认容器在同一 Docker 网络 |
| DNS 未指向正确 IP | nslookup monhomelab.duckdns.org | 更新 DuckDNS 或其他 DNS 提供商的记录 |
结论
SWAG 极大简化了在 homelab 中部署带 SSL 的反向代理。结合 Docker、DuckDNS(或其他 DNS)以及预置配置,你可以省时、省力并提升安全性与灵活性。
延伸阅读
- SWAG 官方文档
- 支持的 DNS 提供商完整列表
- Authelia 教程
- 完整示例栈(Traefik、Portainer 等)