ThinkRoot

bine ați navigat pe insula mea de pe internet

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.

⬅ The one before
Cum am dat acces la serverul de acasă de oriunde în lume, fără să deschid niciun port

Up next ➡
Nu orice loc de muncă poate fi înlocuit de AI