Diese Anleitung befasst sich mit der Migration (m)eines Redmine Server nach Docker. Neben der eigentlichen Migration führe ich auch noch ein Upgrade von V4 auf V5 durch. Wenn Du Dich nur für die Installation von Redmine in docker interessierst, habe ich eine eigene Anleitung geschrieben.
Nach einer umfassenden Internet-Recherche habe ich das Projekt Redmine Server nach Redmine Docker und Upgrade auf Redmine 5.0.x selbst in Angriff genommen. Diese Anleitung ist sicher nicht die einzige oder beste Lösung, wenngleich ich diese mit meinem Live-System erfolgreich vollzogen habe und somit sagen kann, dass sie funktioniert.
Die Befehle, die die alte Installation betreffen, beginnen im Codefenster mit old:/>
. Die Befehle, die für die Docker-Installation vorgesehen sind, starten mit new:/>
.
Hinweis: Während der gesamten Migration darf es keine Schreibzugriffe auf die Instanz geben, da es sonst zu“Störungen in der Macht“ kommen kann.
Vorbereitung des Redmine Server
Vor der „Migration“ bringe ich die bestehende Redmine Instanz auf den neuesten Stand. Hinweise, wie dies zügig durchführt wird, gibt es im Wiki von Redmine, allerdings funktionierte das Upgrade nur innerhalb einer Major Version. Hinweise zum Upgrade von Major nach Major, habe ich nicht gefunden und auch nur einige wenige Beiträge auf Stackoverflow & Co.
Backup der Datenbank mit mysqldump
Nach dem Upgrade erstelle ich ein neues Datenbank-Dump.
Hinweis: Das Dumpfile, das ich während des Upgrades erstellt habe bringt nichts, denn die Datenbank wird während des Upgrades durch bundle
aktualisiert werden.
old:/> bundle exec rake db:migrate RAILS_ENV=production
ZshDass relevante Dump muss ich daher erneut auf dem alten Server mit mysqldump
erstellen.
old:/> mysqldump -u<redmine-db-user> -P -h host-or-IP redmine_db \
> redmine_backup-to-import.sql
ZshVorbereitung des neuen Systems
Zur Übertragung des erstellten Dumpfiles gibt es etliche Tools (z.B. scp) und auch viele Wege, wie zum Beispiel: Du kannst die Datei pushen, also vom alten zum neuen Server schieben, oder die Datei pullen, also vom neuen Server aus, vom Alten holen.
Push
old:/> scp dumpfile.sql remote-user@ip-new-server:/remote/dir/
ZshPull
new:/> scp remote-user@ip-old-server:/remote/dir/dumpfile.sql /local/dir/
ZshEine ausgezeichnete Referenz gibt es unter [1].
Egal für welche Variante Du dich entscheidest, das erstellte „old:/>-Dumpfile
“ wird in die funktionierende Installation von Redmine auf dem new:/>
eingespielt.
Bevor das passiert, schreibe ich erneut ein Dump, denn auch hier gilt die Administratoren-Regel: „No Backup, no Mercy“.
Logging
Willst Du den Updateprozess im Nachgang beobachten, dann öffne Dir in einem Extra-Terminal, oder in screen
das Logging.
new:/> docker logs redmine-app --follow
ZshDatenbank
Das Upgrade von Redmine finder zum großen Teil in der Datenbank statt. Die Anwendung sind neue Dateien, die über die entsprechenden Mechanismen ins System gebracht werden. Dabei werden alte Dateien durch neue ersetzt.
Backup der Datenbank der Docker Installation
Um aus den Container das Dumpfile zu erstellen, wird der mysqldump
-Befehl an docker, zur Ausführung übergeben: docker exec
. Idealerweise befindest Du Dich in dem Verzeichnis, in dem Du die Sicherung ablegen willst.
new:/> mkdir /opt/containers/redmine/daten/arch
new:/> cd /opt/containers/redmine/daten/arch
ZshUm herauszufinden, wie der Datenbank-Container heißt hilft das Kommando: docker ps
. In der Standard Docker-Redmine-Installation heißt er redmine-db
.
new:/> docker exec redmine-db /usr/bin/mysqldump -u redmine \
--password=tollesSicheresPasswort123 redmine > redmine.sql
ZshEinspielen der alten Datenbank
Das Redmine Upgrade nach docker beginne ich also wie ein Restore, indem ich die alte Datenbank-Version einspiele, was die Lauffähigkeit des Docker-Containers auf new:/>
zunächst torpediert. Im zweiten Schritt aktualisiere ich wieder mit docker exec
die Datenbank auf die neueste Version.
Ausgangspunkt des DB-Imports ist das Verzeichnis mit dem Dumpfile (.sql).
new:/> docker exec -i redmine-db /usr/bin/mysql -u redmine \
--password=tollesSicheresPasswort123 redmine \
< redmine_backup-to-import.sql
ZshHier musst Du darauf achten, welches Dumpfile Du zurückspielst, weshalb ich dieses auch redmine_backup-to-import.sql
genannt hatte (siehe oben).
Datenbank Upgrade in der App
Mit dem Datenbank-Update schließe ich den programmatischen Teil des Redmine Upgrades, hin zu docker ab.
new:/> docker exec redmine-app bundle exec rake db:migrate \
RAILS_ENV=production
ZshDateien übertragen
Zu guter Letzt migriere ich noch die Dateien, mit der Hilfe von tar
In der alten Instanz wird, unterhalb des zusammenzufassenden Verzeichnisses, tar
ausgeführt.
old:/> cd /path/to/redmine/
old:/> tar -cf files.tar files/
ZshDas komplette Verzeichnis wird mit einem beliebigen geeigneten Tool auf den neuen Server kopiert, z.B. scp
.
old:/> scp files.tar -i /path/to/transfer-key \
root@<IP-2-new-server>:/opt/containers/redmine/daten/
ZshEntpacken geht dann auch ganz einfach wieder mit tar
.
new-server:/> docker compose /opt/containers/redmine/docker-compose.yml
down
new-server:/> cd /opt/containers/redmine/daten/
new-server:/> mv files files_backup
new-server:/> tar -xvf files.tar
ZshZum Anstarten des Containers lässt man dann den detach-Switch -d
erstmal weg. Das hilf bei der Behebung von Fehlern doch enorm.
new-server:/> docker compose /opt/containers/redmine/docker-compose.yml up
ZshWenn dann alles läuft nach dem up
ein -d
und bei Redmine angemeldet. Im Idealfall zeigt die Seite admin/info statt
4.0.9.stable.22174
Zshdie neue Version an
5.0.5.stable
ZshZusammenfassung
Das Ziel der Anleitung haben wir somit erreicht: Redmine Server nach Docker, mit einem Upgrade des Redmine Major-Releases von 4.0.X nach 5.0.X.
Als Referenz kann mit wenigen Anpassungen auch nur ein Teil der Anleitung verwendet werden, z.B. wenn nur ein Redmine Upgrade gemacht wird, oder nur eine Server nach docker
Migration.
Ein Gedanke zu „Redmine Server nach Docker“