Restic: Hamisha Backup za VPS Nje ya Seva
Jifunze kusanidi Restic kwenye Ubuntu 24.04, kutuma backup zilizotiwa encryption kupitia SFTP, kuweka systemd timer ya kila usiku na kujaribu restore.
Kwa nini backup iliyo kwenye seva hiyo hiyo si backup
Restic ni zana ya backup isiyolipishwa na yenye msimbo huria inayotuma snapshots zilizotiwa encryption na kuondolewa nakala zinazorudiwa za faili zako kwenye repository iliyo mahali pengine: VPS ya pili, mashine ya nyumbani, au object storage inayooana na S3. Mwongozo huu unasetup kwenye Ubuntu 24.04, kuanzia usakinishaji hadi repository kupitia SFTP, backup ya kwanza, systemd timer ya kila usiku, sera ya retention, na zoezi la restore linalothibitisha kuwa kila kitu kinafanya kazi. Destination lazima iwe mashine nyingine, kwa sababu nakala iliyo kwenye seva hiyo hiyo hupotea pamoja na seva inapoharibika.
backup/ directory kwenye mashine inayofanyiwa backup hukulinda dhidi ya jambo moja tu: kufuta faili kimakosa. Haiokoki baada ya disk kushindwa, kwa sababu ilikuwa kwenye disk hiyo hiyo. Haiokoki baada ya mshambulizi mwenye root, kwa sababu hufuta nakala hizo kwanza. Haiokoki baada ya kosa la akaunti linaloondoa VPS yenyewe. Kituo cha data kisicho na ufanisi zaidi duniani hufanya mzaha kuhusu tarball inayoitwa backup_final_v2_REAL iliyokaa kwenye array hiyo hiyo na data, na mzaha huo unaeleweka kwa sababu wengi wetu tumewahi kufanya hivyo. Nje ya mashine ndiyo kanuni, na restic ndiyo njia yenye usumbufu mdogo zaidi ya kuifuata.
Restic katika mawazo manne
Repository. Hapa ndipo restic huandika data. Ni directory yenye format maalum ya restic, iliyojaa blobs zilizotiwa encryption, na restic pekee ndiyo inaweza kuisoma. Usiihariri kwa mkono; wasiliana nayo kupitia commands za restic na anwani ya -r.
Snapshot. Ni picha ya files zako za backup katika wakati fulani. Kila backup run huunda snapshot, kila snapshot inaweza kurejeshwa kivyake, na kila moja hufanya kazi kama copy kamili ya data yako katika wakati huo.
Deduplication. Restic hugawanya files katika chunks zinazotambuliwa kwa maudhui, kisha hupakia chunks ambazo repository haijawahi kuona pekee. Backup ya kwanza hupakia kila kitu; kila run inayofuata hupakia takriban data iliyobadilika. Snapshot ya kila usiku ya 20 GB, ambapo 50 MB imebadilika, hugharimu takriban 50 MB. Ndiyo maana kuweka snapshots kadhaa ni nafuu.
Encryption kwa chaguo-msingi. Repository ya restic huwa na encryption kila wakati (AES-256), na kila command huhitaji password ya repository. Backup host au storage provider huona blobs zilizotiwa encryption pekee. Madhara makubwa ni haya: ukipoteza password, data hupotea kabisa, kwa kudumu na kwa muundo uliokusudiwa. Weka nakala ya password mahali pasipo server hii. Jambo hili ni muhimu kiasi kwamba litaelezwa tena mara mbili hapa chini.
Sakinisha restic kwenye Ubuntu 24.04
sudo apt update && sudo apt install -y restic
restic versionKwenye Ubuntu 24.04, hii husakinisha restic 0.16.4, huku toleo la sasa la upstream likiwa 0.19.1. Tofauti hii ipo kwa sababu toleo la LTS (long term support) hugandisha matoleo ya vifurushi vyake, na hilo halina umuhimu hapa: 0.16.4 hufanya kila kitu katika mwongozo huu. Ikiwa unataka toleo jipya zaidi kwa maboresho yake ya kasi, pakua build rasmi ya single-binary kutoka ukurasa wa GitHub releases wa mradi wa restic, ifungue kwa bunzip2, kisha isakinishe kwenye /usr/local/bin/restic; hakuna hatua nyingine ya kusakinisha restic.
Unda hazina kwenye seva nyingine kupitia SFTP
Unahitaji mashine ya kulengwa: VPS ndogo ya pili ndiyo chaguo la kawaida, na mashine yoyote yenye seva ya SSH pamoja na nafasi ya ziada kwenye diski itafanya kazi. Restic hutumia SFTP (uhamishaji wa faili kupitia SSH), kwa hiyo huhitaji kusakinisha chochote kwenye mwenyeji wa nakala rudufu. Katika mwongozo huu, mwenyeji wa nakala rudufu ni 10.0.0.12 na mtumiaji anaitwa restic. Usimpe mtumiaji huyo jina backup: Ubuntu na Debian husafirisha akaunti ya mfumo iliyohifadhiwa inayoitwa backup (uid 34, bila shell ya kuingia) kwenye kila usakinishaji, kwa hiyo adduser backup hushindwa na ssh backup@... huwekwa kwenye nologin.
Kazi ya kila usiku itaendeshwa kama root kwenye seva inayohifadhiwa nakala, kwa hiyo root inahitaji kuingia kwa kutumia key kwenye mwenyeji wa nakala rudufu. Unda key maalumu bila passphrase, kwa sababu hakuna mtu atakayekuwepo saa 3 asubuhi kuandika passphrase, kisha iinakili:
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N "" -C "web1-restic"
sudo ssh-copy-id -i /root/.ssh/id_ed25519.pub restic@10.0.0.12
sudo ssh restic@10.0.0.12 true && echo key login worksIkiwa bado hujazoea keys, Misingi ya usimamizi wa SSH keys inaeleza mfumo huu, permissions, na jinsi ya kubatilisha key baadaye.
Ifuatayo ni password ya hazina. Tengeneza password imara ndani ya faili inayoweza kusomwa na root pekee:
openssl rand -base64 32 | sudo tee /root/.restic-password
sudo chmod 600 /root/.restic-passwordSasa nakili password hiyo kwenye password manager yako kabla ya kuendelea. VPS hii ikiharibika, hazina pamoja na password hii vinaweza kurejesha kila kitu; hazina bila password hiyo haiwezi kurejesha chochote.
Anzisha hazina:
sudo restic -r sftp:restic@10.0.0.12:/srv/restic/web1 --password-file /root/.restic-password initcreated restic repository 9f3c2a1b0d at sftp:restic@10.0.0.12:/srv/restic/web1Chaguo jingine la kulengwa ni object storage inayooana na S3. Hili ndilo chaguo linalofaa ikiwa hutaki kuendesha mashine ya pili. Bucket yoyote inayooana na S3 hufanya kazi kwa njia hiyo hiyo; hubadilika tu anwani na variables mbili za credentials:
export AWS_ACCESS_KEY_ID=your-key-id
export AWS_SECRET_ACCESS_KEY=your-secret-key
sudo -E restic -r s3:https://s3.example.com/web1-backups --password-file /root/.restic-password initKila kitu baada ya init ni sawa kwa maeneo yote mawili ya kulengwa. Sehemu iliyobaki ya mwongozo huu inaonyesha anwani ya SFTP; badilisha iwe yako.
Hifadhi rudufu ya kwanza, bila kujumuisha
Hifadhi rudufu ya data ambayo huwezi kusakinisha tena, si mfumo mzima wa faili. Mfumo wa uendeshaji hurudi baada ya kusakinishwa upya; usanidi na data yako haurudi. Kwa VPS ya kawaida, hiyo inamaanisha /etc, /home, na mahali ambapo programu zako huhifadhi hali yake, kama vile /srv au /var/www. Usijumuishe cache, kwa sababu ni kubwa, hubadilika kila siku, na hujijenga upya:
sudo restic -r sftp:restic@10.0.0.12:/srv/restic/web1 --password-file /root/.restic-password backup /etc /home /srv --exclude '/home/*/.cache'Files: 4181 new, 0 changed, 0 unmodified
Added to the repository: 731.204 MiB (312.418 MiB stored)
snapshot 5b8a3f2c savedUendeshaji wa kwanza hupakia kila kitu, kwa hiyo huchukua muda. Endesha amri hiyo hiyo tena, na itakamilika kwa sekunde chache huku ikiripoti faili chache zilizobadilika na MiB chache zilizoongezwa, kwa sababu deduplication hupakia vipande vipya pekee. Orodhesha ulicho nacho:
sudo restic -r sftp:restic@10.0.0.12:/srv/restic/web1 --password-file /root/.restic-password snapshotsKila snapshot huonyesha kitambulisho, muda, na njia ilizo nazo. Vitambulisho hivyo ndivyo unavyotumia kurejesha data.
Kuendesha kazi kila usiku kwa kutumia systemd timer
Kuandika anwani ya repository kwenye kila command kunachosha, na backup unayoendesha kwa mkono huacha kufanyika ndani ya mwezi mmoja. Matatizo yote mawili yanaisha kwa script moja na timer moja. Script huweka environment variables mbili ambazo restic husoma, RESTIC_REPOSITORY na RESTIC_PASSWORD_FILE, hivyo kila command ndani yake hubaki fupi:
sudo nano /usr/local/bin/restic-backup.sh#!/usr/bin/env bash
set -euo pipefail
export RESTIC_REPOSITORY='sftp:restic@10.0.0.12:/srv/restic/web1'
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic backup /etc /home /srv --exclude '/home/*/.cache'
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic checksudo chmod 700 /usr/local/bin/restic-backup.shMistari ya forget na check imeelezwa katika sehemu mbili zinazofuata. Sasa tuweke ratiba: service ya oneshot inayoendesha script, na timer inayoianzisha saa 03:00 kila usiku. Timer ni bora kuliko mstari wa cron hapa kwa sababu mchakato huandikwa kwenye journal, na Persistent=true huendesha backup iliyokosa mara tu seva inaporudi mtandaoni baada ya kukaa chini.
# /etc/systemd/system/restic-backup.service
[Unit]
Description=Nightly restic backup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/restic-backup.sh# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Run the nightly restic backup
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.targetWasha timer, kisha endesha service mara moja kwa mkono na ufuatilie inavyofanya kazi:
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl start restic-backup.service
sudo journalctl -u restic-backup.service -fsystemctl list-timers huonyesha wakati wa utekelezaji unaofuata. Unaweza pia kuzalisha unit files hizo mbili badala ya kuziandika:
Muundo kamili wa files hizi mbili, ukiwemo muundo wa kalenda na directives za hardening ambazo service inaweza kuwa nazo, umeelezwa katika kuendesha programu kama systemd service kwenye VPS.
Hifadhi rudufu ni uvumi hadi uirejeshe
Chukulia sentensi hiyo kuwa amri ya lazima. Kazi ya kuhifadhi rudufu inayokamilika kwa mafanikio kila usiku inathibitisha tu kwamba kazi iliendeshwa; haithibitishi kwamba data yako inaweza kurejeshwa. Ukaguzi mbili huondoa pengo hilo.
Kwanza, restic check, ambayo script tayari huiendesha kila usiku. Huthibitisha muundo wa repository na index, hivyo uharibifu usioonekana kwenye host ya backup hugunduliwa usiku unaofuata badala ya siku ya kurejesha. Mara moja kwa mwezi, endesha toleo la kina zaidi, ambalo hupakua na kuthibitisha kwa njia ya cryptographic sehemu ya kumi iliyochaguliwa bila mpangilio ya data halisi:
sudo -i
export RESTIC_REPOSITORY='sftp:restic@10.0.0.12:/srv/restic/web1'
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic check --read-data-subset=10%Kwa kuwa sehemu hiyo huchaguliwa bila mpangilio kila mara, uendeshaji wa kila mwezi hupitia repository nzima hatua kwa hatua bila kuhitaji kupakua data yote.
Pili, fanya zoezi la kurejesha. Ukiwa bado kwenye root shell kutoka hapo juu, rejesha directory moja halisi kutoka snapshot ya hivi karibuni hadi eneo la scratch, kisha ilinganishe na files zinazoendelea kutumika:
restic restore latest --target /srv/restore-drill --include /etc/ssh
diff -r /etc/ssh /srv/restore-drill/etc/sshdiff kutotoa chochote kunamaanisha kwamba kila byte ilirejeshwa bila tofauti, na huo ndio ushahidi pekee unaohitajika. Futa /srv/restore-drill baadaye. Fanya zoezi hili kila mwezi, na mara moja au mbili kwa mwaka fanya toleo kamili: rejesha snapshot yote ya hivi karibuni kwenye scratch VPS, kisha hakikisha kwamba application yako inaanza kutoka humo. Siku utakayohitaji ifanye kazi ukiwa chini ya shinikizo, utataka iwe utaratibu ambao tayari umeufanya.
Uhifadhi: sahau pamoja na prune
Bila sera, snapshots zitaendelea kujikusanya na repository itaendelea kukua. Mstari wa forget wa script hutekeleza sera kila usiku: --keep-daily 7 huhifadhi snapshot moja kwa siku kwa siku saba zilizopita, --keep-weekly 4 moja kwa wiki kwa wiki nne, na --keep-monthly 6 moja kwa mwezi kwa miezi sita. Kila snapshot ambayo hailindwi na sheria husahaulika.
forget peke yake huondoa rekodi za snapshot tu; data chunks hubaki kwenye repository hadi kitu kizung'ue. Hilo ndilo linalofanywa na --prune: hutafuta chunks ambazo hazirejelewi tena na snapshot yoyote na kuzifuta. Hapo ndipo nafasi ya disk inapopatikana tena. Prune hufanya kazi halisi kwenye repository, kwa hiyo kwenye repository kubwa baadhi ya watu huendesha forget kila usiku na --prune kila wiki; kwa ukubwa wa kawaida wa VPS, kuendesha kila usiku kunatosha.
Databases: fanya dump kwanza, kisha hifadhi dump hiyo
Restic hunakili files inapozisoma, huku database ikiendelea kuandika kwenye files zake. File ya database iliyonakiliwa wakati wa kuandika hurejeshwa ikiwa imeharibika, kwa sababu nakala hiyo huchanganya pages za kabla na baada ya uandishi. Suluhisho ni la kawaida: ifanye database engine itengeneze export thabiti kwenye file, kisha iache restic ihifadhi file hiyo.
Kwa PostgreSQL, ongeza mstari wa dump mwanzoni mwa restic-backup.sh, kabla ya command ya restic backup, na ujumuishe directory ya dump kwenye paths za backup:
mkdir -p /var/backups/db
sudo -u postgres pg_dump myapp | gzip > /var/backups/db/myapp.sql.gzmysqldump hutimiza kazi hiyo hiyo kwa MariaDB na MySQL. Kwa mfano kamili wa utaratibu huu, sehemu ya backup ya Nextcloud huwasha maintenance mode, hufanya dump ya Postgres, na kunakili files kama seti moja thabiti, yaani seti ambayo restic inapaswa kuitoa kwenye server kila usiku. SQLite hutumia wazo hilo hilo kwa njia rahisi zaidi: mwongozo wa Vaultwarden husimamisha container kwa sekunde chache ili kutengeneza nakala ya baridi ya db.sqlite3, kisha archive hiyo ndiyo ambayo restic huitoa kwenye server.
FAQ
Je, nakala rudufu za restic husimbwa?
Ndiyo, kila mara. Kila repository ya restic husimbwa kwa AES-256. Hakuna hali isiyosimbwa. Kila amri inahitaji password ya repository. Mashine au provider anayehifadhi repository huwa na blobs zilizosimbwa pekee. Kwa hiyo, backup host iliyoathiriwa haifichui faili zako. Hasara yake ni ya moja kwa moja: bila password, hakuna mtu anayeweza kurejesha data. Hivyo, hifadhi nakala ya password hiyo nje ya seva.
Je, restic hufanya nakala rudufu za incremental?
Kila snapshot ya restic hufanya kazi kama backup kamili, huku ikitumia storage ya incremental. Restic hugawanya faili kuwa chunks na kupakia tu chunks ambazo repository haijahifadhi tayari. Kwa hiyo, run ya kila usiku huhamisha takribani data iliyobadilika siku hiyo. Tofauti na mifumo ya kawaida ya incremental, hakuna chain ya replay. Snapshot yoyote hurejeshwa moja kwa moja. Kufuta snapshot ya zamani hakuvunji snapshot mpya.
Ninawezaje kurejesha faili kutoka kwenye backup ya restic?
Endesha restic snapshots ili kupata snapshot ID. Kisha endesha restic restore <id> --target /some/empty/dir ili kuirejesha. Ongeza --include /path ili kurejesha sehemu yake pekee. latest inaweza kutumika badala ya ID. Restic huunda upya muundo wa awali wa directories chini ya target. Kwa hiyo, kurejesha /etc/ssh huweka faili katika /some/empty/dir/etc/ssh. Fanya mazoezi haya kabla hujayahitaji, kwa sababu backup ambayo haijajaribiwa haiwezi kuthibitishwa.
Ninapaswa kuendesha restic backup mara ngapi?
Kila usiku ni kiwango cha chini kinachofaa kwa seva. Deduplication hufanya gharama yake kuwa ndogo, kwa sababu kila run hupakia tu chunks zilizobadilika tangu run iliyotangulia. Data inayobadilika haraka, au ambayo kupoteza hata siku moja kungekuwa na madhara, inaweza kuhifadhiwa kila baada ya saa chache kwa kutumia muundo huohuo wa timer. Frequency ni nusu rahisi tu. Pia endesha restic check mara kwa mara na ufanye restore drill kila mwezi, kwa sababu ratiba bila verification hutoa uhakika wa uongo.
Nini hutokea nikisahau password ya repository ya restic?
Backups haziwezi kurejeshwa. Usimbaji wa restic hauna back door wala reset. Kwa hiyo, password ni muhimu sawa na backups zenyewe. Hifadhi nakala katika password manager yako na mahali pengine pa kudumu ambapo si kwenye server inayohifadhi backup. Ukiwa bado una access, restic key add inaweza kusajili password ya pili kwa repository hiyo hiyo. Hilo hukupa password ya akiba.