Weblate连接AWS RDS PostgreSQL失败:CLI可连容器却报认证错误
问题详情
- 部署方式:使用Docker Compose运行Weblate容器,配置环境变量连接外部AWS RDS PostgreSQL数据库
- 启动报错:
psql: error: connection to server at "XXXX.rds.amazonaws.com", port 5432 failed: FATAL: password authentication failed for user "postgres"
- 异常矛盾:从Weblate容器内部通过CLI手动连接该RDS数据库,能够成功建立连接
所用Docker Compose配置
version: '3' services: weblate: image: weblate/weblate tmpfs: - /app/cache volumes: - weblate-data:/app/data env_file: - ./environment restart: always ports: - 80:8080 environment: POSTGRES_PASSWORD: XXXX POSTGRES_USER: myuser POSTGRES_DATABASE: mydb POSTGRES_HOST: XXX.rds.amazonaws.com POSTGRES_PORT: 5432
问题分析与解决方案
核心原因
报错显示Weblate尝试用postgres用户连接RDS,但你配置的是myuser,说明自定义的数据库用户环境变量没有被Weblate正确读取,大概率是配置冲突或变量优先级问题导致的。
具体解决步骤
排查env_file冲突
检查./environment文件内容,确认其中没有定义POSTGRES_USER=postgres或其他与environment块冲突的变量。Docker Compose中environment块的变量优先级高于env_file,如果env_file里存在同名变量,会覆盖你在environment里设置的值。直接使用DATABASE_URL变量
跳过Weblate对POSTGRES_*系列变量的解析,直接用标准的DATABASE_URL环境变量指定完整连接串,避免解析错误。修改Docker Compose的environment块:environment: DATABASE_URL: postgres://myuser:XXXX@XXX.rds.amazonaws.com:5432/mydb # 注释掉原有的POSTGRES_*变量,避免冲突 # POSTGRES_PASSWORD: XXXX # POSTGRES_USER: myuser # POSTGRES_DATABASE: mydb # POSTGRES_HOST: XXX.rds.amazonaws.com # POSTGRES_PORT: 5432验证容器内环境变量
启动容器后,执行以下命令进入容器并检查变量值:docker exec -it <weblate_container_name> bash echo $POSTGRES_USER echo $DATABASE_URL确认输出的用户是
myuser,连接串信息正确。如果不是,检查Docker Compose文件路径、env_file路径是否正确,或者是否有其他配置文件覆盖了变量。确认RDS权限配置
虽然CLI能连接,但再次确认RDS的安全组已允许Weblate容器所在IP访问,且myuser用户对mydb数据库有足够权限(比如登录、创建表等)。
内容的提问来源于stack exchange,提问作者Daniele

