← شروع آموزش

WIUNIX ACADEMY

پشتیبان‌گیری رمزگذاری‌شده با restic و آزمون بازیابی در محیط جدا

صفحهٔ 2 از 3؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Rocky Linux 9بررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من7 مقدار قابل‌تغییر
05

قدم بعدی

فقط مخزن تازهٔ تأییدشده را مقداردهی کنید

پس از تأیید نبود مقصد و نگه‌داری اطلاعات بازیابی، مخزن رمزگذاری‌شده را بسازید. اگر از قبل وجود دارد، توقف و مالکیت آن را بررسی کنید؛ برای دورزدن خطای اتصال فایل رمز را عوض نکنید یا مخزن دیگری نسازید. دو متغیر محیطی را در پنل‌های بعد هم نگه دارید؛ آن‌ها نشانی فایل رمز را دارند، نه خود رمز را.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

unset RESTIC_PASSWORD RESTIC_PASSWORD_COMMAND
export RESTIC_REPOSITORY='sftp:backup@backup.example.com:/srv/restic/academy-repo'
export RESTIC_PASSWORD_FILE='/home/operator/academy-restic-private/repository-password'
restic init
restic cat config
restic snapshots
از کجا بدانم درست انجام شد؟

مخزن تازه در همان مقصد مورد تأیید ساخته شده باشد و رمز در خروجی یا آرگومان ظاهر نشده باشد.

06

قدم بعدی

از خروجی ثابت، فهرست هش فایل‌ها را تهیه کنید

فرایندهایی که این فایل‌ها را تغییر می‌دهند باید در تمام مدت ساخت فهرست و پشتیبان‌گیری متوقف بمانند یا از خروجی بومیِ تغییرناپذیر استفاده کنید. هش فقط بایت فایل را می‌سنجد؛ مالکیت، ACL، ویژگی‌های افزوده یا بازیابی کاربردی را ثابت نمی‌کند. فهرست بیرون منبع می‌ماند تا ناخواسته وارد همان snapshot نشود. نام فایل‌ها ممکن است حساس باشد؛ فهرست را خصوصی نگه دارید. اگر هر بخش از ساخت فهرست با خطا روبه‌رو شد، از آن برای تأیید نسخهٔ پشتیبان استفاده نکنید.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

set -o pipefail
(set -C; : > '/home/operator/academy-restic-private/source-sha256.txt') || exit 1
(cd '/srv/backup-export' && find . -xdev -type f -print0 | sort -z | xargs -0 -r sha256sum --) > '/home/operator/academy-restic-private/source-sha256.txt' || exit 1
test -s '/home/operator/academy-restic-private/source-sha256.txt' || { printf '%s\n' 'No regular files: stop and review source'; exit 1; }
از کجا بدانم درست انجام شد؟

فهرست کامل و بدون خطای فایل‌های معمولی ساخته شود و بیرون منبع بماند؛ فایل ناقص حتی اگر خالی نباشد پذیرفته نیست.

07

قدم بعدی

یک پشتیبان بگیرید و شناسهٔ کامل همان snapshot را ثبت کنید

این مرحله روی مخزن دور snapshot رمزگذاری‌شده می‌نویسد. one-file-system فایل‌سیستم‌های سوارشدهٔ زیر منبع را کنار می‌گذارد؛ ابتدا آن‌ها را شناسایی کنید و اگر لازم‌اند منبع مستقل و صریح برایشان تعریف کنید. کد خروج غیرصفر، از جمله وضعیت پشتیبان ناقص، یعنی این نسخهٔ پشتیبان را نباید سالم و کامل اعلام کنید. خلاصهٔ JSON خروجی عملیاتی خصوصی است و شاهد عمومی نگارش مقاله نیست.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

unset RESTIC_PASSWORD RESTIC_PASSWORD_COMMAND
export RESTIC_REPOSITORY='sftp:backup@backup.example.com:/srv/restic/academy-repo'
export RESTIC_PASSWORD_FILE='/home/operator/academy-restic-private/repository-password'
(set -C; : > '/home/operator/academy-restic-private/backup-result.json') || exit 1
restic backup '/srv/backup-export' --host 'app1' --tag academy-restore --one-file-system --json > '/home/operator/academy-restic-private/backup-result.json'
backup_status=$?
test "$backup_status" -eq 0 || { printf 'Backup failed: %s\n' "$backup_status"; exit 1; }
python3 - <<'PY'
import json
from pathlib import Path
p=Path('/home/operator/academy-restic-private')
rows=[json.loads(line) for line in (p/'backup-result.json').read_text().splitlines() if line.strip()]
summaries=[r for r in rows if r.get('message_type')=='summary']
assert len(summaries)==1 and summaries[0].get('snapshot_id'), 'No unique successful summary'
snapshot=summaries[0]['snapshot_id']
assert len(snapshot)==64 and all(c in '0123456789abcdef' for c in snapshot), 'Invalid snapshot ID'
with (p/'snapshot-id').open('x') as f:f.write(snapshot+'\n')
print('Exact snapshot ID retained in protected file')
PY
از کجا بدانم درست انجام شد؟

پشتیبان با کد خروج صفر تمام شود و شناسهٔ کامل snapshot از همان خلاصهٔ موفق ثبت شده باشد.

08

قدم بعدی

بررسی ساختار مخزن را از خواندن همهٔ داده‌ها جدا کنید

snapshot دقیق را بخوانید و بررسی فراداده را انجام دهید. check معمولی همهٔ بسته‌های داده را نمی‌خواند و رمزگشایی نمی‌کند. خواندن کامل با read-data ممکن است زمان و هزینهٔ انتقال زیادی داشته باشد؛ حجم و بودجه را با مسئول مخزن هماهنگ کنید. بررسی بخشی فقط همان بخش مستند را پوشش می‌دهد و تأیید کل داده نیست.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

unset RESTIC_PASSWORD RESTIC_PASSWORD_COMMAND
export RESTIC_REPOSITORY='sftp:backup@backup.example.com:/srv/restic/academy-repo'
export RESTIC_PASSWORD_FILE='/home/operator/academy-restic-private/repository-password'
snapshot=$(cat '/home/operator/academy-restic-private/snapshot-id')
restic snapshots "$snapshot"
restic check
# Optional only after capacity/transfer-budget review:
restic check --read-data
از کجا بدانم درست انجام شد؟

شناسهٔ snapshot و محدودهٔ بررسی ثبت شوند؛ نتیجهٔ check معمولی، خوانده‌شدن همهٔ داده‌ها معرفی نشود.

09

قدم بعدی

همان snapshot را در پوشه‌ای تازه و جدا بازیابی کنید

بازیابی روی میزبان محلی می‌نویسد و ممکن است فضای زیادی مصرف کند. اگر مسیر یا ظرفیت تغییر کرده، کنترل‌های قبلی را تکرار کنید. پوشه را انحصاری بسازید تا هرگز مسیر موجود مقصد بازیابی نشود. مسیر مطلق منبع زیر مقصد بازسازی می‌شود؛ بنابراین مسیر بازیابی‌شده از کنارهم‌قرارگرفتن restore_dir و source_dir به دست می‌آید. مقصد را به مسیر برنامهٔ زنده اشاره ندهید.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

unset RESTIC_PASSWORD RESTIC_PASSWORD_COMMAND
export RESTIC_REPOSITORY='sftp:backup@backup.example.com:/srv/restic/academy-repo'
export RESTIC_PASSWORD_FILE='/home/operator/academy-restic-private/repository-password'
mkdir -m 700 '/srv/academy-restic-restore' || exit 1
snapshot=$(cat '/home/operator/academy-restic-private/snapshot-id')
restic restore "$snapshot" --target '/srv/academy-restic-restore' --verify
از کجا بدانم درست انجام شد؟

بازیابی فقط زیر پوشهٔ تازه تمام شود و فایل‌های برنامهٔ زنده تغییری نکرده باشند.

10

قدم بعدی

فایل‌ها را مقایسه کنید و سپس بازیابی خود برنامه را بسنجید

همهٔ فایل‌های معمولیِ فهرست هش را در منبع بازیابی‌شده بررسی کنید. این کار وجود فایل اضافه یا همهٔ ویژگی‌های فراداده را نمی‌سنجد؛ تعداد فایل و مجوزها و ACL لازم را جداگانه مقایسه کنید. اگر منبع خروجی پایگاه داده است، آن را با ابزار بومی در پایگاه دادهٔ جدا وارد و سلامت کاربردی را بررسی کنید. نمونهٔ تمرین را به صف پیام یا ارسال بیرونی محیط عملیاتی وصل نکنید.

bash

خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید

cd '/srv/academy-restic-restore/srv/backup-export' || exit 1
sha256sum --check '/home/operator/academy-restic-private/source-sha256.txt' || exit 1
find . -xdev -type f -printf '.' | wc -c
find '/srv/backup-export' -xdev -type f -printf '.' | wc -c
از کجا بدانم درست انجام شد؟

تمام هش‌ها موفق باشند، تعداد فایل‌ها و ویژگی‌های ضروری بررسی شوند و اگر بازیابی کامل خود برنامه هنوز آزموده نشده است، آن را در گزارش بنویسید.

همهٔ آموزش‌های آکادمی ↗