📍 المقالة الرئيسية: Outline 2026.
Outline هو الذاكرة المؤسسية لشركتك: إجراءات، runbooks، تقارير، وثائق منتج. فقدانها كارثة تشغيلية. هذا الدرس يفصل إجراء النسخ الاحتياطي 3-2-1 مع restic مشفر إلى Backblaze B2، واختبار استعادة شهري إلزامي.
المتطلبات
Outline في الإنتاج ببيانات حقيقية. حساب Backblaze B2 أو MinIO ثانوي. المستوى: متوسط. الوقت: ساعة + 30 دقيقة شهرياً.
الخطوة 1 — تحديد العناصر للنسخ
- PostgreSQL: كل الوثائق، المستخدمين، الصلاحيات، تاريخ النسخ.
- MinIO bucket outline: صور، ملفات مرفقة.
- Redis: جلسات، cache (قابل للتجدد).
- متغيرات البيئة: SECRET_KEY، تكوين OIDC.
الخطوة 2 — تهيئة restic repository
export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/outline-backup-prod"
export AWS_ACCESS_KEY_ID="votre-keyID-B2"
export AWS_SECRET_ACCESS_KEY="votre-applicationKey-B2"
export RESTIC_PASSWORD="passphrase-très-très-forte-unique"
restic init
الخطوة 3 — سكربت نسخ Postgres
#!/bin/bash
set -euo pipefail
TS=$(date +%Y%m%d-%H%M%S)
TMP=/tmp/outline-pg-$TS
docker exec outline-db pg_dump -U outline -d outline -F c -f /tmp/outline-$TS.dump
docker cp outline-db:/tmp/outline-$TS.dump $TMP.dump
restic backup $TMP.dump --tag outline-db --tag prod
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
rm -f $TMP.dump
curl -s "https://ntfy.sh/votre-topic" -d "Outline DB backup OK $TS"
الخطوة 4 — سكربت نسخ MinIO
#!/bin/bash
mc mirror minio-prod/outline /tmp/outline-files/
restic backup /tmp/outline-files --tag outline-files --tag prod
restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 24 --prune
rm -rf /tmp/outline-files
الخطوة 5 — جدولة Cron
0 */6 * * * /srv/scripts/outline-backup-db.sh
0 4,16 * * * /srv/scripts/outline-backup-files.sh
0 5 * * 0 restic check --read-data-subset=10%
الخطوة 6 — اختبار استعادة شهري
restic snapshots --tag outline-db | tail -5
restic restore latest --tag outline-db --target /tmp/restore
docker run -d --name pg-test -e POSTGRES_PASSWORD=test postgres:16
sleep 10
docker cp /tmp/restore/tmp/outline-*.dump pg-test:/tmp/
docker exec pg-test pg_restore -U postgres --create -d postgres /tmp/outline-*.dump
docker exec pg-test psql -U postgres -d outline -c "SELECT COUNT(*) FROM documents;"
الخطوة 7 — توثيق runbook
Wiki داخلي (في Outline نفسه!) مع: URL repository B2، مرجع Vaultwarden لـ RESTIC_PASSWORD، إجراء استعادة كامل، تاريخ آخر اختبار ناجح، جهة اتصال طوارئ.
الخطوة 8 — استعادة في حالة كارثة
إذا دُمِّر خادم Outline:
- توفير VPS Hetzner CX22 جديد.
- تثبيت Coolify + Outline.
- تكوين متغيرات env (SECRET_KEY) من Vaultwarden.
- Restic restore Postgres dump → docker exec outline-db pg_restore.
- Restic restore ملفات MinIO → mc mirror.
- تحديث DNS إذا تغير IP.
احسب 1 إلى 3 ساعات حسب الحجم.
الأخطاء الشائعة
| الخطأ | الحل |
|---|---|
| نسخة احتياطية تالفة | استخدم -F c format custom |
| كلمة سر restic مفقودة | 3 نسخ مستقلة |
| اختبار استعادة يفشل | استعد على نفس إصدار Postgres |
التكيف مع السياق
تكلفة Backblaze: 200 GB = 1.20 USD/شهرياً. Egress مجاني Cloudflare. اختبار على Raspberry Pi محلي.
دروس الإخوة
الأسئلة المتكررة
Restic vs borgbackup؟ Restic يدعم S3 أصلياً.
RPO مقبول؟ 6 ساعات لـ wiki قياسي.