Articol Gazduire

Backup hosting - strategie 3-2-1 explicată pentru IMM

Trei discuri hard drive stivuite în navy cu accente portocalii, ilustrând strategia de backup 3-2-1 pentru hosting

Backup-ul este una dintre cele mai prost înțelese părți ale infrastructurii unei firme mici. Toată lumea știe ca "ar trebui" sa aibă backup, dar in practica vad acelasi tipar la audit: copia se face automat undeva, nimeni nu testează restore-ul, si in ziua in care este nevoie, fie nu există, fie este corupt, fie nu poate fi restaurat.

In termeni simpli: backup-ul nu este un fisier, este un proces. Articolul iti arata cum sa setezi acel proces minim viable pentru un IMM, fara enterprise backup software de 500 EUR/luna.

Daca nu ai inca decis hostingul, citeste cum alegi gazduire web pentru magazin online si cum alegi hosting pentru site mic. Pentru securitatea transportului datelor, vezi SSL pentru site mic - ghid.

Regula 3-2-1 explicata pentru IMM

Trei cifre, trei reguli:

  • 3 copii ale datelor (1 originala + 2 backup-uri)
  • 2 medii diferite (ex: disk local + object storage cloud)
  • 1 copie offsite (alt centru de date sau locatie fizica diferita)

In practica pentru un magazin WooCommerce pe VPS: original pe NVMe-ul serverului + copie zilnica DB pe object storage BackBlaze + copie saptamanala completa pe NAS-ul din birou. Trei copii, doua medii (cloud + disk fizic), una offsite (NAS-ul nu este la furnizorul de hosting).

Variantele moderne: 3-2-1-1-0 si 4-3-2

Veeam si Backblaze au adaugat reguli noi dupa ce ransomware a inceput sa cripteze inclusiv backup-urile:

  • 3-2-1-1-0: 3 copii, 2 medii, 1 offsite, 1 immutable (write-once-read-many), 0 erori la verificare integritate
  • 4-3-2: 4 copii, 3 medii, 2 offsite (pretentii compliance ridicate, ex: PCI-DSS Level 1)

Pentru IMM tipic, 3-2-1-1-0 este sweet spot-ul. Object storage providers (BackBlaze B2, Wasabi, AWS S3) ofera Object Lock - flag care impiedica stergerea pana la o data anume (~0,005 USD/GB/luna extra). Un atacator cu API key furat nu poate face damage retrospectiv in fereastra de lock.

De ce backup-ul de la furnizor NU este de ajuns

Aproape orice furnizor de hosting decent (Hostico, THC, cyberfolks, SiteGround) face backup-uri zilnice incluse. Multi IMM se opresc aici si bifeaza "backup - done". Greseala.

Backup-ul host-level este fragil prin design, din 4 motive:

  1. Provider failure: furnizorul intra in faliment, este cumparat sau migreaza infrastructura si pierde date (ex: Code Spaces, decedat in 12 ore dupa AWS account compromise).
  2. Account compromise: cineva intra in cPanel si sterge atat site-ul cat si backup-urile (sunt in acelasi panou).
  3. Ransomware: malware cripteaza live data si backup-urile montate (snapshot pe acelasi disk, NFS share, samba mount). Ransomware moderne ataca backup-urile direct.
  4. Accidental delete propagated: stergi o tabela in WP-admin si backup-ul next-day suprascrie copia buna. Daca retention este 7 zile si descoperi problema dupa 10, ai pierdut totul.

Battle-tested: un magazin Magento pierdut complet in 2024 - atacator intrat prin plugin vulnerabil, sters DB, dupa 7 zile backup-urile host au expirat. Singura copie: export manual pe laptop-ul devului. Restore: 2 saptamani, ~40.000 EUR vanzari pierdute.

Concluzia: backup-ul host-level este Layer 1. Ai nevoie de Layer 2 (external) si Layer 3 (offsite).

Ce trebuie sa salvezi (lista completa)

Multi IMM salveaza doar "site-ul" si uita componente critice:

  • Fisiere aplicatie: wp-content/uploads/, teme custom, plugin-uri custom, cod sursa
  • Baza de date: MySQL/PostgreSQL/MariaDB dump complet
  • Configurari: wp-config.php, .env, nginx.conf, php.ini, .htaccess, certificate SSL
  • Email: mailboxurile IMAP (uitate constant)
  • DNS zone export: zona completa cu MX, TXT, SPF, DKIM, DMARC, CNAME
  • Logs: minim 30 zile access + error log
  • Code repository: remote-ul Git nu trebuie sa fie pe acelasi server

