Confluence & Docker

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&amp;connectionCollation=utf8_bin&amp;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.