(版本一:不共用 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_datacaddy_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 || true

2. 创建 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 端口
复杂度中等(需同步证书)较低(配置简单)

注意事项

  1. 证书管理:版本二需要自行处理证书,Caddy 不参与 TLS
  2. Pod 网络:容器间通过 127.0.0.1:8443 通信
  3. 镜像选择:版本二需要使用支持 L4 代理的 Caddy 镜像
  4. 防火墙:确保只开放 80 和 443 端口
  5. SELinux:挂载卷使用 :Z 标签自动设置上下文

扩展建议

  • 添加 Reality:可在 Sing-box 配置中添加 Reality 入站
  • 多域名支持:Caddy L4 可根据 SNI 路由不同后端
  • 负载均衡:在 Caddy L4 配置中添加多个 upstreams

这个版本的核心区别在于:

  1. Caddy 作为 L4 代理:不再处理 HTTPS,只做流量转发
  2. 共用 443 端口:对外只暴露一个端口
  3. 简化证书管理:但需要自行处理证书(如果使用 TLS)
  4. 适用场景:适合只提供代理服务、不需要额外 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也不支持


标签: none

添加新评论