Ich musste meine Gitlab-Instanz auf einen anderen Server umziehen. Bereits vor dem Umzug habe ich Gitlab in Docker verwendet (sameersbn/gitlab). Dabei bietet dieses Image auch die Möglichkeit automatische Backups zu erstellen die auch aktiviert hatte.
Bei der Wiederherstellung der Daten auf dem neuen Server gab es jedoch ein Problem. Da dieses Image keine der beiden Zusatzsoftwares (PostgreSQL, Redis) integriert hat, habe ich diese separat laufen lassen und über docker-compose zusammengeschaltet. Das Kommando zur Wiederherstellung startet jedoch nur gitlab an sich. Da es im Endeffekt nur einen bereits von Gitlab bereitgestellten Rake-Task aufruft, wollte ich diesen manuell starten.
docker-compose up -d
docker exec -it gitlab bash
bundle exec rake gitlab:backup:restore RAILS_ENV=production
Gitlab machte dies auch brav und alle Daten wurde übernommen. Sobald jedoch ein Repository aufgerufen wurde konnte er die Daten nicht mehr finden. Nach langer Suche im Dateipfad in dem sich das Repository normalerweise befindet sind mir Symbolic-Links aufgefallen. Docker folgt jedoch in gemounteten Verzeichnissen keinen Links aus Sicherheitsgründen. Die Daten müssen aber außerhalb des Containers liegen, sonst würden sie ja beim nächsten Update verloren gehen.
Das im Image enthaltene Start-Script (Entrypoint) muss also irgendwie die Symlinks umgehen.
Um das Start-Script in docker-compose aufzurufen muss man nur dies nur in der docker-compose.yml Datei angeben. Wichtig ist ebenfalls anzugeben, dass der Container nicht selbständig neu startet, sonst stellt er sich in einer Endlosschleife vom Backup wieder her. Hierbei ist es wichtig den Timestamp des Backups anzugeben welches man wiederherstellen will sowie alle Fragen zu unterdrücken, da man keine Interaktive Eingabe hat und alle Fragen zum Abbruch führen würden.
gitlab:
image: sameersbn/gitlab
container_name: gitlab
command: app:rake gitlab:backup:restore BACKUP=<TimeStamp> force=yes
restart: no</pre>
Nachdem man den Service einmal gestartet hat und alles vom Backup wiederhergestellt wurde kann man ihn wieder Stoppen und das Kommando wieder aus der Konfiguration löschen sowie die Restart-Policy zurücksetzen.
Jetzt sollten wieder alle Daten aus dem Backup in Gitlab vorhanden sein.
TL;DR
Docker folgt in Volumes keinen Symlinks. Das im Image enthaltene Entrypoint-Script umgeht die Verwendung von Symlinks.