Torrin Leonard
· 1 min read

Kimai time tracker setup guide.

A quick, copy-paste Docker Compose setup for running Kimai with a MySQL backend. It walks you through creating a .env, launching the stack, and getting Kimai reachable on port 8001.

Read the full story of how Kimai saved my parents' company $28,800 a year: A Time Tracking App Wanted $28,800 a Year Official docs: https://www.kimai.org/documentation/docker-compose.html

Quick Kimai (Docker Compose) Setup

  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-stopped
  1. Start it:

docker compose up -d
  1. Open it:

  • http://localhost:8001

  • Login: ${ADMIN_EMAIL} / ${ADMIN_PASSWORD}

© Torrin Leonard 2026 🇨🇦