Als Redmine User der ersten bis zweiten Stunde ist es an der Zeit, eine neue Installation in Angriff zu nehmen. Der Server ist alt, das Betriebssystem ist alt, die RM-Versionsnummer ist auch nicht mehr die Allerneueste und überhaupt. Zeit für Docker + Redmine.
Mit docker geht das entsprechend einfach von der Hand. Vor allem, wenn man den Aufwand einer Installation auf dem root-Server kennt.
Hinweis: Der Ausgangspunkt dieser Anleitung ist eine bestehende Installation von Docker und Traefik. Redmine wird als ein Container in diese Docker-Struktur eingebunden und hört via https (SSL) auf eine Domain. Der entsprechende A-Record für diese Domain, die weiter unten in der docker-compose.yml eingesetzt wird, muss vorher angelegt werden.
Die Umsetzung des Projektes habe ich bei HETZNER* gemacht. Die verwendete CPX21 kostet unter 10 EUR im Monat und bietet ausreichend Flexibilität und Power, die man bei Bedarf einfach skalieren kann.
Die entsprechende Anleitung gibt es hier.
Arbeitsumgebung: Ubuntu 22.04; Docker 23.0.3
Docker installieren
Die Installation von docker und traefik wird in dieser Anleitung genauer beschrieben und daher nur noch referenziert. Das Grundsystem ist ein Ubuntu LTS 22.04.
traefik ist der Edge Router (= Reverse-Proxy) der Stunde, zB um auf dem gleichen Server alle Container, mit SSL verschlüsselt auf dem gleichen Port zur Verfügung zu stellen.
Redmine
Einige wenige Vorbereitungen sind notwendig. Wie in oben angesprochenen Artikel beschrieben, wurden alle bisherigen und werden alle neuen Container nach /opt/containers/<container-name>
installiert. In diesem Fall mit <container-name>
gleich redmine
.
mkdir -p /opt/containers/redmine/{daten,database}
mkdir -p /opt/containers/redmine/daten/files
cd /opt/containers/redmine
Zshdocker compose (1)
Die Konfiguration für den Redmine Container wird als docker-compose.yml
, im obersten Verzeichnis des Containers angelegt. Ich verwende vi!
vi docker-compose.yml
ZshDer Inhalt, den docker compose
benötigt um den Container bereitzustellen sieht wie folgt aus. Der Service wird redmine-app
heißen und die Datenbank redmine-db
. Das werden wir in einem anderen Tutorial wieder brauchen. Die anderen Einstellungen sind weitgehend selbst erklärend, wenn man schon mal mit docker gearbeitet hat.
version: '3'
services:
redmine-app:
image: redmine
container_name: redmine-app
restart: unless-stopped
depends_on:
- redmine-db
environment:
- REDMINE_DB_MYSQL=redmine-db
- REDMINE_DB_DATABASE=redmine
- REDMINE_DB_PORT=3306
### Hier ein tolles Passwort ###
- REDMINE_DB_PASSWORD=tollesPasswort!123
- REDMINE_DB_USERNAME=redmine
volumes:
- ./daten/files:/usr/src/redmine/files
labels:
- "traefik.enable=true"
- "traefik.http.routers.redmine.entrypoints=http"
### Hier die Domain einsetzen ###
- "traefik.http.routers.redmine.rule=Host(`red.domain.tld`)"
- "traefik.http.middlewares.redmine-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.redmine.middlewares=redmine-https-redirect"
- "traefik.http.routers.redmine-secure.entrypoints=https"
### Hier die Domain einsetzen ###
- "traefik.http.routers.redmine-secure.rule=Host(`red.domain.tld`)"
- "traefik.http.routers.redmine-secure.tls=true"
- "traefik.http.routers.redmine-secure.tls.certresolver=http"
- "traefik.http.routers.redmine-secure.service=redmine"
- "traefik.http.services.redmine.loadbalancer.server.port=3000"
- "traefik.docker.network=proxy"
- "traefik.http.routers.redmine-secure.middlewares=secHeaders@file"
networks:
- proxy
- default
redmine-db:
image: mariadb
container_name: redmine-db
restart: unless-stopped
volumes:
- ./database:/var/lib/mysql
environment:
### Hier ein tolles root-Passwort ###
- MYSQL_ROOT_PASSWORD=tollesPasswort!321
### Hier ein tolles Passwort ###
- MYSQL_PASSWORD=tollesPasswort!123
- MYSQL_DATABASE=redmine
- MYSQL_USER=redmine
- MYSQL_INITDB_SKIP_TZINFO=1
networks:
- default
networks:
proxy:
external: true
YAMLIn der docker-compose.yml
müssen 5 Änderungen vorgenommen werden. Das betrifft die Passwörter sowie die gewählte Domain.
Die Einstellungen für traefik sind so ausgelegt, dass es … funktioniert.
Redmine ist damit grundlegend bereit für den Start. Empfehlung meinerseits ist, docker compose
zunächst nicht mit -d
zu starten. Etwaige Fehler und deren Rückgabewerte werden dadurch an der Console sichtbar.
docker compose /opt/containers/redmine/docker-compose.yml up
ZshWenn alles funktioniert, kann mit CTRL+D der Container heruntergefahren und mit -d
erneut gestartet werden.
docker compose (2)
Redmine Plugins, Themes und Config
Um Redmine auszuprobieren langt docker compose (1) aus. Wer es anpassen, migrieren oder erweitern will, dem reicht es nicht. In einem späteren Tutorial wird veranschaulicht, wie ein Upgrade bzw. eine Migration mit Versionsupgrade funktioniert. Spätestens dann braucht die docker-compose.yml
Anpassungen. Wer mit Plugins arbeitet, oder welche ausprobieren will, der sollte also vorbauen. Analog, wer z.B. mit SMTP arbeitet.
Die Zielverzeichnisse werden in Schritt 1 angelegt.
mkdir -p /opt/containers/redmine/daten/{plugins,themes,config}
ZshIn der docker-compose.yml
werden im Abschnitt volumes
, innerhalb der services redmine-app
, werden weitere Verzeichnisse und Dateien eingebunden.
volumes:
- ./daten/files:/usr/src/redmine/files
### Neue Volumes mappen ###
- ./daten/plugins:/usr/src/redmine/plugins
- ./daten/themes:/usr/src/redmine/public/themes
- ./daten/config/configuration.yml:/usr/src/redmine/config/configuration.yml
YAMLTheme können somit persistent, in das entsprechende Verzeichnis unter daten/themes
gespeichert werden. Analog Plugins, die in das Verzeichnis daten/plugins
wandern. Empfehlenswert ist z.B. der WYSIWYG-Editor von Takeshi Nakamura.
Die eingebundene configuration.yml
ist über diesen Weg auch editierbar. Die Datei ist der Speicherort für zahlreiche Konfigurationen, z.B. den versenden SMTP-Server (hier Gmail).
# default configuration options for all environments
default:
# Outgoing emails configuration (see examples above)
email_delivery:
delivery_method: :smtp
smtp_settings:
#tls: true
enable_starttls_auto: true
address: "smtp.gmail.com"
port: 587
domain: "smtp.gmail.com"
authentication: :plain
user_name: "bla-mail-bla@gmail.com"
password: tollesPasswort!123
YAMLdocker compose starten
Sind die Anpassungen alle abgeschlossen, wird der Container gestartet.
docker compose /opt/containers/redmine/docker-compose.yml up -d
ZshRedmine Update
Da alle Lebenserhaltungssysteme außerhalb des Containers selbst liegen, ist das Updaten des Containers recht einfach. Natürlich wie überall und immer liest man sich Release Notes durch und entscheidet dann, ob es ein Update sein soll. Zudem gilt wieder „No Backup,…“
docker compose /opt/containers/redmine/docker-compose.yml down
docker compose pull
docker compose /opt/containers/redmine/docker-compose.yml up -d
ZshRedmine Debuggen
Martialisches Debuggen… natürlich nicht. Aber mit dem passenden Befehl kann man auf Fehler reagieren. Manche Plugins lassen z.B. den Startprozess des Servers (Containers) abbrechen oder, durch die Einstellung restart: unless-stopped
in eine Endlos-Start-Schleife wandern.
docker logs redmine-app --follow
ZshDamit ist Redmine lauffähig unter Docker, mit geringem Aufwand installiert. Für eine Migration auf einen anderen Server ist dies auch (mein) erster Schritt. Release-Upgrades und Daten-Restore sind dann ein anderes Thema, dass in einem anderen Artikel behandelt wird.
Zusammenfassung
Ich habe Dir gezeigt, wie Du Redmine in docker hochziehen kannst. Zudem wie Du bestimmte Verzeichnisse (plugins, themes) so in das Datenverzeichnis legst, dass Du diese Funktion auch nutzen kannst.
Weiter geht es mit einer Anleitung zur Migration von einem alten zu einem neuen Server und on top, ein Upgrade von Version 4 auf 5. Vorfreude –> !
Quellen
kuerbis.org
Takeshi Nakamura
Compose File Reference v3
* Durch Anklicken des Links und die Registrierung eines Accounts bei Hetzner, unterstützt ihr meine Arbeit, wofür ich herzlich danken möchte!
3 Gedanken zu „Docker + Redmine“