Kimai ist eine webbasierte Anwendung zur Zeiterfassung, die sich für eine Nutzung durch mehrere Benutzer eignet. Sie kann von Freiberuflern, Unternehmen und Organisationen eingesetzt werden. Mit Kimai ist es möglich, Zeiten zu erfassen, Berichte zu erstellen, Rechnungen zu generieren und weitere Funktionen zu nutzen.
1. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- TRAEFIK V2 + 3 – REVERSE-PROXY MIT CROWDSEC IM STACK EINRICHTEN
2. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/kimai
3. Compose Datei anlegen
nano /opt/containers/kimai/compose.yml
Inhalt
services:
sqldb:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=kimai
- MYSQL_USER=kimaiuser
- MYSQL_PASSWORD=kimaipassword
- MYSQL_ROOT_PASSWORD=sicheresPassword
command: --default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: mysqladmin -p$$MYSQL_ROOT_PASSWORD ping -h localhost
interval: 20s
start_period: 10s
timeout: 10s
retries: 3
networks:
- default
kimai:
image: kimai/kimai2:apache
volumes:
- ./data:/opt/kimai/var/data
environment:
- ADMINMAIL=deine@email.de
- ADMINPASS=sicheresPassword
- DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai
- TRUSTED_HOSTS=traefik,nginx,localhost,127.0.0.1,kimai,kimai.deinedomain.de
- APP_ENV=prod
restart: unless-stopped
networks:
- default
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.kimai.entrypoints=websecure"
- "traefik.http.routers.kimai.rule=Host(`kimai.deinedomain.de`)"
- "traefik.http.routers.kimai.middlewares=default@file"
- "traefik.http.routers.kimai.tls=true"
- "traefik.http.routers.kimai.tls.certresolver=http_resolver"
- "traefik.http.routers.kimai.service=kimai"
- "traefik.http.services.kimai.loadbalancer.server.port=8001"
- "traefik.docker.network=proxy"
networks:
proxy:
external: true
volumes:
data:
mysql:
Code-Sprache: JavaScript (javascript)
Noch anzupassen:
- MYSQL_PASSWORD=kimaipassword
- MYSQL_ROOT_PASSWORD=sicheresPassword
- ADMINMAIL=deine@email.de
- ADMINPASS=sicheresPassword
- DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai <- selbes Password wie oben
- TRUSTED_HOSTS=kimai.deinedomain.de
- Eure Traefik URL: Host(
kimai.deinedomain.de)
4. Kimai starten
Nun starten wir den Container mittels folgendem Befehl:
docker compose -f /opt/containers/kimai/compose.yml up -d
Sobald der Container ausgerollt ist könnt ihr nun eure Domain aufrufen. Beim ersten Start braucht der Container ca. 1 Minuten.
Ruft nun im Browser die gewählte Domain auf und dann solltet ihr folgendes sehen.

Melde dich mit deiner Emailadresse und Passwort an und schon kannst du Kimai nutzen.
Für Produktionszwecke würde ich die stark empfehlen die Dokumentation zu lesen. Es lässt sich auch super als PWA auf dem Smartphone nutzen.
Die angebotenen Apps sowohl für Android oder iOS fand ich persönlich jetzt nicht so brauchbar.
Quelle:
https://www.kimai.org/documentation

Hi 2TaP2B,
vielen Dank für Deine Anleitung zu Kimai. Ohne Dich hätte ich mit den Middlewares zu Traefik sicher Mist gebaut.
So läuft es 🙂
Ich habe ein paar Anmerkungen:
Ich habe die Pfade für die Volumes manuell angelegt, ich vermute, das hätte auch Docker für mich erledigt.
Der Admin-User wurde bei mir nicht angelegt, ein docker compose down und docker compose up -d haben dann beim zweiten Durchlauf Fehlerfrei geklappt.
Es gab einige Fehlermeldungen bzgl. Trusted Hosts. Hier muss man neuerdings wohl die Pipe | statt Komma , nutzen.
Ich habe Deine Anleitung auf Mariadb migriert, so spart man sich den Download eines zusätzlichen Images, wenn man parallel die Nextcloud verwendet.Gerne mal drüber schauen und ggf als Basis für ein Update verwenden 🙂
Danke für Die tolle Vorarbeit!
Jochen
+++
services:
sqldb:
image: mariadb:lts
container_name: kimai-db
volumes:
– /etc/localtime:/etc/localtime:ro
– /etc/timezone:/etc/timezone:ro
– ./database:/var/lib/mysql
environment:
– MYSQL_DATABASE=kimai
– MYSQL_USER=kimaiuser
– MYSQL_PASSWORD=kimaipassword
– MYSQL_ROOT_PASSWORD=sicheresPassword
– MYSQL_INITDB_SKIP_TZINFO=1
– MARIADB_AUTO_UPGRADE=1
command: –default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h localhost –silent
interval: 20s
start_period: 10s
timeout: 10s
retries: 3
networks:
– default
kimai:
image: kimai/kimai2:stable
container_name: kimai-app
volumes:
– ./data:/opt/kimai/var/data
– ./plugins:/opt/kimai/var/plugins
– ./local.yaml:/opt/kimai/config/packages/local.yaml
– /etc/localtime:/etc/localtime:ro
– /etc/timezone:/etc/timezone:ro
environment:
– APP_SECRET= # IT IS IMPORTANT THAT YOU CHANGE THIS TO A LONG RANDOM STRING
– TRUSTED_HOSTS=${HOST}|localhost|127.0.0.1|traefik|nginx|kimai|kimai.deinedomain.de # set this to the domain name you use to access Kimai
– ADMINMAIL=admin@example.com
– ADMINPASS=changemeplease
– “DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4”
restart: unless-stopped
networks:
– default
– proxy
labels:
– “traefik.enable=true”
– “traefik.http.routers.kimai.entrypoints=websecure”
– “traefik.http.routers.kimai.rule=Host(
kimai.deinedomain.de)”– “traefik.http.routers.kimai.tls=true”
– “traefik.http.routers.kimai.tls.certresolver=http_resolver”
– “traefik.http.routers.kimai.service=kimai”
– “traefik.http.services.kimai.loadbalancer.server.port=8001”
– “traefik.docker.network=proxy”
– “traefik.http.routers.kimai.middlewares=default@file”
networks:
proxy:
external: true
volumes:
data:
mysql:
Hallo und vielen Dank für diese ordentliche Anleitung. Eine kleine Frage hätte ich aber dazu – beim Lesen auf der Kimai Webseite im Bereich der Docker Konfiguration ist mir aufgefallen, dass dort aktuell mysql 8.3 verwendet wird und hier 5.7 – gibt es da einen Grund für?