Compare commits

...

3 Commits

5 changed files with 14 additions and 5 deletions

View File

@ -19,5 +19,8 @@ TEST_MODE=false
POSTGRES_DB=cents POSTGRES_DB=cents
POSTGRES_USER=cents POSTGRES_USER=cents
POSTGRES_PASSWORD=change-me POSTGRES_PASSWORD=change-me
# Host uid/gid used by the backup container when writing ./backups/db.
BACKUP_UID=1001
BACKUP_GID=1001
APP_TIME_ZONE=Asia/Shanghai APP_TIME_ZONE=Asia/Shanghai
EXCHANGE_RATE_API_URL=https://api.frankfurter.dev EXCHANGE_RATE_API_URL=https://api.frankfurter.dev

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
backup/
legacy-cent-app/ legacy-cent-app/
node_modules/ node_modules/
dist/ dist/

View File

@ -85,7 +85,9 @@ docker compose --env-file .env -f compose.pro.yaml exec api \
## 生产数据库备份 ## 生产数据库备份
`backup` 容器每天北京时间 `03:00` 将 PostgreSQL 备份到生产 clone 目录下的 `./backups`。备份采用 PostgreSQL custom format并在写入后校验超过 30 天的备份会自动删除。 `backup` 容器每天北京时间 `03:00` 将 PostgreSQL 备份到生产 clone 目录下的 `./backups/db`。备份容器使用宿主机普通用户运行,不会以 root 保存备份文件。备份采用 PostgreSQL custom format并在写入后校验超过 30 天的备份会自动删除。
`BACKUP_UID``BACKUP_GID` 应设置为生产宿主机运行 Cents 的普通用户 UID/GID默认值为 `1001`
查看调度和备份日志: 查看调度和备份日志:
@ -103,5 +105,5 @@ docker compose --env-file .env -f compose.pro.yaml exec backup \
备份文件位于宿主机: 备份文件位于宿主机:
```text ```text
./backups/cents-YYYYMMDD-HHMMSS.dump ./backups/db/cents-YYYYMMDD-HHMMSS.dump
``` ```

View File

@ -37,6 +37,7 @@ services:
backup: backup:
image: postgres:17-alpine image: postgres:17-alpine
restart: unless-stopped restart: unless-stopped
user: "${BACKUP_UID:-1001}:${BACKUP_GID:-1001}"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
PGHOST: db PGHOST: db
@ -45,7 +46,7 @@ services:
PGPASSWORD: ${POSTGRES_PASSWORD} PGPASSWORD: ${POSTGRES_PASSWORD}
entrypoint: ["/usr/local/bin/cents-backup"] entrypoint: ["/usr/local/bin/cents-backup"]
volumes: volumes:
- ./backups:/backups - ./backups/db:/backups
- ./deploy/postgres-backup.sh:/usr/local/bin/cents-backup:ro - ./deploy/postgres-backup.sh:/usr/local/bin/cents-backup:ro
depends_on: depends_on:
db: db:

View File

@ -27,11 +27,13 @@ case "${1:-cron}" in
run_backup run_backup
;; ;;
cron) cron)
cron_dir=/tmp/cents-crontabs
mkdir -p "$cron_dir"
printf '%s\n' \ printf '%s\n' \
'0 3 * * * /usr/local/bin/cents-backup run >> /proc/1/fd/1 2>> /proc/1/fd/2' \ '0 3 * * * /usr/local/bin/cents-backup run >> /proc/1/fd/1 2>> /proc/1/fd/2' \
> /etc/crontabs/root > "$cron_dir/$(id -u)"
printf 'Backup scheduler started: daily at 03:00 %s, retaining 30 days\n' "${TZ:-local time}" printf 'Backup scheduler started: daily at 03:00 %s, retaining 30 days\n' "${TZ:-local time}"
exec crond -f -l 2 exec crond -f -l 2 -c "$cron_dir"
;; ;;
*) *)
printf 'Unknown command: %s\n' "$1" >&2 printf 'Unknown command: %s\n' "$1" >&2