Ich verwende GitLab in Docker (weil ich Containerisierung liebe) und ich bin wirklich zufrieden damit, weil ich die GitLab-Umgebung uberall hin mitnehmen kann, wenn es notig ist, und ich mich elastischer fuhle, wenn ich Docker verwende.

GitLab-Backups sind wirklich sehr wichtig, weil du den gesamten Quellcode und vielleicht Wiki, vielleicht mehr als den gesamten Quellcode aufbewahrst, und Backup ist das Erste, wenn du einen Dienst auf kritischem Niveau betreibst.

Vergewissere dich uber deinen Docker Run-Befehl


Ich fuhre mein GitLab in Docker mit diesem Befehlssatz aus:

[ercan@gitlab ~]$ docker run --detach \
  --hostname gitlab.ercanermis.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

Zunachst mussen wir herausfinden, wie der Docker-Container-Name von GitLab lautet. In meinem Setup verwende ich GitLab Community Edition und habe dem Docker den Namen "gitlab" gegeben. Wenn du den Namen deines GitLab-Docker-Containers nicht kennst, gibt es einen einfachen Weg, ihn herauszufinden.

[ercan@gitlab ~]$ docker ps -a | grep gitlab-ce

Die letzte Spalte zeigt den Docker-Container-Namen. Hier ist die Ausgabe:

9c787206fbda gitlab/gitlab-ce:latest "/assets/wrapper" 8 hours ago Up 8 hours (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab

Ein Backup erstellen und den Backup-Pfad kennen

Eigentlich ist das GitLab-Backup wirklich einfach. Hier ist der Befehl zum Auslosen des Backup-Mechanismus von GitLab.

docker exec gitlab gitlab-rake gitlab:backup:create DIRECTORY=gitlab

Der Auslosebefehl reicht nicht aus, weil du ein Backup der Dateien gitlab.rb und gitlab-secrets.json machen solltest, die sich im Pfad /srv/gitlab/config/ befinden. Ich bevorzuge es, diese Dateien (mit dem cp-Befehl) in den Pfad /srv/gitlab/data/backups/ zu kopieren, weil gitlab-rake in dasselbe Verzeichnis exportiert.

Mein GitLab Docker Backup Bash-Skript sieht so aus:

#!/bin/bash
#Author: Ercan Ermis - https://ercanermis.com

docker exec gitlab gitlab-rake gitlab:backup:create DIRECTORY=gitlab cp /srv/gitlab/config/gitlab.rb /srv/gitlab/data/backups/$(date +%F_%H-%M)gitlab.rb cp /srv/gitlab/config/gitlab-secrets.json /srv/gitlab/data/backups/$(date +%F%H-%M)_gitlab-secrets.json

Welche Dateien hast du nach der Ausfuhrung des Backup-Bash?

Gitlab generiert den Backup-Dateinamen wie 1600262658_2020_09_16_13.3.6_gitlab_backup.tar. Das bedeutet epochtime_jahr_monat_tag_gitlabVersion_gitlab_backup.tar. Deshalb verwende ich die $date-Funktion beim Kopieren von gitlab.rb und gitlab-secrets.json in den Ordner /srv/gitlab/data/backups/.

Ich verwende den AWS S3-Dienst, um meine Backups sicher und redundant aufzubewahren. Wenn das Backup abgeschlossen und im Ordner /srv/gitlab/data/backups/ bereit ist, synchronisiere ich die gesicherten Dateien mit S3 mit dem Befehl aws s3 sync /srv/gitlab/data/backups/ s3://ercanermis-backup/gitlab/ und losche die Backup-Datei auf dem Server.

Du kannst auch deine eigene Losung verwenden, um dein Backup redundant und sicher aufzubewahren, wie SMB, sFTP oder eine andere Block-Storage-Losung von einem anderen Anbieter.

Final: Lass uns das Backup automatisieren

Hier ist das finale Bash-Skript zur Automatisierung des GitLab Docker-Backups, gespeichert in /opt/gitlab-backup.sh

#!/bin/bash
#Author: Ercan Ermis - https://ercanermis.com

docker exec gitlab gitlab-rake gitlab:backup:create DIRECTORY=gitlab cp /srv/gitlab/config/gitlab.rb /srv/gitlab/data/backups/$(date +%F_%H-%M)gitlab.rb cp /srv/gitlab/config/gitlab-secrets.json /srv/gitlab/data/backups/$(date +%F%H-%M)_gitlab-secrets.json aws s3 sync /srv/gitlab/data/backups/ s3://ercanermis-backup/gitlab/ && rm -rf /srv/gitlab/data/backups/*

Nachdem du deine .sh-Datei erstellt hast, kannst du deinen crontab verwenden, um dein eigenes /opt/gitlab-backup.sh auszulosen.