Dependency: daca DNS-ul este pe nameservers-urile providerului si providerul moare, reconstructia zonei din memorie inseamna 24-48h downtime garantat. Pro tip dev: dig +noall +answer yourdomain.ro ANY pe toate subdomeniile critice, salvat lunar - 50 KB text care iti salveaza zile.

Frecventa si retention - tiered approach

Setup minim pentru un IMM cu magazin WooCommerce activ:

Component Frecventa Retention Storage
Baza de date Zilnic 30 zile zilnice + 12 saptamanale + 12 lunare Object storage
Fisiere uploads Saptamanal 12 saptamanale + 6 lunare Object storage
Full server Lunar 12 luni Cold storage / HDD extern
Config files La modificare (git) Forever Repository privat
Email Saptamanal 6 luni Object storage
DNS zone Lunar 12 luni Encrypted text file

Schema se numeste GFS (Grandfather-Father-Son): zilnice "son" inlocuite frecvent, saptamanale "father" pastrate mai mult, lunare "grandfather" pe termen lung.

Trade-off: cu cat retention mai lung, cost mai mare. 30 zile DB zilnice = ~30x dimensiunea unei copii. Pentru o baza WooCommerce de 500 MB = ~15 GB pe BackBlaze (~0,08 EUR/luna). Pentru 5 GB = 150 GB (~0,80 EUR/luna). Infim fata de valoarea datelor.

RPO si RTO realist

RPO (Recovery Point Objective) = cat date ai pierde. RTO (Recovery Time Objective) = cat dureaza sa fii operational.

Profil RPO RTO Strategie
Blog WordPress simplu 24h 4h DB daily, files weekly
Site firma static 7 zile 8h Full weekly, restore manual
WooCommerce activ 1h 4h DB hourly + binlog, files daily
WooCommerce mare 15 min 1h Continuous replication, hot standby
SaaS B2B 5 min 30 min Multi-region replica, automated failover

Pentru majoritatea IMM, RPO 24h + RTO 4h este realist cu unelte free/cheap.

Unde stochezi - 3 layere

Layer 1: Hosting native

cPanel JetBackup, Plesk Backup Manager, snapshot-uri VPS de la furnizor. Avantaj: zero setup, vine inclus in plan. Dezavantaj: vulnerabil la toate scenariile de mai sus (provider failure, account compromise).

Foloseste Layer 1 ca safety net pentru restore rapid din eroare umana (sterg accidental o pagina, restore din panou in 2 minute). NU te baza doar pe el.

Layer 2: Object storage extern

Aici stau backup-urile "serioase" - copia care iti salveaza viata cand restul cade. Object storage S3-compatible este standardul de facto.

💡 Pro tip dev: cauta provideri "S3-compatible" - inseamna ca poti folosi orice tool care suporta AWS SDK (rclone, restic, duplicati, borgmatic, Velero) fara vendor lock-in. Schimbi providerul mutand un endpoint URL in config, fara sa rescrii scripturile.

Comparativ cost real pentru 50 GB stocați 12 luni (preturi de referinta):

Provider Cost lunar 50GB Cost anual 50GB Cost pe 5 ani Egress (download) Note
BackBlaze B2 ~0,30 EUR ~3,60 EUR ~18 EUR 3x free, apoi 0,01 USD/GB Cel mai ieftin pay-per-use
Wasabi ~0,30 EUR ~3,60 EUR ~18 EUR Free egress Minim 1 TB facturat la planul business
Hetzner Storage Box ~0,29 EUR (BX11 100GB) ~3,50 EUR ~17,40 EUR Inclus SFTP/Samba/WebDAV, nu S3
AWS S3 Standard ~1,15 EUR ~13,80 EUR ~69 EUR 0,09 USD/GB Scump, dar enterprise-grade
AWS S3 Glacier Deep ~0,05 EUR ~0,60 EUR ~3 EUR Cost ridicat la restore Pentru arhive rare
Google Drive 100GB ~2,00 EUR ~24 EUR ~120 EUR Inclus Convenabil dar scump pentru backup
Dropbox Plus ~10 EUR (2TB) ~120 EUR ~600 EUR Inclus Nu este facut pentru backup automat

Aici este partea importantă: egress cost (cost de download) poate distruge bugetul daca restorezi des. AWS S3 Standard pare comparabil pana cand restorezi 50 GB si platesti 4,5 USD extra. BackBlaze B2 da 3x stocare free egress lunar (deci pana la 150 GB download/luna pentru 50 GB stored), ceea ce acopera majoritatea cazurilor IMM.

Recomandarea mea: BackBlaze B2 pentru backup-uri generale + Hetzner Storage Box ca mirror secundar daca vrei provider EU dedicat (GDPR-friendly fara DPA negotiation cu provider US).

Layer 3: Cold/offsite fizic

