You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CI/CD流水线中PostgreSQL配置SSL证书时的权限问题求助

解决GitHub Actions中PostgreSQL容器SSL证书权限问题

问题描述

本地环境通过Makefile生成自签名SSL证书,再启动Docker Compose定义的PostgreSQL服务一切正常,但在GitHub Actions流水线中运行时,出现以下权限错误:

waiting for server to start....FATAL:  private key file "/ssl/server.key" must be owned by the database user or root

现有配置

Docker Compose文件

services:
  postgres:
    image: postgres:latest
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    networks:
      - my-network
    restart: always
    volumes:
      - db:/var/lib/postgresql/data
      - ../../../bin/certs/postgres:/ssl
    command:
      [
        "postgres",
        "-c",
        "ssl=on",
        "-c",
        "ssl_cert_file=/ssl/server.crt",
        "-c",
        "ssl_key_file=/ssl/server.key",
      ]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  db:
    driver: local

networks:
  my-network:
    driver: bridge
    name: my-network

Makefile证书生成目标

.PHONY: generate-ssl
gen-ssl: ## Generates a self signed ssl certificates
    @mkdir -p $(OUTPUT_DIR); \
    openssl req -x509 -newkey rsa:4096 -keyout $(OUTPUT_DIR)/server.key -out $(OUTPUT_DIR)/server.crt -sha256 -days 365 -nodes -subj "/CN=localhost"; \
    chmod 600 $(OUTPUT_DIR)/server.key;

解决方案

问题根源是GitHub Actions中生成的证书文件所有者与PostgreSQL容器内postgres用户(UID/GID为991)不匹配,以下是三种可行修复方案:

方案1:在GitHub Actions流水线中调整证书所有权

在生成证书的步骤后,添加调整文件所有者的命令,直接将证书权限设置为容器内postgres用户对应的UID/GID:

make gen-ssl
sudo chown 991:991 bin/certs/postgres/server.key bin/certs/postgres/server.crt

此方案直接在CI环境中修正文件权限,容器挂载后即可正常读取。

方案2:修改Docker Compose命令,启动前调整权限

通过sh命令先以root身份修改证书所有权,再切换到postgres用户启动服务(利用镜像自带的gosu工具):

services:
  postgres:
    # ... 其他配置保持不变
    command:
      [
        "sh",
        "-c",
        "chown postgres:postgres /ssl/server.key /ssl/server.crt && gosu postgres postgres -c ssl=on -c ssl_cert_file=/ssl/server.crt -c ssl_key_file=/ssl/server.key"
      ]

此方案无需修改CI流程,直接在容器启动时完成权限修正。

方案3:更新Makefile,生成证书时设置正确所有权

在Makefile的gen-ssl目标末尾添加chown命令,指定UID/GID为991(容器内postgres用户的标识):

.PHONY: generate-ssl
gen-ssl: ## Generates a self signed ssl certificates
    @mkdir -p $(OUTPUT_DIR); \
    openssl req -x509 -newkey rsa:4096 -keyout $(OUTPUT_DIR)/server.key -out $(OUTPUT_DIR)/server.crt -sha256 -days 365 -nodes -subj "/CN=localhost"; \
    chmod 600 $(OUTPUT_DIR)/server.key; \
    chown 991:991 $(OUTPUT_DIR)/server.key $(OUTPUT_DIR)/server.crt;

注意:本地执行此命令可能需要sudo权限,可在CI中执行make gen-ssl时添加sudo,或根据环境判断是否执行chown步骤。


内容的提问来源于stack exchange,提问作者Srinivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:44:51