Read the full story of how Kimai saved my parent's company $28,800 dollars: Official docs: https://www.kimai.org/documentation/docker-compose.html
1) Create a folder and add these two files:
`.env`
DATABASE_NAME=kimai
DATABASE_USER=kimai
DATABASE_PASSWORD=change-me
DATABASE_ROOT_PASSWORD=change-me-too
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=change-this-now`docker-compose.yml`
services:
sqldb:
image: mysql:8.3
volumes:
- ./mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD}
command: --default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin -p$$MYSQL_ROOT_PASSWORD ping -h localhost"]
interval: 20s
start_period: 10s
timeout: 10s
retries: 3
kimai:
image: kimai/kimai2:apache
depends_on:
- sqldb
volumes:
- ./data:/opt/kimai/var/data
- ./plugins:/opt/kimai/var/plugins
ports:
- "8001:8001"
environment:
ADMINMAIL: ${ADMIN_EMAIL}
ADMINPASS: ${ADMIN_PASSWORD}
DATABASE_URL: "mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@sqldb/${DATABASE_NAME}?charset=utf8mb4&serverVersion=8.3.0"
restart: unless-stopped2) Start it:
docker compose up -d3) Open it:
http://localhost:8001
Login: ${ADMIN_EMAIL} / ${ADMIN_PASSWORD}
© Torrin Leonard 2026 🇨🇦 | Built with