我正在使用 Traefik 为容器中的 fastapi 应用程序获取 SSL 证书。启动容器后,我发现我的 SSL 证书很好,但我的网站会抛出“Bad Gateway”错误。
下面是我的 docker-compose 的相关部分,一个在 docker-compose 内部构建的 Dockerfile.traefik,以及一个在其中使用的 traefik.prod.toml。
对于 api 入口点,我使用 python 模块 toncinta-api (您可以将其视为我的 docker-compose 中服务 api 的入口点),其中包含命令 uvicorn.run("api:app", host ='0.0.0.0')
Docker 撰写:
.
.
api:
image: toncinta/toncinta-python:chime
container_name: toncinta-api-default
#ports:
# - "80:80"
expose:
- 80
labels:
- "traefik.enable=true"
- "traefik.http.routers.fastapi.rule=Host(`toncinta-api.com`)"
- "traefik.http.routers.fastapi.tls=true"
- "traefik.http.routers.fastapi.tls.certresolver=letsencrypt"
stdin_open: true
tty: true
entrypoint: toncinta-api
traefik: # new
build:
context: .
dockerfile: Dockerfile.traefik
ports:
- 80:80
- 443:443
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./traefik-public-certificates:/certificates"
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`dashboard.toncinta-api.com`) && (PathPrefix(`/`)"
- "traefik.http.routers.dashboard.tls=true"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.dashboard.service=api@internal"
Dockerfile.traefik
# Dockerfile.traefik
FROM traefik:v2.9.6
COPY ./traefik.prod.toml ./etc/traefik/traefik.toml
traefik.prod.toml
# traefik.prod.toml
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.http]
[entryPoints.web.http.redirections]
[entryPoints.web.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
[entryPoints.websecure]
address = ":443"
[accessLog]
[api]
dashboard = true
[providers]
[providers.docker]
exposedByDefault = false
[certificatesResolvers.letsencrypt.acme]
email = "[email protected]"
storage = "/certificates/acme.json"
[certificatesResolvers.letsencrypt.acme.httpChallenge]
entryPoint = "web"
我怀疑这可能与我为 uvicorn 服务器和 traefik 公开/使用的端口有关。我关注了一些相关的 stackoverflow 讨论,但找不到修复方法。
正如 didforaiur 指出的,我设法通过向命令中添加端口来解决这个问题,如下所示:
uvicorn.run("api:app", host='0.0.0.0', port=5000)
,并在 docker-compose 中将其显式公开为我的 Web 服务的服务定义中的端口。
但现在我的问题是,只有
toncinta-api.com
获得 HTTPS,浏览器将 www.toncinta-api.com
视为不安全。这与 traefik 配置证书的方式有关吗?再次,我的 docker-compose 中仍然需要更改一些内容?
根据社区的评论单独回答
bot
。
这些行位于我的服务网络的标记标签下
docker-compose 帮助我在 www.toncinta.com 上使用 https
.
.
"traefik.http.routers.fastapi2.rule=Host(www.toncinta-api.com)" -
"traefik.http.routers.fastapi2.tls=true" -
"traefik.http.routers.fastapi2.tls.certresolver=letsencrypt"