#!/bin/bash # روی سرورِ بکاپ (۲۴۷). دفترِ رویدادهای خرید (payment_paymentevent) و سفارش/تراکنش را از روی همین # بکاپ (آخرین نسخه‌ی کامل + همه‌ی WALِ رسیده) به CSVِ خوانا در `payment-log/` کنارِ `base/` و `wal/` می‌نویسد. # هیچ اتصالی به ۲۴۹ یا Postgresِ دیگرانِ این ماشین ندارد: همان روشِ restore-check.sh، نمونه‌ی موقت روی # سوکتِ داخلِ پوشه (بی‌پورتِ شبکه) که آخرش پاک می‌شود. فقط زیرِ ~/zareian-pgbackup می‌نویسد. # خروجی: payment-log/payment-events-.csv، orders-…csv، transactions-…csv؛ ۱۴ فایلِ آخرِ هر نوع می‌ماند. # توجه: نسخه‌ی کامل تا چند دقیقه‌ی WAL عقب‌تر از ۲۴۹ می‌شود، ولی WALِ رسیده همه اعمال می‌شود. set -euo pipefail # ROOT/BIN از یونیت می‌آیند؛ پیش‌فرض‌ها همان بکاپِ ۲۴۹ است (یونیت‌های zareian-pg216-* برای سرورِ جدید). ROOT="${PGB_ROOT:-/home/administrator/zareian-pgbackup}" BIN="${PGB_BIN:-/usr/lib/postgresql/14/bin}" OUT="$ROOT/payment-log" mkdir -p "$OUT" # دیسکِ این ماشین مشترک است؛ زیرِ ۳ گیگ فضای آزاد، شروع نمی‌کنیم. free_kb=$(df --output=avail -k "$ROOT" | tail -1) [ "$free_kb" -gt 3000000 ] || { echo "disk too full ($free_kb KB free); skipping" >&2; exit 1; } latest=$(ls -1d "$ROOT"/base/2* | tail -1) work=$(mktemp -d "$ROOT/export-events.XXXXXX") trap '"$BIN/pg_ctl" -D "$work/data" -m immediate stop >/dev/null 2>&1 || true; rm -rf "$work"' EXIT cp -a "$latest" "$work/data" mkdir "$work/wal" cp "$ROOT"/wal/* "$work/wal/" for f in "$work"/wal/*.partial; do [ -e "$f" ] && mv "$f" "${f%.partial}"; done cat > "$work/data/postgresql.conf" < "$work/data/pg_hba.conf" : > "$work/data/postgresql.auto.conf" touch "$work/data/recovery.signal" "$BIN/pg_ctl" -D "$work/data" -l "$work/log" -w -t 600 start >/dev/null for _ in $(seq 120); do [ "$("$BIN/psql" -h "$work" -U postgres -d zareian_mathapp -Atc 'select pg_is_in_recovery()')" = f ] && break sleep 1 done stamp=$(date -u +%Y%m%dT%H%M%SZ) q() { "$BIN/psql" -h "$work" -U postgres -d zareian_mathapp -c "\\copy ($1) to '$2' csv header"; } q "select id, created_at, order_id, user_id, provider, event, detail from payment_paymentevent order by id" "$OUT/payment-events-$stamp.csv" q "select id, created_at, user_id, plan_id, plan_title, amount, status, provider, gateway_authority, subscription_id from payment_order order by id" "$OUT/orders-$stamp.csv" q "select id, created_at, order_id, gateway, gateway_ref_id, status, paid_at from payment_transaction order by id" "$OUT/transactions-$stamp.csv" chmod 600 "$OUT"/*-"$stamp".csv for kind in payment-events orders transactions; do ls -1t "$OUT/$kind"-*.csv | tail -n +15 | xargs -r rm -f -- done echo "wrote $OUT/*-$stamp.csv from base $(basename "$latest")"