HA stage 0: health reads workers registry, daily pg_dump timer, backup freshness in monitor (#48)
Co-authored-by: host <host@test.local>
This commit is contained in:
1 parent
275de39148
commit
455513dd33
6 files changed
+150
-10
No files matched your search
@@ -0,0 +1,17 @@
|
||||
# 每日 Postgres 备份服务(HA 阶段 0)。
|
||||
#
|
||||
# 注意:unit 文件不在 deploy tar 里,改动后须单独 scp 到
|
||||
# /etc/systemd/system/ 再 daemon-reload + enable + start,不要只重启服务。
|
||||
# 本 service 以 root 跑,只因为要读 0600 的 /etc/codex-app-server/env;
|
||||
# 备份文件由 UMask=0077 压成 600,目录由 pg-backup.sh 压成 700。
|
||||
[Unit]
|
||||
Description=Daily Postgres backup for codex-app-server
|
||||
# 注意:codex-postgres 是 docker 容器、不是 systemd 服务,这里不写
|
||||
# After/Wants;Postgres 不可达时 pg_dump 直接失败、service 失败可见。
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=root
|
||||
UMask=0077
|
||||
EnvironmentFile=/etc/codex-app-server/env
|
||||
ExecStart=/bin/sh /opt/codex-app-server/deploy/pg-backup.sh
|
||||
@@ -0,0 +1,15 @@
|
||||
# 每日 Postgres 备份定时器(HA 阶段 0)。
|
||||
#
|
||||
# 注意:unit 文件不在 deploy tar 里,改动后须单独 scp 到
|
||||
# /etc/systemd/system/ 再 daemon-reload + enable,不要只重启服务。
|
||||
# 19:00 UTC = 次日 03:00 CST(主机时区为 UTC 时以 UTC 为准,见注释)。
|
||||
[Unit]
|
||||
Description=Daily Postgres backup timer for codex-app-server
|
||||
|
||||
[Timer]
|
||||
OnCalendar=*-*-* 19:00:00 UTC
|
||||
Persistent=true
|
||||
Unit=codex-pg-backup.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
+23
-4
@@ -18,6 +18,9 @@
|
||||
# docker_postgres:docker ps 里 codex-postgres 在运行
|
||||
# disk:磁盘使用率 < 90%(默认看 /var/lib/codex-app-server,不存在则看 /)
|
||||
# app_dir:/opt/codex-app-server 目录存在
|
||||
# backup:最近的 cloud-backup-*.sql 在 36 小时内(每天一次定时备份,
|
||||
# HA 阶段 0;目录默认 /var/lib/codex-app-server/backups,可用
|
||||
# MONITOR_BACKUP_DIR 覆盖)
|
||||
#
|
||||
# 输出示例(单行 JSON,值只会是 pass/fail,不含任何密钥):
|
||||
# {"overall": "pass", "checks": {"server": "pass", ...}}
|
||||
@@ -105,16 +108,32 @@ check_app_dir() {
|
||||
if [ -d "$APP_DIR" ]; then echo pass; else echo fail; fi
|
||||
}
|
||||
|
||||
check_backup() {
|
||||
# 备份新鲜度:BACKUP_DIR 里最近的 cloud-backup-*.sql 在 36 小时内
|
||||
# (每天一次,36 小时容忍一次失败 + 时区/夏令时抖动)。目录或文件
|
||||
# 缺失一律 fail——备份制度断了必须在 monitor 里可见,不能静默。
|
||||
BACKUP_DIR=${MONITOR_BACKUP_DIR:-/var/lib/codex-app-server/backups}
|
||||
NEWEST=$(ls -t "$BACKUP_DIR"/cloud-backup-*.sql 2>/dev/null | head -1 || true)
|
||||
if [ -z "$NEWEST" ]; then echo fail; return; fi
|
||||
MTIME=$(stat -c %Y "$NEWEST" 2>/dev/null || true)
|
||||
case "$MTIME" in
|
||||
''|*[!0-9]*) echo fail; return ;;
|
||||
esac
|
||||
NOW=$(date +%s)
|
||||
AGE=$((NOW - MTIME))
|
||||
if [ "$AGE" -lt 129600 ]; then echo pass; else echo fail; fi
|
||||
}
|
||||
|
||||
run_checks() {
|
||||
S=$(check_server); W=$(check_worker); H=$(check_health)
|
||||
P=$(check_postgres); D=$(check_docker_postgres)
|
||||
K=$(check_disk); A=$(check_app_dir)
|
||||
K=$(check_disk); A=$(check_app_dir); B=$(check_backup)
|
||||
OVERALL=pass
|
||||
for v in "$S" "$W" "$H" "$P" "$D" "$K" "$A"; do
|
||||
for v in "$S" "$W" "$H" "$P" "$D" "$K" "$A" "$B"; do
|
||||
if [ "$v" != "pass" ]; then OVERALL=fail; break; fi
|
||||
done
|
||||
printf '{"overall": "%s", "checks": {"server": "%s", "worker": "%s", "health": "%s", "postgres": "%s", "docker_postgres": "%s", "disk": "%s", "app_dir": "%s"}}\n' \
|
||||
"$OVERALL" "$S" "$W" "$H" "$P" "$D" "$K" "$A"
|
||||
printf '{"overall": "%s", "checks": {"server": "%s", "worker": "%s", "health": "%s", "postgres": "%s", "docker_postgres": "%s", "disk": "%s", "app_dir": "%s", "backup": "%s"}}\n' \
|
||||
"$OVERALL" "$S" "$W" "$H" "$P" "$D" "$K" "$A" "$B"
|
||||
if [ "$OVERALL" = "pass" ]; then return 0; else return 1; fi
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
# 每日 Postgres 备份(由 codex-pg-backup.service 调,timer 每天触发)。
|
||||
#
|
||||
# 连接参数只走 CLOUD_DB_* 环境变量(service 的 EnvironmentFile 指向
|
||||
# /etc/codex-app-server/env,0600 root);密码绝不出现在命令行与日志里。
|
||||
# 备份目录默认 /var/lib/codex-app-server/backups,轮转只留最近 7 份
|
||||
# (每天一次 = 一周);备份文件含生产库全量(含 GitHub App 配置),
|
||||
# 目录 700、service 的 UMask=0077 保证文件 600,绝不要放宽。
|
||||
set -eu
|
||||
|
||||
APP_DIR=${APP_DIR:-/opt/codex-app-server}
|
||||
BACKUP_DIR=${BACKUP_DIR:-/var/lib/codex-app-server/backups}
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
chmod 700 "$BACKUP_DIR"
|
||||
cd "$APP_DIR"
|
||||
python3 -m cloud.backup --backend postgres --out "$BACKUP_DIR" --keep 7
|
||||
Reference in new issue
Block a user