尽管 SSL 显式禁用,但 Docker/Portainer 中的 Postgres SSL 连接错误

问题描述 投票:0回答:1

我正在尝试使用 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 上运行。

提前致谢。

postgresql docker ssl portainer
1个回答
0
投票

您遇到的错误表明 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
© www.soinside.com 2019 - 2024. All rights reserved.