A treia copie. Optiuni:

  • HDD extern la birou (~80 EUR pentru 4TB Seagate), rotated lunar
  • NAS Synology/QNAP in casa (DS220+ ~300 EUR + 2x HDD)
  • Alt cloud provider (ex: B2 + Wasabi - dublu cloud diversification)
  • AWS Glacier Deep Archive pentru backup-uri lunare rare-restore (0,00099 USD/GB/luna)

Battle-tested: pentru un IMM cu 100k-500k EUR/an, HDD extern rotated lunar (80 EUR/4 ani = 20 EUR/an) bate al treilea layer cloud (~50-100 EUR/an).

WordPress specifics

Pentru WordPress simplu, pluginuri free + paid acopera 95% din cazuri:

  • UpdraftPlus (free DB + files; Premium 70 USD/an incremental, multi-site) - destinatii: Google Drive, Dropbox, S3, B2, FTP. Standard pentru IMM mici.
  • BlogVault (89 USD/site/an, cloud propriu) - best for managed restore + staging gratis.
  • WP STAGING (free staging; 89 USD/an backup + migration) - bun pentru staging integrat.
  • Duplicator (free archive; 99 USD/an) - best pentru migration unica.

Setup minim WordPress: UpdraftPlus free + BackBlaze B2 via S3-compatible config.

Trade-off: pluginurile fac backup la nivel aplicatie (DB + uploads), NU salveaza configurarea serverului (nginx.conf, certificate, cron). Pentru VPS, completeaza cu backup la nivel sistem.

VPS si server specifics

Pentru VPS auto-gestionat, sculele de productie sunt:

  • restic (Go binary, encryption nativa AES-256, deduplication, S3/B2/SFTP backends) - recomandarea mea principala
  • borgbackup (Python, deduplication chunking, encryption, repository local sau SSH) - alternativa cu istorie mai lunga
  • rsync + cron (simplu, dar fara deduplication sau incremental real)
  • ZFS snapshots (daca rulezi ZFS pe filesystem) + zfs send la alt server
  • Btrfs snapshots + btrfs send (similar cu ZFS)

Exemplu restic backup automat la BackBlaze B2

#!/bin/bash
# /usr/local/bin/backup-restic.sh
export RESTIC_REPOSITORY="b2:my-backup-bucket:webghid-vps"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
export B2_ACCOUNT_ID="your_b2_key_id"
export B2_ACCOUNT_KEY="your_b2_application_key"

# Backup with exclude patterns
restic backup \
  /var/www \
  /etc \
  /home \
  --exclude="*.log" \
  --exclude="cache/*" \
  --tag "daily-$(date +%Y%m%d)"

# Retention: 7 daily, 4 weekly, 12 monthly
restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 12 \
  --prune

# Verify integrity (10% random sample)
restic check --read-data-subset=10%

Cron entry: 0 3 * * * /usr/local/bin/backup-restic.sh >> /var/log/restic.log 2>&1

Database dump cu mysqldump

#!/bin/bash
# /usr/local/bin/backup-mysql.sh
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_DIR

# Dump all databases with single transaction (no table lock)
mysqldump \
  --all-databases \
  --single-transaction \
  --quick \
  --routines \
  --triggers \
  --events \
  | gzip > "$BACKUP_DIR/all-databases-$DATE.sql.gz"

# Upload to B2 immediately
rclone copy "$BACKUP_DIR/all-databases-$DATE.sql.gz" \
  b2:my-backup-bucket/mysql/

# Local retention: keep 7 days
find $BACKUP_DIR -name "all-databases-*.sql.gz" -mtime +7 -delete

Pentru PostgreSQL, schimbi cu pg_dumpall -c -U postgres | gzip > ....

Cron entry: 0 2 * * * /usr/local/bin/backup-mysql.sh

Encryption pentru offsite - obligatoriu GDPR

Aici este partea importantă: orice backup care paraseste infrastructura ta (Layer 2 si 3) trebuie criptat client-side - cheia este la tine, nu la provider.

GDPR Art. 32 cere "pseudonimizare si criptare a datelor personale". Daca ai date clienti (nume, email, comenzi, IP), backup-urile in cloud trebuie criptate. Restic cripteaza by default. Pentru rsync sau mysqldump simplu, foloseste age:

# Encrypt
age -r age1xxxxxxxxxxxxxxxxxxxxxxxx backup.sql.gz > backup.sql.gz.age
# Decrypt
age -d -i ~/.age/key.txt backup.sql.gz.age > backup.sql.gz

Trade-off: cheia trebuie sa stea in afara backup-ului. Daca pierzi cheia, pierzi datele. Salveaz-o pe HDD extern + cu documentele firmei + in password manager (Bitwarden, 1Password).

Restore drill - critical step

