Skip to content

公网部署请求更新 #29

Closed
Closed

Description

@aiqujuni

#27
求PR

Activity

  1. RobbsLuo commented on Nov 1, 2026

    @RobbsLuo
    Owner

    PR #27 已合并进 main(rebase 到最新 main,只 TECHNICAL.md 一处冲突已解决;CI 四个 job 全绿)。

    「只有公网 IP、没有域名,能不能 https?」——能,但 Caddy 的自动申请(ACME)只认域名、不给裸 IP 签发,所以要二选一:

    1)想拿到「浏览器直接认」的证书 → 借一个通配 DNS 名

    sslip.io / nip.io 把 IP 编进主机名,自动解析回你的 IP:

    # 公网 IP 203.0.113.10 → 把点写成横线(`.sslip.io`、`.nip.io` 两种写法都支持)
    PUBLIC_DOMAIN=203-0-113-10.sslip.io
    ACME_EMAIL=你的邮箱@example.com     # 域名模式必填
    # TLS_MODE 留空 = 自动申请

    这样走的就是常规 ACME,签出来的就是浏览器直接信任的证书。

    注意:Let's Encrypt 按「注册域」限流(每 7 天 50 张),sslip.io / nip.io 是所有使用者共享的两个域名(2026-02 被打满过一次,之后各自申请过配额上调)——签不出来就换另一个域名。

    2)只给 API 客户端用、不介意证书不被信任 → 自签

    PUBLIC_DOMAIN=203.0.113.10          # 直接填公网 IP
    TLS_MODE=internal                   # 用 Caddy 自带 CA 自签
    # ACME_EMAIL 用不到,留空即可

    链路照样加密,但证书不在公共信任库里:浏览器会告警,curl 要 -k,或者把根证书装进客户端信任:

    docker compose -f docker-compose.yml -f docker-compose.public.yml \
      exec caddy cat /data/pki/authorities/local/root.crt

    这里 Caddyfile 里有一条关键配置 default_sni {$PUBLIC_DOMAIN}:浏览器与 curl 对 IP 字面量一律不发 SNI(RFC 6066 只允许主机名),没有它 Caddy 选不出证书,客户端只会看到 tlsv1 alert internal error(握手直接失败,不是「证书不受信任」)。已默认写好,不用手改。

    两种模式都要满足的前提

    • 80 与 443(tcp + udp)对公网可达:80 是 ACME HTTP-01 挑战与之后的 308 跳转。
    • ALLOWED_HOSTS 留空即可 —— 覆盖文件会自动补上你的域名 / IP + 127.0.0.1(漏掉回环会让容器 healthcheck 判 400,永远 unhealthy,Caddy 也就永远不启动)。
    • Docker Compose ≥ 2.24(覆盖文件用了 !override)。

    启动:

    docker compose -f docker-compose.yml -f docker-compose.public.yml up -d --build
    docker compose -f docker-compose.yml -f docker-compose.public.yml logs -f caddy
    curl -fsS https://你的域名或IP/health   # 自签模式加 -k

    README 中英都新增了「只有公网 IP、没有域名」一节,.env.example 也补了 TLS_MODE 说明。

    本地已实测(公网 IP 站址 + internal):no-SNI 的 curl -k 拿到 200、80 端口 308、/metrics 404。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions