Backup automat pentru HomeLab / Server în cloud
Am serviciile self-hosted de care am mai vorbit în alte articole, dar nu aveam niciun backup. Dacă se strica ceva - un disk, o actualizare proastă, o greșeală - pierd tot: bookmark-urile, feed-urile RSS, documentele din Paperless, parolele din Vaultwarden. Nu era o situație acceptabilă.
Aveam nevoie de un sistem care să facă backup automat, să cripteze datele înainte să le trimită în cloud și să nu necesite intervenție manuală. Am ajuns la o soluție care combină un script bash, GPG pentru criptare și rclone pentru upload în MEGA.
Ce trebuie salvat
Serviciile Docker stochează datele în două moduri: volume Docker (pentru SQLite și fișiere uplodate) și o bază de date PostgreSQL (Domain Locker). Pe lângă date, am inclus în backup și fișierele docker-compose.yml din /opt/services/ - dacă trebuie să reconstruiesc serverul de la zero, am nevoie și de configurații, nu doar de date.
Lista completă: volumele Docker pentru Vaultwarden, FreshRSS, Wallabag, Linkding, Paperless-ngx, Scrutiny și Booktracker, dump PostgreSQL pentru Domain Locker și toate fișierele docker-compose.yml.
Cum funcționează
Scriptul face trei lucruri în ordine: copiază volumele și face dump la PostgreSQL într-un director temporar, arhivează totul într-un .tar.gz și criptează cu GPG, apoi uploadează în MEGA prin rclone și șterge fișierele temporare locale. La final păstrează doar ultimele 4 backup-uri în cloud.
Criptarea cu GPG
Am generat o cheie GPG dedicată pentru backup:
gpg --full-generate-key
Scriptul criptează arhiva cu această cheie înainte de upload. Cheia privată am exportat-o în altă parte, criptată cu o parolă separată - fără ea arhivele nu pot fi decriptate.
gpg --recipient "email@exemplu.com" \
--output backup.tar.gz.gpg \
--encrypt backup.tar.gz
Configurarea rclone pentru MEGA
rclone suportă MEGA nativ și configurarea se face o singură dată:
rclone config
La întrebările fișate am răspuns astfel: n pentru remote nou, numele remote-ului (ex. mega), mega ca tip de storage, email și parolă cont MEGA, iar la restul întrebărilor răspunsul este opțional - am dat Enter la sfârșit.
Automatizarea cu cron
Backup-ul rulează în fiecare duminică la ora 4 noaptea - nu a fost nevoie să dau restart după salvarea crontab-ului:
0 4 * * 0 /opt/scripts/backup.sh
Restaurarea
gpg --decrypt backup.tar.gz.gpg | tar -xzf - -C /opt/restore/
Am testat restaurarea înainte să consider sistemul funcțional.
Dacă vrei să folosești scriptul
Scriptul e adaptat la structura serverului meu, deci câteva lucruri trebuie modificate: SERVICES_DIR, GPG_RECIPIENT, RCLONE_REMOTE, KEEP_BACKUPS, numele containerelor și al bazei de date PostgreSQL. Înlocuiește și toate aparițiile numelui serverului cu numele tău (search & replace). Volumele pot fi în locuri diferite - verifică cu docker volume ls.
Scriptul este disponibil pe Codeberg.