Forgejo Installation mit Restic nach Hetzner S3 sichern
-
Ich sichere schon jahrelang alle meine Daten mit Restic, gerne auch ins Internet oder neumodisch Cloud genannt. Besser ausgedrückt, auf die Rechner anderer Menschen.
Warum ist das wichtig?
Die könnten mitlesen, was da liegt. Also verschlüsseln wir das Ganze. Restic macht das mit einer AES256 Verschlüsselung. Im Netz sieht das dann auf einem Object Storage von Hetzner so aus.
Ich nehme für jeden Sicherungspunkt ein neues Projekt bei Hetzner, der Grund ist, dass ich nicht in verschiedene Unterordner mit entsprechenden Schlüsseln speichern kann. Zu mindestens hatte ich das mal nicht hinbekommen. Ein Wochenende mit verplempert. OK, also 1 Projekt je Backup-Vorgang. Das könnte man im Falle des Forgejos Servers auch nur mit einem Projekt machen. Warum? Wenn die Schlüssel in die falschen Hände fallen, wären ja beide Schlüssel weg. Ok, dann hätten man aber sowieso ein anderes Problem.
Aber, alle meine anderen Sicherungen, wären nicht gefährdet.
Was muss man sichern? Die Grundlage ist mein Forgejo Podman Projekt.
Ok, fangen wir mal langsam an
Hetzner S3
Ihr legt dort bitte zwei Projekte an.
Innerhalb der Projekte legt ihr dann ein Bucket an. Für dieses Projekte legt ihr Zugangsdaten an und notiert die bitte. Die brauchen wir später noch.
Forgejo Server
Für die Forgejo Installation muss man zwei Ordner sichern. In meinem Fall
- /home/forgejo
- /home/pguser/db-data
Was brauchen wir dafür?
- AWS Credentials File
- Restic Passwörter
- Restic Backup Script
Software
Restic installieren
apt install restic
AWS Credentials
Wir legen ein File an
mkdir /root/.aws nano /root/.aws/credentials
Inhalt
[forgejo] aws_default_region="nbg1" aws_access_key_id="<ACCESS_KEY>" aws_secret_access_key="<SECRET_ACCESS_KEY" [postgres] aws_default_region="nbg1" aws_access_key_id="<ACCESS_KEY>" aws_secret_access_key="<SECRET_ACCESS_KEY>"
Sollte selbsterklärend sein. Die Keys habt ihr eben aufgeschrieben. Solltet ihr nicht Nürnberg bei Hetzner gewählt haben, müsst ihr die Region entsprechend ändern.
Restic Passwörter
Zwei Passwörter anlegen, bitte ordentliche
Hier seht ihr, wo ich die abgelegt habe.
forgejo_pwd="/root/.forgejo_pwd" postgres_pwd="/root/.postgres_pwd"
Restic Backup Script
Das Script.
#!/bin/bash # Script um mit Restic Daten automatisiert zu sichern! # Dient zum Sichern der Forgejo Installation -> Hetzner S3 ## S3 Forgejo s3_domain="s3:nbg1.your-objectstorage.com" s3_folder="forgejo2" s3_bucket="forgejo2" ## S3 Postgres s3_domain_pg="s3:nbg1.your-objectstorage.com" s3_folder_pg="postgres2" s3_bucket_pg="postgres2" ## PWD forgejo_pwd="/root/.forgejo_pwd" postgres_pwd="/root/.postgres_pwd" # Was soll gesichert werden? backup_pfad_forgejo="/home/forgejo" backup_pfad_postgres="/home/pguser/db-data" # Forgejo Start export AWS_PROFILE=forgejo #restic -r $s3_domain/$s3_bucket/$s3_folder init > forgejo.log #restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder ls latest > forgejo.log restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder backup $backup_pfad_forgejo > forgejo.log restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder forget --keep-last 3 --keep-monthly 3 --prune >> forgejo2.log # Testen restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder check --read-data >> forgejo3.log # Postgres Start export AWS_PROFILE=postgres #restic -r $s3_domain_pg/$s3_bucket_pg/$s3_folder_pg init > postgres.log restic --password-file $postgres_pwd -r $s3_domain_pg/$s3_bucket_pg/$s3_folder_pg backup $backup_pfad_postgres > postgres.log restic --password-file $postgres_pwd -r $s3_domain_pg/$s3_bucket_pg/$s3_folder_pg forget --keep-last 3 --keep-monthly 3 --prune >> postgres2.log # Testen restic --password-file $postgres_pwd -r $s3_domain_pg/$s3_bucket_pg/$s3_folder_pg check --read-data >> postgres3.log
Damit es funktioniert
chmod +x forgejo_backup.sh
Sollte alles selbsterklärend sein.
Erläuterungen
Init
Ein paar Erklärungen. Wenn ihr das Script das erste Mal nutzt kommentiert bitte alle Restic Zeilen aus, bis auf diese.
restic -r $s3_domain/$s3_bucket/$s3_folder init > forgejo.log
Hiermit wird das Restic Verzeichnis initialisiert, dazu müsst ihr das Restic Passwort eingeben, was ihr weiter oben angelegt habt. Danach braucht ihr diese Zeile nicht mehr. Wieder auskommentieren. Das bitte für Forgejo & Postgres machen.
ls latest
Wenn ihr mal testen wollt, ob was im Repo liegt, könnt ihr das mit dieser Zeile machen.
restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder ls latest > forgejo.log
Backup
Diese Zeile
restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder backup $backup_pfad_forgejo > forgejo.log
legt das Backup an.
Forget
Diese Zeile löscht alle Daten, die dem Filter nicht entsprechen.
restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder forget --keep-last 3 --keep-monthly 3 --prune >> forgejo2.log
Es werden nur Daten behalten, nach einem eingestellten Wert. Sonst hätten man ja irgendwann ganz viele Daten, das möchte ich nicht.
Testen
Und diese Zeile testet das Repo
restic --password-file $forgejo_pwd -r $s3_domain/$s3_bucket/$s3_folder check --read-data >> forgejo3.log
Fertig. In den Logs könnt ihr nachlesen, was passiert ist. Besonders wichtig bei Fehlern.
Normalerweise checke ich meine Backups noch zusätzlich mit CheckMK, ob diese auch durchgeführt wurden. Das ist aber ein anderes Thema.
Crontab
Und wenn alles funktioniert, legt ihr einen crontab an.
crontab -e
Inhalt
# m h dom mon dow command 03 09 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --reloadcmd "systemctl restart nginx.service" > /dev/null 0 3 * * * /root/forgejo_backup.sh
Fertig!
Viel Spaß
Links
Und danke an Restic, ich liebe diese Software
-
Semaphore - Die API
Verschoben Ansible -
-
-
-
-
-
-