Docker + Redmine

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
Zsh

docker 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
Zsh

Der 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
YAML

In 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
Zsh

Wenn 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}
Zsh

In 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
YAML

Theme 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
YAML

docker compose starten

Sind die Anpassungen alle abgeschlossen, wird der Container gestartet.

docker compose /opt/containers/redmine/docker-compose.yml up -d
Zsh

Redmine 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
Zsh

Redmine 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
Zsh

Damit 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

Start » Redmine mit Docker und Traefik

* 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

Schreibe einen Kommentar