Docs: app logs archived nightly and kept forever on the backup server

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 17:56:12 +03:30
parent 3559c43902
commit 78c3669119
2 changed files with 19 additions and 0 deletions

View File

@@ -569,6 +569,9 @@ anyone who can read this repo can forge a token for any user.**
- **دفترِ خرید** (`payment.PaymentEvent`، از ۲۰۲۶-۱۰-۱۳، `44ad2ea`): هر قدمِ خرید یک ردیف؛ با WAL به ۲۴۷ می‌رود و هر ۶ ساعت
`zareian-pg-export-events` آن را (با سفارش/تراکنش) CSV در `~/zareian-pgbackup/payment-log/` می‌کند. سنجیده: کال‌بکِ جعلی روی ۲۴۹ → ردیف → CSVِ ۲۴۷.
نسنجیده: یک خریدِ واقعی تا آخر. شرح: `docs/operations.md` «دفترِ خرید».
- **لاگِ برنامه برای همیشه** (از ۲۰۲۶-۱۰-۱۳، `3559c43`): `LOG_FILE_ROTATION=external` در `.env`ِ ۲۴۹ (بکاپ:
`.deploy-backups/env-before-log-rotation-20261013-175453`)؛ آرشیوِ فشرده‌ی شبانه روی ۲۴۹ (۳۰ روز) و کشیدنِ ساعتی به
`~/zareian-pgbackup/app-logs/`ِ ۲۴۷ (هرگز پاک نمی‌شود) با کلیدِ forced-command. شرح: `docs/operations.md` «لاگِ برنامه».
- **سنجیده (۲۰۲۶-۱۰-۱۰):** کلید شِل نمی‌گیرد و تونل به پورتِ دیگر رد می‌شود؛ `restore-check.sh` روی ۲۴۷ شمارش و آخرین
زمانِ کاربر/ورود/سفارش/تراکنش/تغییرِ وضعیت را برابرِ ۲۴۹ داد؛ یک ردیفِ آزمایشی که بعد از نسخه‌ی کامل روی ۲۴۹ نوشته شد
۲ ثانیه بعد در بازیابیِ ۲۴۷ بود (جدولش پاک شد). **نسنجیده:** ری‌بوتِ ۲۴۷، قطعیِ طولانی تا `lost`، اجرای خودکارِ timer

View File

@@ -95,6 +95,22 @@ curl -i https://mathapi.tadrisino2.ir/api/health
`payment-events-*`، `orders-*`، `transactions-*`؛ ۱۴ تای آخرِ هر نوع می‌ماند. شکستش در
`journalctl -u zareian-pg-export-events`ِ ۲۴۷. زیرِ ۳ گیگ فضای آزاد اجرا نمی‌شود.
### لاگِ برنامه (`app.log`): برای همیشه روی ۲۴۷
با `LOG_FILE_ROTATION=external` در `.env`ِ ۲۴۹ برنامه لاگ را پاک نمی‌کند (`WatchedFileHandler`). هر شب ۰۰:۰۵
`zareian-applog-archive.timer` (۲۴۹) با `ops/applogs/archive-app-log.sh` فایل را به `logs/archive/app-<UTC>.log.gz`
می‌برد و فشرده می‌کند؛ هر ساعت `zareian-applog-pull.timer` (۲۴۷) با `bin/pull-app-logs.sh` فایل‌های تازه را به
`~/zareian-pgbackup/app-logs/` می‌آورد (`gzip -t` پیش از نگه‌داشتن) و **هرگز پاک نمی‌کند** (تصمیمِ مالک ۲۰۲۶-۱۰-۱۳).
روی ۲۴۹ فقط ۳۰ روز می‌ماند و فقط فایلی پاک می‌شود که ۲۴۷ گرفتنش را تأیید کرده (`.shipped`).
دسترسی: کلیدِ `~/.ssh/zareian_applogs`ِ ۲۴۷ در `authorized_keys`ِ ۲۴۹ با
`restrict,command="…/ops/applogs/serve-archive.sh"` است: فقط `list`، `get NAME`، `ack NAME`؛ شِل و پورت ندارد
(سنجیده: `id` و `cat /etc/passwd` → `bad request`). بکاپِ `authorized_keys` پیش از افزودن کنارش است.
حجم (برآورد، نه سنجش): لاگِ JSON حدودِ ۱۵ برابر فشرده می‌شود (۷۰۰ک → ۴۰ک در اولین اجرا)؛ با ۶۰۰ کاربرِ فعال
حدودِ ۳۰ مگِ خام و ۲ تا ۳ مگِ فشرده در روز، یعنی حدودِ ۱ گیگ در سال روی ۲۴۷. اگر آرشیوِ شبانه بخوابد و
`app.log` از ۲۵۶ مگ بگذرد، `/api/health` هشدار می‌دهد. خواندن: `zcat app-*.log.gz | grep user_id=26`.
### کپیِ زنده چطور کار می‌کند
Postgres هر تغییر را اول در یک دفترِ پیوسته (WAL) می‌نویسد. سرورِ ۲۴۷ این دفتر را با ابزارِ خودِ Postgres