Ein modernes Kimai-Setup mit docker-compose und nginx
Dies ist das Setup, das ich verwende, um mehrere produktive Kimai-Instanzen zu betreiben. In meinem Beispiel erstelle ich die Dateien in /opt/kimai-mydomain. Der Ordnername ist nicht kritisch, aber es ist hilfreich, mehrere unabhängige Kimai-Instanzen zu unterscheiden.
Zuerst /opt/kimai-mydomain/docker-compose.yml erstellen. An dieser Datei muss nichts geändert werden, da jede relevante Konfiguration über Umgebungsvariablen aus .env geladen wird.
Wir fügen auch eine Konfiguration für Traefik hinzu, falls man Traefik als Reverse-Proxy anstelle von nginx verwenden möchte. (in diesem Fall kann der ports-Abschnitt entfernt werden, da Traefik die Portweiterleitung übernimmt). Siehe Einfaches Traefik-docker-compose-Setup mit Lets Encrypt Cloudflare DNS-01 & TLS-ALPN-01 & HTTP-01 Challenges für Details zum Traefik-Setup.
services:
mariadb:
image: mariadb:latest
environment:
- MYSQL_DATABASE=kimai
- MYSQL_USER=kimai
- MYSQL_PASSWORD=${MARIADB_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
volumes:
- ./mariadb_data:/var/lib/mysql
command: --default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: mysqladmin -p${MARIADB_ROOT_PASSWORD} ping -h localhost
interval: 20s
start_period: 10s
timeout: 10s
retries: 3
kimai:
image: kimai/kimai2:apache-debian-master-prod
environment:
- APP_ENV=prod
- TRUSTED_HOSTS=localhost,${HOSTNAME}
- ADMINMAIL=${KIMAI_ADMIN_EMAIL}
- ADMINPASS=${KIMAI_ADMIN_PASSWORD}
- DATABASE_URL=mysql://kimai:${MARIADB_PASSWORD}@mariadb/kimai
volumes:
- ./kimai_var:/opt/kimai/var
ports:
- '17919:8001'
depends_on:
- mariadb
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.kimai.rule=Host(`kimai.mydomain.com`)"
- "traefik.http.routers.kimai.entrypoints=websecure"
- "traefik.http.routers.kimai.tls.certResolver=alpn-ec384"
- "traefik.http.services.kimai.loadbalancer.server.port=8001"Nun die Konfiguration in /opt/kimai-mydomain/.env erstellen:
MARIADB_ROOT_PASSWORD=eishi5Pae3chai1Aeth2wiuCh7Ahhi
MARIADB_PASSWORD=su1aesheereithubo0iedootaeRooT
KIMAI_ADMIN_PASSWORD=toiWaeShaiz5Yeifohngu6chunuo6C
KIMAI_ADMIN_EMAIL=[email protected]
HOSTNAME=kimai.mydomain.comZufällige Passwörter für .env generieren! NICHT die Standardpasswörter in .env belassen!
Außerdem müssen KIMAI_ADMIN_EMAIL und HOSTNAME korrekt gesetzt werden.
Nun können wir das Kimai-Datenverzeichnis erstellen und die korrekten Berechtigungen setzen:
mkdir -p kimai_var
chown -R 33:33 kimai_var(33 ist die Benutzer-ID und Gruppen-ID des www-data-Benutzers im Container)
Aktuelle Kimai-Versionen installieren Kimai beim ersten Start automatisch in die Datenbank.
Nun können wir einen systemd-Service erstellen, der Kimai automatisch startet, mit TechOverflow’s Methode aus Systemd-Service für docker-compose-Projekt in 10 Sekunden erstellen:
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdinNun muss nur noch eine nginx-Konfiguration für das Reverse-Proxying der Kimai-Domain erstellt werden (außer man verwendet Traefik – die Traefik-Konfiguration ist bereits in docker-compose.yml enthalten). Es gibt nichts Besonderes bei der Konfiguration zu beachten, daher zeige ich meine Konfiguration nur als Beispiel, das man kopieren und einfügen kann.
server {
server_name kimai.mydomain.com;
location / {
proxy_pass http://localhost:17919/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_redirect default;
}
listen [::]:443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/kimai.mydomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/kimai.mydomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
}
server {
if ($host = kimai.mydomain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name kimai.mydomain.com;
listen [::]:80; # managed by Certbot
return 404; # managed by Certbot
}Nach dem Einrichten der Konfiguration – ich empfehle immer, TLS mit Let’s Encrypt einzurichten, auch für Test-Setups – den Browser öffnen und zur Kimai-Domain gehen, z.B. zu https://kimai.mydomain.com. Man kann sich direkt bei Kimai mit KIMAI_ADMIN_EMAIL und KIMAI_ADMIN_PASSWORD wie in .env angegeben anmelden.
Traefik wird TLS automatisch einrichten.