Ausgangsbeschränkungen & Homeoffice und Ostern, quasi die perfekten Rahmenbedingungen, um mal wieder das nächste IT Projekt zu Hause anzugehen und natürlich auch zu dokumentieren. Nachdem ich ja vor einiger Zeit den Blog nach Docker migriert hatte, ist nun mein Confluence Wiki dran, von daher .....
Im Netz finden sich bereits die ein oder andere Anleitung, die auf dem Export/Import eines XML Backups basieren, allerdings wollte ich testen ob eine Migration auf der darunter liegenden Ebene auch funktioniert. Anbei wie ich konkret vorgegangen bin.
Backup
Im ersten Schritt hab ich die relevanten Daten meiner - ordnumgsgemäss angehaltene - Confluence Instanz gesichert.
Ein Grossteil der Informationen liegt in der Datenbank, während Attachments, Extensions und Konfigurationen im Filesystem liegen (defaultmässig unter /var/atlassian/application-data/confluence/)
Die Sicherung der DB wurden mittels mysqldump erzeugt
mysqldump --max_allowed_packet=64M --databases <CONFLUENCEDATABASE> > confluencedb.sql
sowie das Applikationsverzeichnis via tar gepackt
tar czvf confluence-app-data.tar.gz /var/atlassian/application-data/confluence/
MYSQL Docker Image
Analog zum klassichen Setup kommt mysql in der Version 5.7 zum Einsatz (hierbei nutze ich das offizielle MySQL Image).
Neben den Werten für den MySQL User, Passwort und Datenbanknamen werden mittels der command Option noch die Konfigurationsoptionen an den DB Server übergeben, die offizielle in der Doku aufgelistet sind https://confluence.atlassian.com/doc/database-setup-for-mysql-128747.html.
Um die Daten ausserhalb des Containers zu perisistieren nutze ich ein neu erzeugtes Verzeichnis namens mysql, welches auf das Directory /var/lib/mysql innerhalb des Containers gemappt ist.
version: '3'
services:
confluence-mysql:
image: mysql:5.7
volumes:
- ./mysql/:/var/lib/mysql/
command: --default-authentication-plugin=mysql_native_password --max_allowed_packet=64M --innodb_log_file_size=2GB --character-set-server=utf8 --collation-server=utf8_bin --transaction-isolation=READ-COMMITTED --binlog_format=row --default-storage-engine=InnoDb
environment:
- MYSQL_ROOT_PASSWORD=<MYSQLROOTPASSWORD>
- MYSQL_DATABASE=<MYSQLCONFLUENCEDB>
- MYSQL_USER=<MYSQLCONFLUENCEUSER>
- MYSQL_PASSWORD=<MYSQLCONFLUENCEPASSWORD>
container_name: confluence-mysql
ports:
- "3306:3306"
networks:
- confluence
networks:
confluence:
Mittels docker-compose up starten wir den MySQL Container, laden die Sicherung der MySQL examplarisch via
cat confluencedb.sql | docker exec -i confluence-mysql /usr/bin/mysql -u <MYSQLCONFLUENCEUSER> -p<MYSQLCONFLUENCEPASSWORD>
und halten ihn anschliessend mit docker-compose down wieder an.
Confluence Docker Image
Seit einiger Zeit gibt es ein offizielles Docker Image für Confluence von Atlassian. Auch hier wollte ich ursprünglich dieses direkt verwenden, bin aber auf ein kleineres Hindernis gestossen. Der MySQL Driver ist auf Grund von Lizenzbeschränkungen nicht Bestandteil des erwähnten Image. Von daher bauen wir uns ein Image, dass eben das mysql-connector jar inkludiert.
Das zugehörige Dockerfile, welches in einem Umterverzeichnis namens confluence liegt, ist recht überschaubar und dient einzig und allein den Driver mit in das Image einzubinden.
FROM atlassian/confluence-server:latest
COPY ./mysql-connector-java-5.1.48.jar /opt/atlassian/confluence/confluence/WEB-INF/lib
Das im tar Archiv gesichert Confluence Directory entpacken wir in ein neues Verzeichnis namens application-data mittels
mkdir application-data
tar xvf confluence-app-data.tar.gz --strip-components=3 -C application-data
und machen wir uns dann daran das docker-compose File noch um den entsprechenden Confluence Abschnitt zu erweitern. Die gesamte Datei sieht nun wie folgt aus.
version: '3'
services:
confluence-mysql:
image: mysql:5.7
volumes:
- ./mysql/:/var/lib/mysql/
command: --default-authentication-plugin=mysql_native_password --max_allowed_packet=64M --innodb_log_file_size=2GB --character-set-server=utf8 --collation-server=utf8_bin --transaction-isolation=READ-COMMITTED --binlog_format=row --default-storage-engine=InnoDb
environment:
- MYSQL_ROOT_PASSWORD=<MYSQLROOTPASSWORD>
- MYSQL_DATABASE=<MYSQLCONFLUENCEDB>
- MYSQL_USER=<MYSQLCONFLUENCEUSER>
- MYSQL_PASSWORD=<MYSQLCONFLUENCEPASSWORD>
container_name: confluence-mysql
ports:
- "3306:3306"
networks:
- confluence
confluence:
build: ./confluence
container_name: confluence
volumes:
- ./application-data/confluence:/var/atlassian/application-data/confluence
ports:
- "8090:8090"
- "8091:8091"
networks:
- confluence
depends_on:
- confluence-mysql
networks:
confluence:
Alternativ kann man das mysql jar Archiv (welches im Verzeichnis application-data liegt) natürlich auch direkt in den Container mappen, in diesem Fall würde sich das docker-compose File wie folgt aussehen
version: '3'
services:
confluence-mysql:
image: mysql:5.7
volumes:
- ./mysql/:/var/lib/mysql/
command: --default-authentication-plugin=mysql_native_password --max_allowed_packet=64M --innodb_log_file_size=2GB --character-set-server=utf8 --collation-server=utf8_bin --transaction-isolation=READ-COMMITTED --binlog_format=row --default-storage-engine=InnoDb
environment:
- MYSQL_ROOT_PASSWORD=<MYSQLROOTPASSWORD>
- MYSQL_DATABASE=<MYSQLCONFLUENCEDB>
- MYSQL_USER=<MYSQLCONFLUENCEUSER>
- MYSQL_PASSWORD=<MYSQLCONFLUENCEPASSWORD>
container_name: confluence-mysql
ports:
- "3306:3306"
networks:
- confluence
confluence:
image: atlassian/confluence-server:latest
volumes:
- ./application-data/confluence:/var/atlassian/application-data/confluence
- ./application-data/mysql-connector-java-5.1.48.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.48.jar
ports:
- "8090:8090"
- "8091:8091"
networks:
- confluence
depends_on:
- confluence-mysql
networks:
confluence:
Vor dem Start dieser Version, müssen wir allerdings noch die db-spezifische Konfiguration von Confluence anpassen, welche in der Datei application-data/confluence/confluence.cfg.xml abgelegt ist.
hibernate.connection.password und hibernate.connection.username müssen wir natürlich nur anpassen, falls wir in den vorhergehenden Schritten diese im Vergleich zum Original modifziert haben, ein Muss stellt allerdings die Aktualisierung der hibernate.connection.url dar. Der Host des MySQL Servers muss den Namen unseres Containers, sprich confluence-mysql reflektieren.
<property name="hibernate.connection.url">jdbc:mysql://confluence-mysql/<MYSQLCONFLUENCEDB>?useUnicode=true&connectionCollation=utf8_bin&useSSL=false</property>
<property name="hibernate.connection.password"><MYSQLCONFLUENCEPASSWORD></property>
<property name="hibernate.connection.username"><MYSQLCONFLUENCEUSER></property>
Abschliessend können wir dann beide Container starten und die Confluence WebUI im Browser ansprechen.