#!/bin/sh set -eu umask 077 # 使用容器本地 socket 备份,无须在命令行或日志中传密码;只生成新文件,不自动清理旧备份。 deploy_dir=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) backup_dir="$deploy_dir/backups" mkdir -p "$backup_dir" backup_file="$backup_dir/doodle_prod_$(date -u +%Y%m%dT%H%M%SZ).dump" if [ -e "$backup_file" ] || [ -e "$backup_file.partial" ]; then echo '备份文件已存在,请稍后重试' >&2 exit 1 fi trap 'rm -f "$backup_file.partial"' EXIT HUP INT TERM docker compose --env-file "$deploy_dir/.env" -f "$deploy_dir/compose.database.yaml" \ exec -T postgres pg_dump -U postgres -d doodle_prod -Fc > "$backup_file.partial" # 从容器内部校验归档目录,确保可被 pg_restore 识别后才发布完整文件名。 docker compose --env-file "$deploy_dir/.env" -f "$deploy_dir/compose.database.yaml" \ exec -T postgres pg_restore --list < "$backup_file.partial" > /dev/null mv "$backup_file.partial" "$backup_file" trap - EXIT HUP INT TERM printf '%s\n' "$backup_file"