From 0b7f1f9667448905c488fc2ec2bbc4d3b5f018bb Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Fri, 4 Sep 2026 14:33:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=E6=9B=B4=E6=96=B0=20PostgreSQL?= =?UTF-8?q?=20=E5=A4=87=E4=BB=BD=E9=85=8D=E7=BD=AE=E4=B8=8E=E5=87=AD?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更换超级用户名及口令为占位值,健康检查不再指定用户 - 备份任务改为按北京时间每天 02:00 执行,并增加调度日志 - 备份命令改用环境变量连接,移除硬编码 `-U postgres` --- docker-compose-infra-main.yml | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/docker-compose-infra-main.yml b/docker-compose-infra-main.yml index f836208..08dd18f 100644 --- a/docker-compose-infra-main.yml +++ b/docker-compose-infra-main.yml @@ -21,8 +21,10 @@ services: ports: - "15432:5432" environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: Q!P@z#M$1@686^*^.. + # 仅首次初始化空数据卷时生效;库内超级用户已被 ALTER ROLE 改名、口令已改, + # 这里写成与新库一致的名字/口令(占位符,需你自行替换成实际值)。 + POSTGRES_USER: sql9f15b63fd203b36e + POSTGRES_PASSWORD: 1ec94b1acdaf57b66030242d418fad5a POSTGRES_DB: postgres volumes: - /data/pgsql:/var/lib/postgresql/data @@ -30,7 +32,8 @@ services: networks: - redfuture-net healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] + # 健康检查只探“服务在不在”,不带 -U 指定角色,避免跟着超级用户名改来改去 + test: ["CMD-SHELL", "pg_isready"] interval: 10s timeout: 5s retries: 5 @@ -46,8 +49,9 @@ services: volumes: - /data/pgsql/backup:/backup environment: - PGUSER: postgres - PGPASSWORD: Q!P@z#M$1@686^*^.. + TZ: Asia/Shanghai # 使下面的 02:00 与备份文件名时间都按北京时间计算 + PGUSER: sql9f15b63fd203b36e # ← 改为你 ALTER ROLE 后的新超级用户名 + PGPASSWORD: 1ec94b1acdaf57b66030242d418fad5a # ← 改为新超级用户口令 PGHOST: postgres PGPORT: 5432 BACKUP_DIR: /backup @@ -59,18 +63,26 @@ services: - | set -e mkdir -p "/backup" + echo "[$(date '+%F %T %Z')] postgres-backup started. Will run once per day at 02:00." while true; do + # 睡到下一个 02:00(容器 TZ=Asia/Shanghai → 即北京时间凌晨2点) + now=$(date +%s) + target=$(date -d "today 02:00" +%s) + [ "$target" -le "$now" ] && target=$(date -d "tomorrow 02:00" +%s) + echo "[$(date '+%F %T')] next backup scheduled at $(date -d "@$target" '+%F %T')" + sleep $(( target - now )) + f="backup_$(date +%Y%m%d_%H%M%S).sql.gz" tmp="/backup/$${f}.tmp" - echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting backup: $${f}" - if pg_dumpall -h postgres -U postgres > "$${tmp}" && gzip -f "$${tmp}" && mv "$${tmp}.gz" "/backup/$${f}"; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup complete" + echo "[$(date '+%F %T')] Starting backup: $${f}" + # 连接身份取自上面环境变量 PGUSER/PGPASSWORD(无需在命令里再写 -U) + if pg_dumpall -h postgres > "$${tmp}" && gzip -f "$${tmp}" && mv "$${tmp}.gz" "/backup/$${f}"; then + echo "[$(date '+%F %T')] Backup complete" else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup FAILED, removing partial file" + echo "[$(date '+%F %T')] Backup FAILED, removing partial file" rm -f "$${tmp}" "$${tmp}.gz" fi find /backup -name "backup_*.sql.gz" -mtime +7 -delete 2>/dev/null || true - sleep 86400 done # ---- Redis ----