我正在尝试使用 Portainer 中的 Docker Compose 来部署带有 PostgreSQL 的 FastAPI 应用程序,但尽管显式禁用了 SSL,但我还是收到了与 SSL 相关的连接错误。它可以在本地运行,但是当部署到 Portainer 时,会出现下一个错误:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "db" (172.27.0.2), port 5432 failed: server does not support SSL, but SSL was required
docker-compose.yml
services:
backend:
container_name: backend
build:
context: ./balancer
dockerfile: Dockerfile.prod
ports:
- "8000:8000"
env_file:
- stack.env
environment:
PORT: 8000
PYTHONPATH: /app
ENVIRONMENT: production
DISABLE_SSL: "true"
depends_on:
- db
db:
container_name: db
image: postgres:15-alpine
ports:
- "5432:5432"
env_file:
- stack.env
environment:
POSTGRES_DB: ${DATABASE}
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_HOST_AUTH_METHOD: trust
command:
- "postgres"
- "-c"
- "ssl=off"
volumes:
- postgres_data:/var/lib/postgresql/data
数据库.py
def get_database_url():
if settings.USE_SQLITE:
return settings.DATABASE_URL
return f"postgresql://{settings.DATABASE_USER}:{settings.DATABASE_PASSWORD}@{settings.DATABASE_HOST}:{settings.DATABASE_PORT}/{settings.DATABASE}?sslmode=disable"
try:
connect_args = {"check_same_thread": False} if settings.USE_SQLITE else {
"connect_timeout": 5
}
engine = create_engine(
get_database_url(),
connect_args=connect_args,
pool_pre_ping=True
)
这些是出现在后端容器的 Portainer 信息中的变量:
0 DATABASE_HOST=db
1 DATABASE_PASSWORD=balancer
5 DATABASE_USER=balancer
12 DATABASE_PORT=5432
22 DATABASE=balancer
13 DISABLE_SSL=true
我几乎尝试了所有方法,但我不知道如何继续。我不明白为什么它可以在本地运行,但不能在 Portainer 上运行。
提前致谢。
您遇到的错误表明 SQLAlchemy 或您的应用程序正在尝试建立与 PostgreSQL 数据库的 SSL 连接,但 SSL 已在您的 PostgreSQL 设置中禁用
(ssl=off)
。由于您已在 PostgreSQL 配置和 backend
环境变量中显式禁用 SSL,因此您需要确保应用程序(和 SQLAlchemy)不会尝试强制执行 SSL。
要解决此问题,您可以明确告诉 SQLAlchemy 在连接数据库时不要使用 SSL。您应该使用
postgresql+psycopg2
方案。
此外,您应该将
healthcheck
添加到 db
服务,以确保后端服务不会在数据库准备就绪之前启动。
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER}"]
interval: 10s
timeout: 5s
retries: 5