Online zetten: een back-upscript
Hier bouw je op verder: Een variabele in de shell en Uitvoer doorgeven met een pipe
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
De back-up uit les 37 typ je met de hand, en dat vergeet je. Zet de stappen in een script: een bestand met commando's die bash na elkaar uitvoert. In de volgende stap laat je de server het elke nacht draaien.
Het script
Maak op de server een map voor de back-ups, en het script:
mkdir ~/backups
nano ~/backup.sh
MAP=~/backups/$(date +%F)
mkdir -p "$MAP"
cd ~/gastenboek
docker compose stop
docker compose cp gastenboek:/app/data "$MAP/data"
docker compose start
cp ~/gastenboek/.env "$MAP"
cp -r ~/traefik "$MAP"
tar -czf "$MAP.tar.gz.tmp" -C ~/backups "$(basename "$MAP")" && mv "$MAP.tar.gz.tmp" "$MAP.tar.gz"
rm -rf "$MAP" "$MAP.tar.gz.tmp"
ls -1t ~/backups/*.tar.gz | tail -n +8 | xargs -r rm
Het middelste stuk ken je uit les 37. Nieuw is wat eromheen staat:
| Regel | Wat hij doet |
|---|---|
MAP=~/backups/$(date +%F) | $(…) zet de uitvoer van een commando op die plek; date +%F geeft de datum, dus MAP wordt een map per dag, zoals ~/backups/2026-11-03 |
"$MAP" | de waarde van MAP, bij elkaar gehouden door de aanhalingstekens |
tar -czf "$MAP.tar.gz.tmp" … | pakt de map in tot één bestand, eerst met een tijdelijke naam |
&& mv … | hernoemt het naar 2026-11-03.tar.gz, maar alleen als tar lukte |
rm -rf … | gooit de map weg, en wat er van een mislukte tar over is; -f zwijgt als iets er niet is |
ls -1t … | tail -n +8 | xargs -r rm | zet de back-ups op een rij, nieuwste eerst, slaat er zeven over, en gooit de rest weg |
Nooit een half bestand
tar schrijft het ingepakte bestand stukje voor stukje. Raakt de schijf halverwege vol, dan blijft er een half bestand staan dat je niet kunt uitpakken. Had het meteen de echte naam, dan telde het mee als een van de zeven, en gooide de laatste regel er een goede voor weg. Daarom krijgt het pas zijn echte naam als tar klaar is en het gelukt is.
Geen set -e
Na een fout gaat bash door met de volgende regel. Met set -e bovenaan stopt een script bij het eerste commando dat misgaat. In dit script wil je dat juist niet: na docker compose stop moet docker compose start altijd komen, ook als het kopiëren misging. Een gemiste back-up is erg, een site die tot de ochtend uit staat erger.
Met de hand proberen
bash ~/backup.sh
ls ~/backups
Je site stopt een paar seconden, en start daarna weer.
Er gaat iets mis
no space left on device
write /home/sam/backups/2026-11-03/data/gastenboek.db: no space left on device
Oorzaak: de schijf van je server is vol. docker compose start draait daarna toch, dus je site start weer, maar er komt geen back-up.
Oplossing: kijk met df -h hoeveel ruimte er nog is, en met docker system df hoeveel Docker gebruikt. Ruim oude images op zoals in les 39, en draai het script opnieuw.
cannot access bij *.tar.gz
ls: cannot access '/home/sam/backups/*.tar.gz': No such file or directory
Oorzaak: er staat nog geen enkele back-up in ~/backups: tar mislukte, en de shell vond niets bij *.tar.gz.
Oplossing: lees de melding erboven; daar staat waarom tar of het kopiëren misging. Bij no space left on device helpt de oplossing hierboven.
Opdrachten
Opdracht 1: Modify - Portainer erbij
Heb je Portainer uit les 40, dan hoort ~/portainer ook in de back-up. Pas het script aan.
Antwoord
Zet onder de regel voor ~/traefik:
cp -r ~/portainer "$MAP"
Opdracht 2: Investigate - Hoeveel ruimte?
Hoeveel ruimte nemen je back-ups in? Gebruik du -sh ~/backups. Hoeveel zou het zijn zonder de regel die er zeven bewaart, na een jaar?
Antwoord
Een gastenboek met een paar accounts en berichten is ingepakt een paar kilobyte, dus zeven back-ups zijn samen minder dan een megabyte. Na een jaar zonder opruimen zijn het er 365, en dat is voor een klein gastenboek nog steeds weinig. Maar je databases groeien, en een schijf die vol raakt, stopt je site. De regel kost niets, en je hoeft er nooit meer aan te denken.
Door naar les 42: elke nacht met cron.