⚠️ Backup-ul netestat = NO backup. Daca nu ai facut restore in ultimele 3 luni, nu ai backup - ai un fisier de care speri ca functioneaza.

Setup restore drill trimestrial:

  1. Provisioneaza un VPS Hetzner CX11 (~4 EUR/luna, sters dupa drill)
  2. Restoreaza ultimul backup full (fisiere + DB)
  3. Porneste cronometrul
  4. Verifica: site se incarca? login admin merge? data integrity check?
  5. Opreste cronometrul = RTO real
  6. Documenteaza in runbook

Battle-tested: prima drill la un client a descoperit ca mysqldump-ul automatic exclusese tabela wp_users (greseala in script). Backup-urile aratau OK dimensional dar login era imposibil dupa restore.

Pro tip dev: scrie restore-test.sh care face restore + curl la /wp-login.php + verifica HTTP 200 + curl pagina produs + verifica continut. Cron lunar pe VPS staging. Daca failure, primesti email.

FAQ

Cat costa un backup setup decent pentru IMM?

Pentru magazin WooCommerce cu 5 GB date: BackBlaze B2 ~3,60 EUR/an + HDD extern 4TB 80 EUR cost unic + UpdraftPlus Premium optional 70 USD/an. Total ~75-95 EUR/an (80 EUR hardware unic). Cost mediu disaster (recovery + downtime + revenue lost): 5.000-50.000 EUR. ROI absurd.

Ce restorez prima data?

Ordine prioritizata: 1) DNS (daca nu rezolva, nimic nu conteaza) - ai zone export salvat? 2) Email MX (clientii sa poata scrie) 3) Site landing page (chiar placeholder) 4) Database principal 5) Files si uploads 6) Pluginuri si configurari. Pentru magazin cu plati: checkout > catalog > account features.

Cat retention este suficient?

Standard minim: 30 zile zilnice + 90 zile saptamanale + 365 zile lunare. ANAF cere pastrare facturi 5 ani in RO, dar nu obliga backup imutabil. Pentru PCI-DSS verifica retention legal cerut.

Encryption este obligatoriu legal?

Da, in practica. GDPR Art. 32 cere "masuri tehnice adecvate", criptarea este standardul interpretat de DPA-uri. ANSPDCP romana a aplicat amenzi pentru backup-uri necryptate accesibile prin breach. Cost extra: zero (restic cripteaza default, age este free).

Trebuie immutability (Object Lock)?

Pentru IMM < 500k EUR/an: nu obligatoriu, dar recomandat (~5-10% extra peste storage normal). Pentru eCommerce, fintech, sanatate: obligatoriu. Object Lock previne stergerea retrospectiva chiar daca atacatorul compromite credentialele cloud.

Backup pe alt disk din acelasi server conteaza ca "2 medii"?

Nu strict. Snapshot ZFS pe acelasi disk = 1 mediu. Snapshot pe alt disk din acelasi server = 1.5 medii (rezista la disk failure, nu la server failure). Real 2 medii = hosting + cloud storage extern.

Cat de des restore drill?

Minimum trimestrial. Ideal lunar pentru WooCommerce activ. Drill = restore complet pe staging + verificare functionalitate + cronometru RTO. Daca nu poti restora in sub 4 ore, ai o problema operationala de rezolvat inainte de disaster.

Concluzie

Backup-ul este disciplina, nu unealta. Poti avea cel mai scump enterprise backup software si sa pierzi datele daca nu testezi restore-ul. Sau poti avea un setup de 4 EUR/luna pe BackBlaze + HDD extern + un script de 50 de linii si sa supravietuiesti orice disaster.

Setup minim recomandat pentru IMM tipic:

  • Layer 1: backup-uri zilnice host (already done)
  • Layer 2: restic la BackBlaze B2 cu retention GFS (~4 EUR/luna)
  • Layer 3: HDD extern rotated lunar (80 EUR cost unic)
  • Restore drill trimestrial pe VPS Hetzner CX11

Aici este partea importantă: niciun backup nu este perfect. RPO/RTO definite, restore drill regulat, documentation in runbook. Asta este diferenta intre "am backup" si "am business continuity".

Pe scurt: regula 3-2-1 functioneaza. Restic + B2 + HDD extern + cron + restore drill = battle-tested pentru 95% din cazuri IMM.

Surse

  • https://www.backblaze.com/blog/the-3-2-1-backup-strategy/
  • https://www.veeam.com/blog/321-backup-rule.html
  • https://restic.readthedocs.io/
  • https://www.borgbackup.org/
  • https://age-encryption.org/
  • https://www.hetzner.com/storage/storage-box
  • https://updraftplus.com/
  • https://gdpr-info.eu/art-32-gdpr/