podman运行Sing-box+Caddy笔记版本一二
(版本一:不共用 443 端口)Podman 部署 Gateway Pod 并运行 Sing-box + Caddy 服务
1. 创建 Gateway Pod
podman pod create \
--name gateway \
--memory 512m \
--cpus 0.6 \
--publish 80:80 \
--publish 443:443 \
--publish 8443:8443- 限制资源:内存 512MB,CPU 0.6 核
- 预留宿主机内存:至少 256MB 给操作系统
- 暴露端口:80(HTTP)、443(HTTPS)、8443(VLESS)
2. 在 Pod 中运行 Sing-box 容器
podman run -d \
--name singbox \
--pod gateway \
--restart always \
-v /data/singbox/config.json:/etc/sing-box/config.json:Z \
-v /data/singbox/certs:/etc/sing-box/certs:Z \
ghcr.io/sagernet/sing-box:latest \
run -c /etc/sing-box/config.json- 使用
--pod gateway共享 Pod 网络栈 - 挂载配置文件与证书目录
- 自动重启
3. 在 Pod 中运行 Caddy 容器
podman run -d \
--name caddy \
--pod gateway \
--restart always \
-v /data/caddy/Caddyfile:/etc/caddy/Caddyfile:Z \
-v caddy_data:/data \
-v caddy_config:/config \
docker.io/library/caddy:latest- 共享同一 Pod 网络
- 持久化数据卷
caddy_data和caddy_config
4. Sing-box 配置文件(/data/singbox/config.json)
{
"log": {
"level": "info",
"timestamp": true,
"output": "/dev/stdout"
},
"inbounds": [
{
"type": "vless",
"tag": "vless-in",
"listen": "0.0.0.0",
"listen_port": 8443,
"users": [
{
"uuid": "0c980228d60a"
}
],
"tls": {
"enabled": true,
"server_name": "zing.baidaoya.qzz.io",
"certificate_path": "/etc/sing-box/certs/fullchain.pem",
"key_path": "/etc/sing-box/certs/privkey.pem"
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
}
]
}- 监听端口:8443(VLESS + TLS)
- 证书路径:从 Caddy 自动获取的 Let's Encrypt 证书
5. Caddy 配置(/data/caddy/Caddyfile)
zing.baidaoya.qzz.io {
root * /usr/share/caddy
file_server
log {
output file /data/logs/caddy.log
level INFO
}
}- 作为静态文件服务器或反向代理(可根据需要调整)
6. 从 Caddy 容器复制证书到宿主机
mkdir -p /tmp/caddy-certs
podman cp caddy:/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/zing.baidaoya.qzz.io/. /tmp/caddy-certs/
sudo mkdir -p /data/singbox/certs
sudo cp /tmp/caddy-certs/*.crt /data/singbox/certs/fullchain.pem
sudo cp /tmp/caddy-certs/*.key /data/singbox/certs/privkey.pem- 将 Caddy 自动获取的证书复制给 Sing-box 使用
7. 生成 Reality 密钥(可选)
podman run --rm ghcr.io/sagernet/sing-box:latest generate reality-keypair > /tmp/reality-key.txt
PRIVATE_KEY=$(grep PrivateKey /tmp/reality-key.txt | awk '{print $2}')
PUBLIC_KEY=$(grep PublicKey /tmp/reality-key.txt | awk '{print $2}')
echo "PrivateKey: $PRIVATE_KEY"
echo "PublicKey: $PUBLIC_KEY"- 用于 Reality 协议配置(如有需要)
8. 生成 UUID
podman run --rm ghcr.io/sagernet/sing-box:latest generate uuid架构说明
- Pod
gateway:共享网络命名空间,内部容器可通过localhost互相访问 - Caddy:自动管理 Let's Encrypt 证书,处理 80/443 的 Web 流量
- Sing-box:监听 8443 端口,使用 Caddy 提供的证书,提供 VLESS + TLS 服务
端口分配:
- 80 / 443 → Caddy(Web 服务)
- 8443 → Sing-box(VLESS 代理)
注意事项
- 确保目录
/data/singbox和/data/caddy存在且有正确权限 - 若使用 SELinux,挂载选项
:Z可自动设置上下文 - 证书复制步骤可在 Caddy 首次获取证书后执行,或通过脚本定期同步
以下是将版本二(共用 443 端口)的配置整理成的 Markdown 格式文档:
(版本二:共用 443 端口)Podman 部署 Gateway Pod 并运行 Sing-box + Caddy 服务
架构说明
- 共用 443 端口:Caddy 作为 L4 代理,透传 VLESS 流量到 Sing-box
- 流量分流:Caddy 处理 L4 代理,不参与 TLS 解密
端口分配:
- 80 → Caddy(HTTP 服务,可选)
- 443 → Caddy(L4 代理,透传到 Sing-box 的 8443)
- 8443 → Sing-box(实际处理 VLESS + TLS)
1. 清理旧环境
podman pod stop gateway 2>/dev/null || true
podman pod rm gateway 2>/dev/null || true2. 创建 Gateway Pod
podman pod create \
--name gateway \
--memory 512m \
--cpus 0.6 \
--publish 80:80 \
--publish 443:443- 限制资源:内存 512MB,CPU 0.6 核
- 暴露端口:80(HTTP)、443(代理入口)
- 注意:不再单独映射 8443 端口
3. Caddy L4 代理配置(/data/caddy/config.json)
{
"apps": {
"layer4": {
"servers": {
"public": {
"listen": [":443"],
"routes": [
{
"handle": [
{
"handler": "proxy",
"upstreams": [
{"dial": ["127.0.0.1:8443"]}
]
}
]
}
]
}
}
}
}
}- 作用:Caddy 监听 443 端口,将流量直接透传到 Sing-box 的 8443 端口
- 无需 TLS 配置:证书在 Sing-box 层处理
4. Sing-box 配置文件(/data/singbox/config.json)
{
"log": {
"level": "info",
"timestamp": true,
"output": "/dev/stdout"
},
"inbounds": [
{
"type": "vless",
"tag": "vless-in",
"listen": "0.0.0.0",
"listen_port": 8443,
"users": [
{
"uuid": "0c980228d60a"
}
],
"tls": {
"enabled": true,
"server_name": "zing.baidaoya.qzz.io",
"certificate_path": "/etc/sing-box/certs/fullchain.pem",
"key_path": "/etc/sing-box/certs/privkey.pem"
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
}
]
}- 监听端口:8443(内部端口,通过 Pod 网络暴露)
- TLS 证书:由 Sing-box 直接处理
5. 启动 Sing-box 容器
podman run -d \
--name singbox \
--pod gateway \
--restart always \
-v /data/singbox/config.json:/etc/sing-box/config.json:Z \
-v /data/singbox/certs:/etc/sing-box/certs:Z \
ghcr.io/sagernet/sing-box:latest \
run -c /etc/sing-box/config.json- 共享 Pod 网络:通过
--pod gateway - 挂载配置:配置文件 + 证书目录
6. 启动 Caddy(支持 L4 代理版本)
podman run -d \
--name caddy \
--pod gateway \
--restart always \
-v /data/caddy/config.json:/etc/caddy/config.json:Z \
-v caddy_data:/data \
-v caddy_config:/config \
registry.cn-beijing.aliyuncs.com/k7scn/caddy2:latest \
caddy run --config /etc/caddy/config.json- 使用镜像:支持 L4 层代理的 Caddy 版本
- 配置文件:挂载 L4 代理配置
- 数据卷:持久化证书和配置
7. 证书配置(可选)
如果使用独立的证书管理方案:
# 创建证书目录
sudo mkdir -p /data/singbox/certs
# 手动放置证书
# fullchain.pem 和 privkey.pem 需要提前准备好注意:由于 Caddy 在 L4 层不处理 TLS,无法自动申请证书。证书需要:
- 手动从其他渠道获取(如 Let's Encrypt certbot)
- 或使用 Sing-box 自带的 ACME 功能
8. 验证配置
# 查看 Pod 状态
podman pod ps
# 查看容器日志
podman logs singbox
podman logs caddy
# 测试连接(从外部)
curl -v https://zing.baidaoya.qzz.io:443架构对比
| 项目 | 版本一(独立端口) | 版本二(共用端口) |
|---|---|---|
| 端口分配 | 443 → Caddy(Web) 8443 → Sing-box(VLESS) | 443 → Caddy(L4 代理) 8443 → Sing-box(内部) |
| 证书管理 | Caddy 自动申请证书 手动复制给 Sing-box | 需要手动管理证书 或使用 Sing-box ACME |
| Caddy 角色 | Web 服务器 + 反向代理 | L4 流量代理(透传) |
| 适用场景 | 同时提供 Web 服务和代理 | 仅需代理服务 对外统一使用 443 端口 |
| 复杂度 | 中等(需同步证书) | 较低(配置简单) |
注意事项
- 证书管理:版本二需要自行处理证书,Caddy 不参与 TLS
- Pod 网络:容器间通过
127.0.0.1:8443通信 - 镜像选择:版本二需要使用支持 L4 代理的 Caddy 镜像
- 防火墙:确保只开放 80 和 443 端口
- SELinux:挂载卷使用
:Z标签自动设置上下文
扩展建议
- 添加 Reality:可在 Sing-box 配置中添加 Reality 入站
- 多域名支持:Caddy L4 可根据 SNI 路由不同后端
- 负载均衡:在 Caddy L4 配置中添加多个 upstreams
这个版本的核心区别在于:
- Caddy 作为 L4 代理:不再处理 HTTPS,只做流量转发
- 共用 443 端口:对外只暴露一个端口
- 简化证书管理:但需要自行处理证书(如果使用 TLS)
- 适用场景:适合只提供代理服务、不需要额外 Web 功能的场景
优化,减少caddy日志和singbox日志输出
Caddy 配置(/data/caddy/config.json)
{
"admin": {
"disabled": true
},
"logging": {
"logs": {
"default": {
"level": "ERROR",
"writer": {
"output": "discard"
}
}
}
},
"apps": {
"layer4": {
"servers": {
"public": {
"listen": [":443"],
"routes": [
{
"handle": [
{
"handler": "proxy",
"upstreams": [
{"dial": ["127.0.0.1:8443"]}
]
}
]
}
]
}
}
}
}
}Sing-box 配置文件(/data/singbox/config.json)
{
"log": {
"level": "error",
"timestamp": true,
"output": "/dev/stdout"
},
"inbounds": [
{
"type": "vless",
"tag": "vless-in",
"listen": "0.0.0.0",
"listen_port": 8443,
"users": [
{
"uuid": "0c980228d60a"
}
],
"tls": {
"enabled": true,
"server_name": "zing.baidaoya.qzz.io",
"certificate_path": "/etc/sing-box/certs/fullchain.pem",
"key_path": "/etc/sing-box/certs/privkey.pem"
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
}
]
}
注意事项
可能版本问题singbox配置,"domain_strategy": "ipv4_only" 不支持,dns也不支持