Strategia de backup pentru serverul dvs.
De ce copiile de rezervă sunt responsabilitatea dvs., ce salvați, unde le păstrați, cum le automatizați cu cron, restic sau rsync și cum testați restaurarea.
Pe această pagină
BLACKBOX nu face copii de rezervă automate ale serverului dvs. Butonul „Backup” de pe cardul serverului, în pagina „Serverele mele” a panoului app.blackbox.md (app.blackbox.md/my-servers; din blackbox.md: „Contul meu” → „Panou de administrare” → „Serverele mele”), nu este activ. Ghidul arată ce salvați, unde păstrați copiile, cum le automatizați și cum verificați că le puteți restaura. Toate comenzile se rulează pe server, prin SSH, ca root.
Disponibil pentru: titularul unui VPS sau al unui server dedicat BLACKBOX, cu acces root prin SSH: Conectarea la server prin SSH (Windows, macOS, Linux). Comenzile sunt pentru Ubuntu, Debian, AlmaLinux și CentOS Stream.
Cine răspunde de copiile de rezervă
Pe server aveți acces root și controlați tot ce rulează pe el, deci răspundeți și de copiile de rezervă ale datelor: Responsabilitatea pentru datele de pe server și backup. Capitolul 9 „Limitarea răspunderii” din Termenii și condițiile prevede că „BLACKBOX nu răspunde pentru daune indirecte, pierdere de profit, pierderi de date sau întreruperi de activitate suferite de Client sau terți”.
În panou nu există copii automate și nici snapshot-uri. Dacă apăsați „Backup” pe cardul serverului, apare „Se încarcă…”, apoi mesajul backup_extra_disabled: serviciul de backup automat nu este disponibil. Serverul și datele de pe el nu sunt afectate. Vedeți Pagina „Serverele mele”: cardul serverului.
Important Un server șters cu „Șterge definitiv” sau prin anularea comenzii nu mai poate fi recuperat. Singurele copii ale datelor sunt cele pe care le-ați făcut dvs., în afara serverului.
Regula 3-2-1
| Regula | Ce înseamnă | Exemplu |
|---|---|---|
| 3 copii | datele originale și încă două copii | site-ul și baza de date de pe server, copia restic, copia de pe calculatorul dvs. |
| 2 suporturi diferite | copiile nu stau pe același disc sau în același sistem de stocare | discul serverului și un serviciu de stocare de obiecte |
| 1 copie în altă locație (offsite) | cel puțin o copie complet separată de server | stocare la alt furnizor sau un NAS în birou |
O copie într-un alt director al aceluiași server nu este backup: dispare odată cu serverul dacă acesta este șters, compromis sau nu mai pornește.
Ce salvați
| Ce | Unde se află de obicei | Cum îl salvați |
|---|---|---|
| Fișierele site-urilor și ale aplicațiilor, încărcările utilizatorilor | /var/www, /home, /srv, /opt |
copiați directoarele |
| Bazele de date MariaDB, MySQL, PostgreSQL | în serviciul de baze de date de pe server | dump (mysqldump, pg_dump), vedeți pasul 1 |
| Configurația serverului: nginx, Apache, PHP, SSH, certificatele Let's Encrypt | /etc |
copiați tot /etc |
Fișierele .env și configurațiile aplicațiilor |
în directorul fiecărei aplicații | odată cu directorul aplicației |
Docker: volumele, docker-compose.yml, .env |
/var/lib/docker/volumes și directorul proiectului |
volumele cu fișiere; pentru bazele de date din containere, dump |
| Sarcinile cron | /etc/crontab, /etc/cron.d, /var/spool/cron |
odată cu /etc și /var/spool/cron |
Scripturile și cheile din directorul personal al lui root |
/root |
copiați directorul |
Nu copiați fișierele bazei de date (/var/lib/mysql, /var/lib/postgresql, /var/lib/pgsql) cât timp baza rulează: copia poate fi inconsistentă și baza nu mai pornește din ea. La fel pentru volumele Docker ale bazelor de date: faceți dump cu comanda bazei, rulată în container. Exemplu pentru PostgreSQL, ca rând în scriptul de la pasul 1:
docker exec NUME_CONTAINER pg_dump -U NUME_UTILIZATOR -Fc NUME_BD > "$DIR/NUME_BD-$DATA.dump"Pentru MariaDB sau MySQL din container, folosiți la fel mysqldump (în imaginile MariaDB recente, mariadb-dump), cu utilizatorul și parola din .env. Vedeți și Instalarea Docker și Docker Compose.
Nu este nevoie să salvați /proc, /sys, /dev, /run, /tmp, cache-urile, imaginile Docker (se descarcă sau se construiesc din nou) și pachetele sistemului (se reinstalează). Codul aflat într-un depozit Git extern nu cere o copie separată, dacă verificați că modificările ajung acolo.
Unde păstrați copiile
| Destinație | Vă protejează când | Instrument |
|---|---|---|
| Alt server, la BLACKBOX sau la alt furnizor | serverul principal este șters, compromis sau nu mai pornește | restic prin SFTP sau rsync |
| Stocare de obiecte compatibilă S3, la alt furnizor | la fel, plus o problemă la furnizorul serverului principal | restic |
| Calculatorul dvs. sau un NAS din birou | serverul este compromis: o copie descărcată pe calculator nu poate fi ștearsă de pe server | rsync sau scp, rulat de pe calculator |
| BLACKBOX Cloud Storage | aveți nevoie de spațiu separat de server, pentru copii | la cerere, vedeți mai jos |
Pentru copia offsite din regula 3-2-1, alegeți cel puțin o destinație la alt furnizor sau la dvs. în birou. Pentru un server de backup la BLACKBOX, planurile din familia Basic au discuri mari, de până la 400 GB: Planurile VPS: cum alegeți.
BLACKBOX Cloud Storage nu se comandă online. Pe pagina blackbox.md/hosting/cloud-storage („Găzduire” → „Cloud Storage”), butonul „Comandați stocare” duce la pagina „Contacte”. Volumul, prețul și metodele de acces le primiți în oferta echipei; întrebați ce metode de acces are spațiul, ca să alegeți între restic și rsync. Vedeți Produse și configurații disponibile la cerere.
Pasul 1: dump-ul zilnic al bazelor de date, din cron
Scriptul de mai jos exportă baza de date în /var/backups/db în fiecare noapte și șterge de acolo dump-urile mai vechi de 7 zile. Pasul 2 le copiază apoi în afara serverului. Instalarea bazelor de date: Baze de date: MariaDB/MySQL și PostgreSQL.
Fișierele se editează cu nano. Dacă lipsește (AlmaLinux, CentOS Stream), instalați-l:
dnf install -y nanoCreați scriptul:
nano /usr/local/sbin/db-dump.shLipiți conținutul de mai jos, înlocuiți
NUME_BDcu numele bazei, salvați cu Ctrl+O și Enter, apoi ieșiți cu Ctrl+X:#!/bin/bash set -euo pipefail umask 077 cd / DIR=/var/backups/db DATA=$(date +%F) mkdir -p "$DIR" mysqldump --single-transaction --routines NUME_BD | gzip > "$DIR/NUME_BD-$DATA.sql.gz" find "$DIR" -type f -mtime +7 -deletePentru PostgreSQL, înlocuiți rândul cu
mysqldumpcu acesta:sudo -u postgres pg_dump -Fc NUME_BD > "$DIR/NUME_BD-$DATA.dump"Pentru mai multe baze, repetați rândul pentru fiecare. Pe MariaDB, comanda se numește și
mariadb-dump.Faceți scriptul executabil, rulați-l o dată și verificați fișierul creat:
chmod 700 /usr/local/sbin/db-dump.sh /usr/local/sbin/db-dump.sh ls -lh /var/backups/dbDacă apare
Access denied for user 'root'@'localhost', utilizatorulrootal bazei cere parolă. Puneți-o în fișierul/root/.my.cnf, cu conținutul de mai jos, apoi restrângeți accesul la fișier:[client] user=root password=PAROLA_BDchmod 600 /root/.my.cnfProgramați scriptul în fiecare noapte la 02:00 (ora serverului). Creați fișierul:
nano /etc/cron.d/db-dumpși lipiți rândul:
0 2 * * * root /usr/local/sbin/db-dump.sh >> /var/log/db-dump.log 2>&1
Fișierele din /etc/cron.d au coloana utilizatorului (root), numele lor nu conține puncte, iar ultimul rând se termină cu Enter. Caracterul % nu poate fi scris direct în rândul cron; de aceea data se calculează în script. Dacă sarcina nu rulează, verificați că serviciul cron este instalat și pornit.
Ubuntu și Debian:
apt update
apt install -y cron
systemctl enable --now cronAlmaLinux și CentOS Stream:
dnf install -y cronie
systemctl enable --now crondDump-urile ocupă spațiu pe disc. Dacă discul este mic, păstrați mai puține zile (de exemplu -mtime +3): Discul serverului este plin.
Pasul 2: copia în afara serverului cu restic
restic criptează datele pe server, înainte de trimitere, păstrează un istoric de copii (snapshot-uri) și la fiecare rulare transferă doar ce s-a schimbat. Exemplul folosește o stocare de obiecte compatibilă S3; varianta cu un alt server, prin SFTP, este în secțiunea despre rsync. Documentația oficială: restic.readthedocs.io.
Instalarea
Ubuntu și Debian:
apt update
apt install -y resticAlmaLinux și CentOS Stream (restic vine din depozitul EPEL):
dnf install -y epel-release
dnf install -y resticDepozitul și parola
La furnizorul de stocare, creați un bucket și o pereche de chei de acces. Notați adresa serviciului (endpoint), numele bucket-ului, ID-ul cheii și cheia secretă.
Generați parola depozitului și afișați-o:
mkdir -p /etc/restic chmod 700 /etc/restic openssl rand -base64 32 > /etc/restic/password chmod 600 /etc/restic/password cat /etc/restic/passwordCopiați parola afișată în managerul dvs. de parole.
Creați fișierul cu setări:
nano /etc/restic/envRESTIC_REPOSITORY=s3:https://ENDPOINT_S3/NUME_BUCKET/NUME_SERVER RESTIC_PASSWORD_FILE=/etc/restic/password AWS_ACCESS_KEY_ID=ID_CHEIE AWS_SECRET_ACCESS_KEY=CHEIE_SECRETANUME_SERVEReste un folder din bucket; dați fiecărui server folderul lui. Dacă furnizorul cere o regiune, adăugați rândulAWS_DEFAULT_REGION=REGIUNE.Restrângeți accesul la fișier, încărcați setările în sesiunea curentă și inițializați depozitul (o singură dată):
chmod 600 /etc/restic/env set -a . /etc/restic/env set +a restic initRăspunsul începe cu
created restic repository.
Risc Fără parola depozitului, copiile nu mai pot fi decriptate de nimeni, nici de BLACKBOX. Păstrați-o și în afara serverului: dacă serverul se pierde, fără ea nu puteți restaura nimic.
Scriptul de backup
nano /usr/local/sbin/restic-backup.sh#!/bin/bash
set -euo pipefail
set -a
. /etc/restic/env
set +a
restic backup /etc /root /var/www /var/spool/cron /var/backups/db --exclude-caches
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --keep-tag manual --prune| Parte | Ce face |
|---|---|
restic backup /etc /root … |
copiază directoarele din listă. Lăsați doar directoarele care există pe server (un director lipsă dă eroare) și adăugați-le pe ale dvs., de exemplu /home, /srv sau /var/lib/docker/volumes/NUME_VOLUM pentru un volum Docker cu fișiere. |
--exclude-caches |
sare peste directoarele marcate ca cache |
--keep-daily 7 --keep-weekly 4 --keep-monthly 6 |
păstrează ultimele 7 copii zilnice, 4 săptămânale și 6 lunare |
--keep-tag manual |
păstrează copiile făcute de mână cu eticheta manual |
--prune |
șterge din depozit datele care nu mai aparțin niciunei copii |
Faceți scriptul executabil, rulați-l o dată și vedeți lista de copii:
chmod 700 /usr/local/sbin/restic-backup.sh
/usr/local/sbin/restic-backup.sh
restic snapshotsRularea zilnică cu un timer systemd
Creați serviciul:
nano /etc/systemd/system/restic-backup.service[Unit] Description=Backup restic Wants=network-online.target After=network-online.target [Service] Type=oneshot Environment=HOME=/root ExecStart=/usr/local/sbin/restic-backup.shCreați timerul:
nano /etc/systemd/system/restic-backup.timer[Unit] Description=Backup restic zilnic [Timer] OnCalendar=*-*-* 03:00:00 RandomizedDelaySec=30min Persistent=true [Install] WantedBy=timers.targetActivați timerul și verificați următoarea rulare, în coloana
NEXT:systemctl daemon-reload systemctl enable --now restic-backup.timer systemctl list-timers restic-backup.timerRulați serviciul o dată și citiți jurnalul:
systemctl start restic-backup.service journalctl -u restic-backup.service -n 50
Copia pornește în fiecare zi între 03:00 și 03:30 (ora serverului), după dump-urile de la 02:00. Cu Persistent=true, o rulare ratată cât serverul a fost oprit se face la următoarea pornire.
Varianta simplă: rsync pe alt server
Dacă aveți un al doilea server, rsync copiază directoarele pe el prin SSH. rsync trebuie să fie instalat pe ambele servere. Instalarea și opțiunile lui: Transferul fișierelor pe server (scp, rsync, SFTP).
Pe serverul principal, creați o cheie SSH folosită doar pentru copii, fără parolă, ca s-o poată folosi cron:
ssh-keygen -t ed25519 -f /root/.ssh/backup_ed25519 -N "" cat /root/.ssh/backup_ed25519.pubAdăugați linia afișată în
/root/.ssh/authorized_keyspe serverul de backup. Dacă și acesta este la BLACKBOX, folosiți „Adaugă cheie SSH” de pe cardul lui: Adăugarea și ștergerea cheilor SSH pe server.Creați directorul de destinație și rulați prima copiere de mână. La prima conectare, confirmați cheia serverului de backup cu
yes:ssh -i /root/.ssh/backup_ed25519 root@IP_BACKUP "mkdir -p /backups/NUME_SERVER" rsync -aR --delete -e "ssh -i /root/.ssh/backup_ed25519" /etc /var/www /var/backups/db root@IP_BACKUP:/backups/NUME_SERVER/Cu
-R, căile se păstrează complet: pe serverul de backup apar/backups/NUME_SERVER/etc,/backups/NUME_SERVER/var/wwwși așa mai departe.Programați copierea zilnic la 03:30, în fișierul
/etc/cron.d/backup-rsync:30 3 * * * root rsync -aR --delete -e "ssh -i /root/.ssh/backup_ed25519" /etc /var/www /var/backups/db root@IP_BACKUP:/backups/NUME_SERVER/ >> /var/log/backup-rsync.log 2>&1
rsync păstrează doar ultima stare: cu --delete, un fișier șters sau stricat pe server dispare și din copie la rularea următoare. În plus, fișierele de pe serverul de backup nu sunt criptate. Pentru istoric și criptare, folosiți restic prin SFTP pe același server. Adăugați în /root/.ssh/config:
Host backup
HostName IP_BACKUP
User root
IdentityFile /root/.ssh/backup_ed25519Fișierul /etc/restic/env conține atunci doar aceste două rânduri:
RESTIC_REPOSITORY=sftp:backup:/backups/NUME_SERVER-restic
RESTIC_PASSWORD_FILE=/etc/restic/passwordRestul pașilor sunt cei din secțiunea despre restic: instalarea, parola, inițializarea, scriptul și timerul.
Criptarea copiilor din afara serverului
- restic criptează totul cu parola depozitului înainte de trimitere. Furnizorul de stocare vede doar date criptate.
- SSH, deci și
rsyncșiscp, criptează datele doar pe drum. Dacă destinația nu vă aparține, criptați fișierele înainte de copiere, de exemplu cugpgși o parolă păstrată într-un fișier (pachetulgnupgpe Ubuntu și Debian,gnupg2pe AlmaLinux și CentOS Stream):
openssl rand -base64 32 > /root/.backup-pass
chmod 600 /root/.backup-pass
gpg --batch --yes --pinentry-mode loopback --passphrase-file /root/.backup-pass --symmetric --cipher-algo AES256 -o FISIER.gpg FISIERDecriptarea:
gpg --batch --pinentry-mode loopback --passphrase-file /root/.backup-pass -o FISIER -d FISIER.gpgPăstrați și conținutul lui /root/.backup-pass în managerul de parole.
Securitate Fișierele
/etc/restic/env,/etc/restic/passwordși cheia/root/.ssh/backup_ed25519dau acces la copii; cheia dă chiar acces root la serverul de backup. Dacă serverul este compromis, atacatorul le poate folosi ca să șteargă copiile. Păstrați și o copie pe care serverul nu o poate șterge, de exemplu descărcată periodic pe calculatorul dvs.
Testați restaurarea cel puțin o dată pe lună
O copie pe care nu ați restaurat-o niciodată nu este o garanție. O dată pe lună și după orice modificare a scripturilor, restaurați într-un director temporar, nu peste datele în uz.
Încărcați setările, verificați lista de copii și integritatea depozitului:
set -a . /etc/restic/env set +a restic snapshots restic checkUltima copie trebuie să fie din ultimele 24 de ore, iar
restic checktrebuie să se termine cuno errors were found.Restaurați configurația și dump-urile într-un director temporar:
restic restore latest --target /root/restore-test --include /etc --include /var/backups/db ls -lh /root/restore-test/var/backups/dbÎncărcați dump-ul într-o bază de test și verificați tabelele și câteva înregistrări recente (de exemplu ultima comandă sau ultimul articol publicat). Rulați ultima comandă din bloc abia după verificare: ea șterge baza de test. Înlocuiți
AAAA-LL-ZZcu data din numele fișierului.MariaDB și MySQL:
mysql -e "CREATE DATABASE restore_test" gunzip < /root/restore-test/var/backups/db/NUME_BD-AAAA-LL-ZZ.sql.gz | mysql restore_test mysql -e "SHOW TABLES" restore_test mysql -e "DROP DATABASE restore_test"PostgreSQL:
sudo -u postgres createdb restore_test sudo -u postgres pg_restore -d restore_test < /root/restore-test/var/backups/db/NUME_BD-AAAA-LL-ZZ.dump sudo -u postgres psql -d restore_test -c "\dt" sudo -u postgres dropdb restore_testȘtergeți directorul temporar:
rm -rf /root/restore-test
Restaurarea ocupă spațiu pe disc, de aceea restaurați doar ce verificați (--include). Testul cel mai sigur este restaurarea completă pe un alt server, cu pornirea aplicației: este și repetiția pentru un incident real. Cu varianta rsync, copiați dump-ul înapoi de pe serverul de backup și încărcați-l la fel.
Copie suplimentară înainte de operațiile riscante
| Operația | De ce faceți o copie înainte |
|---|---|
| „Upgrade” din panou: Upgrade server: trecerea la un plan mai mare | serverul repornește pe configurația nouă, iar discul se extinde |
| „Șterge definitiv”: Ștergerea definitivă a unui server | după perioada de grație de 24 de ore, serverul și datele sunt șterse definitiv |
| „Anulează comanda” la o comandă cu server: Anularea comenzii și rambursări | serverul este șters imediat, la confirmare |
| Trecerea la o versiune majoră a sistemului: Actualizări de sistem și actualizări automate de securitate | poate opri aplicațiile sau accesul SSH |
| Reinstalarea sistemului de operare, la cerere, prin suport: Sistemele de operare disponibile | toate datele de pe server se pierd |
| Mutarea pe alt server: Mutarea unui site pe serverul BLACKBOX | aveți nevoie de o copie completă și recentă |
| Actualizarea unui CMS, a unei aplicații sau a bazei de date la o versiune nouă | modificările de date nu se pot anula fără copie |
Faceți un dump nou și o copie restic cu eticheta manual, pe care forget nu o șterge:
/usr/local/sbin/db-dump.sh
set -a
. /etc/restic/env
set +a
restic backup /etc /root /var/www /var/spool/cron /var/backups/db --exclude-caches --tag manual
restic snapshots --tag manualCând nu mai aveți nevoie de ea, ștergeți-o cu ID-ul din coloana ID:
restic forget ID_COPIE --pruneÎnainte de a șterge un server, salvați în afara lui parola depozitului și setările din /etc/restic/env: fără ele nu mai ajungeți la copii. Descărcați și o copie pe calculator, cu rsync sau scp.
Întrebări frecvente
BLACKBOX poate restaura serverul dacă am șters ceva din greșeală? Nu. Panoul nu face copii automate și nu are snapshot-uri, iar un server șters nu mai poate fi recuperat. Restaurați din copiile dvs.
Ce înseamnă mesajul backup_extra_disabled de sub butonul „Backup”?
Înseamnă că serviciul de backup automat nu este disponibil. Nu este o defecțiune a serverului, iar datele nu sunt afectate.
Cum restaurez un singur fișier șters?
Încărcați setările restic, ca la pasul 1 din testul de restaurare. Restaurați fișierul într-un director temporar, apoi copiați-l la loc. Nu restaurați direct cu --target /: suprascrieți fișierele în uz. O copie mai veche o alegeți cu ID-ul ei din restic snapshots, în locul lui latest.
restic restore latest --target /root/restore-test --include /var/www/site/config.php
cp -a /root/restore-test/var/www/site/config.php /var/www/site/config.phpAm un plan „VPS hosting” cu panou de control. Ce fac? Panoul de control instalat poate avea propria funcție de backup; întrebați suportul ce oferă: Planurile „VPS hosting” cu panou de control. Oricum, copia trebuie să ajungă în afara serverului.
Am pierdut parola depozitului restic. Ce fac?
Dacă fișierul /etc/restic/password mai există pe server, parola este acolo: salvați-o din nou în managerul de parole. Dacă parola nu mai există nicăieri, copiile din acel depozit nu mai pot fi citite. Creați atunci un depozit nou, cu altă parolă și alt folder în RESTIC_REPOSITORY, și faceți imediat o copie completă.
Pot cere echipei să configureze copiile? Dacă preferați să nu le configurați dvs., întrebați suportul despre administrarea serverului la cerere, cu ofertă separată: Servicii profesionale la cerere: administrare, DevOps, migrare.