# Kimai Zeiterfassung

# Installtion

# Installation via Docker

### Beschreibung

Kimai via Docker mit https via Letsencrypt.

### Installation

#### Vorbereitung

Sollte Apparmor enabled sein, wie das bei hetzner der Fall ist dann noch eben die Apparmor Pakete installieren

```
apt-get install apparmor apparmor-utils curl docker.io docker-compose
```

Als erstes erstellen wir unsere Verzeichnisse

```
mkdir -p /root/kimai/mariadb
mkdir -p /root/kimai/data
mkdir -p /root/kimai/plugins
```

Nun erstellen wir im Verzeichnis /root/kimai eine neue Datei namens .env

```
nano /root/kimai/.env
```

Inhalt:

```
# MySQL Credentials
MYSQL_ROOT_PASSWORD=12345678
MYSQL_USER=kimai
MYSQL_PASSWORD=1234567890
MYSQL_DATABASE=kimai

# Volume directories
MARIADB_VOLUME_DIR=/root/kimai/mariadb
DATA_VOLUME_DIR=/root/kimai/data

```

#### Docker-compose Datei erstellen

```
nano /root/kimai/docker-compose.yml
```

Inhalt

```
ersion: '3.3'

services:
  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    volumes:
      - ${MARIADB_VOLUME_DIR}:/var/lib/mysql

  kimai:
    image: kimai/kimai2:apache
    restart: unless-stopped
    environment:
      - DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mariadb/${MYSQL_DATABASE}
    volumes:
      - ${DATA_VOLUME_DIR}:/opt/kimai/var
      - ./plugins:/opt/kimai/var/plugins

  caddy:
    image: caddy:latest
    container_name: caddy-reverse-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    restart: unless-stopped

```

Nun Caddyfile erstellen

```
nano /root/kimai/Caddyfile
```

Inhalt

```
zeit.example.tld {
    reverse_proxy http://kimai:8001
    tls info@example.tld {
        #ca https://acme-staging-v02.api.letsencrypt.org/directory
    }
}

```

Nun sicher stellen das die ports 80 und 443 auch über die Domain auf den Server erreichbar sind.

hier ein kleines Script das auf den port 80 lauscht um dies zu testen

```
nano /root/kimai/testeweb.sh
```

Inhalt

```
#!/bin/bash

# Funktion, die aufgerufen wird, wenn das Skript ein SIGINT-Signal (Ctrl+C) empfängt
cleanup() {
    echo "Server wird beendet..."
    exit 0
}

# Trap für das SIGINT-Signal einrichten
trap cleanup SIGINT

# Endlosschleife für den Server
while true; do
    # Listen on port 80
    { echo -ne "HTTP/1.1 200 OK\r\nContent-Length: $(echo -n "Hello, World!" | wc -c)\r\n\r\nHello, World!"; } | nc -l -p 80 -q 1
done

```

Danach ausführbar machen

```
chmod +x /root/kimai/testeweb.sh
```

nun das Script starten, kann mit strg+c wieder abgebrochen werden.   
Nun kann getestet werden ob Firewall/Portforwarding richtig funktioniert, idem in einem Webbrowser die public ip aufegrufen wird.  
Es muss eine hello World Seite zurück gegben werden.

Container Starten

Ins kimai Verzeichnis gehen

```
cd /root/kimai
```

Nun den Conatiner starten

```
 docker-compose up -d 
```

#### Benutzer anlegen

##### Die Rollen

<table class="table" id="bkmrk-role-name-descriptio"><thead><tr><th>Role name</th><th>Description</th></tr></thead><tbody><tr><td>User</td><td>Normal user can track their working times, see basic reports and change their own preferences. Technical name: `ROLE_USER`</td></tr><tr><td>Teamlead</td><td>Manages [teams](https://www.kimai.org/documentation/teams.html) with permissions for invoices and access to all **team** timesheets. Technical name: `ROLE_TEAMLEAD`</td></tr><tr><td>Administrator</td><td>Can manage all content and timesheet related data, but lack user administration and system privileges. Technical name: `ROLE_ADMIN`</td></tr><tr><td>System-Admin</td><td>Has permissions to manage everything in Kimai, from content to timesheets to users, plugins and system configurations. Technical name: `ROLE_SUPER_ADMIN`</td></tr></tbody></table>

```
die container id mit docker ps herausfinden

docker exec -ti <containerid> \
         /opt/kimai/bin/console kimai:user:create <username> <emailadresse> ROLE_SUPER_ADMIN

Beispiel:

docker exec -ti 32da986c57c2 \
         /opt/kimai/bin/console kimai:user:create admin admin@example.com ROLE_SUPER_ADMIN
         
Dann kann ein Kennwort vergeben werden. Muss mindestens 8 Zeichen haben

```

#### Benutzer Passwort ändern  


```
die container id mit docker ps herausfinden

docker exec -ti <containerid> \
         /opt/kimai/bin/console kimai:user:password <username> 

Beispiel:

docker exec -ti 32da986c57c2 \
         /opt/kimai/bin/console kimai:user:password admin 
         
Dann kann ein neues Kennwort vergeben werden. Muss mindestens 8 Zeichen haben

```

####   

# Mobile App

### Beschreibung:

Für Kimai gibt es auch eine Mobile App.

Aus dem AppStore die Mobile App installieren:

iOS [link zum Store](https://apps.apple.com/us/app/kimai-mobile/id1563933145)

Android [Link zum Store](https://play.google.com/store/apps/details?id=de.cloudrizon.kimaimobile)

### Benutzer freischalten im Kimai Backend.

Damit sich der Benutzer anmelden kann, muss in den Benutzereinstellungen ein APi Passwort (Nicht Token) hinterlegt werden.  
Beim Passwort kommt der Hinweis das diese methode veraltet ist, aber die Mobil App nutzt zur zeit nur Passwort.

Dazu gehen wir Auf System -&gt; Benutzer

[![Auswahl_1229.png](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/9DMDBsOX8zgtBR7U-auswahl-1229.png)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/9DMDBsOX8zgtBR7U-auswahl-1229.png)

Dann den benutzer anklicken, für den wir das API Passwort erstellen wollen

[![Auswahl_1230.png](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/XkKf3o45FG0Nsv93-auswahl-1230.png)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/XkKf3o45FG0Nsv93-auswahl-1230.png)Dort dann oben auf bearbeiten klicken und API Zugang auswählen

[![Menü_014.png](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/rjglURguvaYMWc7E-menu-014.png)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/rjglURguvaYMWc7E-menu-014.png)

Nun das neue Kennwort setzten und speichern.

### [![Auswahl_1231.png](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/Ya89fDaHkEKh1KMA-auswahl-1231.png)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/Ya89fDaHkEKh1KMA-auswahl-1231.png)  
Einloggen auf der Mobile App

Create Workspace anklicken.

Daten ausfüllen.

Workspace Name, zum Beispiel Firmenname.  
Server URL : die Kimai Seite [https://vorweg](https://vorweg) schreiben  
Die APP Funktioniert nur über https

Email / Username : den Benutzernamen eintragen  
Password: Das API Kennwort

Nun auf Create a new Workspace klicken.

[![Screenshot_2024-07-08-13-00-22-26_f1c6ba619212653817d1dec5c2916048.jpg](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/fDxitAYithsyhVCp-screenshot-2024-07-08-13-00-22-26-f1c6ba619212653817d1dec5c2916048.jpg)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/fDxitAYithsyhVCp-screenshot-2024-07-08-13-00-22-26-f1c6ba619212653817d1dec5c2916048.jpg)

Und eingeloggt:

[![Screenshot_2024-07-08-13-02-40-71_f1c6ba619212653817d1dec5c2916048.jpg](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/scaled-1680-/rToTgEBm7cpWdzVp-screenshot-2024-07-08-13-02-40-71-f1c6ba619212653817d1dec5c2916048.jpg)](https://wiki.hacker-net.de/uploads/images/gallery/2024-07/rToTgEBm7cpWdzVp-screenshot-2024-07-08-13-02-40-71-f1c6ba619212653817d1dec5c2916048.jpg)

# Kimai Terminal

# Einleitung und Teile Liste

### Beschreibung:

Ein KIMAi terminal Kostengüntig mit nem SONOFF Switch.  
Günstiger bekommt man es nicht zusammen.

### Teile Liste:

SONOFF Switch (SONOFFT4EU1C, t4eu1c ) [SonOff Tooch Store Link](https://www.barcelonaled.com/de/smart-home/sonoff-touch-interruptor-tactil-wifi-smarthome.html?utm_source=google&utm_medium=cpc&utm_campaign=Alemania-todos&gad_source=1&gclid=CjwKCAjwnK60BhA9EiwAmpHZw6cATR1c9s_4UIBxZQo8W3qn0dFiDCyJxFYfCzj6SrolNLlQF9dTYBoC0TgQAvD_BwE)  
  
Wenn man kein SONOFF kaufen möchte kann man auch einfach den Microcontroller nutzen der WLAN schon drauf hat:  
[AZDelivery-NodeMCU-ESP8266-ESP-12E-Development](https://www.amazon.de/AZDelivery-NodeMCU-ESP8266-ESP-12E-Development/dp/B06Y1ZPNMS/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=nodemcu&qid=1586979946&sr=8-3&tag=hackernette0b-21)  
ich find den SONOFF aber Praktisch, alles schon drin in einem Gehäuse

RFID Plate mit 5 Dongle : 5er Pack Rabatt (Sonst kostent einer schon 7 EURO ohne Dongle) [RFID-Kit-Arduino-Raspberry-SPI-Schnittstelle](https://www.amazon.de/Funduino-RFID-Kit-Arduino-Raspberry-SPI-Schnittstelle/dp/B0CH8CPQ7K/ref=sr_1_1_sspa?crid=1X5IH2HMGHMTJ&dib=eyJ2IjoiMSJ9.BtIwdCsTf3VFWBloRFhuiwYcJnjaHYrXZG9euqDWXLIzofjlYKrARFduuji2aF8_-hYVw1ZKgYTKYtHQv0Daa5t1U3VRHL8PP6QhNrUcJDgqvbTbVwMyCHVqH46U8ofQPLeWIFZkaYq38GJOsDANQyxfXW-JT9cDH7MAYDv0f_whGCMVofuHUbMjdrSdNgv_44gAIRTnpfWnuwkYBi_sJKGe1GRMePiHBNZJ-msYMiA.hElXIL7BmvhwrSnpiG8uLxw2eZgs6NFJlHlz1QDnZhU&dib_tag=se&keywords=SPI+RFID+reader+board&qid=1720439412&sprefix=spi+rfid+reader+board%2Caps%2C157&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1&tag=hackernette0b-21)

OLDED Display  
(APKLVSR 3PCS 0,96 Zoll OLED Display I2C 128 x 64 Pixel I2C Display Modul, (Gelb und Blau)) :   
Link : [APKLVSR-Display-kompatibel-Arduino-Raspberry](https://www.amazon.de/APKLVSR-Display-kompatibel-Arduino-Raspberry/dp/B0D2L18NWT/ref=sr_1_1_sspa?crid=LKW44KFUXUHV&keywords=Gosear-Zoll-serielle-Display-Modul-Arduino-blau&qid=1720439510&sprefix=gosear-zoll-serielle-display-modul-arduino-blau%2Caps%2C132&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9tdGY&psc=1&tag=hackernette0b-21)

UART Interface (Wird nur für SONOFF gebraucht, das NodeMCU hat einen USB Anschluss : [UART-Wandler-Adapter-serielle-Schnittstelle-Converter-Anschlussleitung](https://www.amazon.de/UART-Wandler-Adapter-serielle-Schnittstelle-Converter-Anschlussleitung/dp/B0773G2K92/ref=sr_1_7?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=uart+usb&qid=1586978990&sr=8-7&tag=hackernette0b-21)

100 Dongle zum Nachbestellen extrem Klasse Preis : [Chips-125KHz-Transponder 100 Stück](https://www.amazon.de/AZDelivery-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90100-Chips-125KHz-Transponder/dp/B07B3QQ97Y/ref=sr_1_2_sspa?crid=2YDR3G16DR3XI&dib=eyJ2IjoiMSJ9.wWnGpzS8JOb-BS4cX38FZK_jHydfy5A5eIWUYCp7YCdRKVebO5KCGD-h5M2sbE4Kb3D204lleRpo4UL-eFo13eH3aDvj7Yl8MmsJOrV-qI_7QvAwPWK5ovgNUIjfRDldYNALTZtZDESBYkYq1h6sWB0hT-tx2b6IPWplP2gUUbHcpR_k7F0pq2-4zXKK88vSQI0SEz4LHdRzp67LyqteISPbjyWIC6IKyTtXzQOGvpwJz9GOxtv87er14n_c3gbxYX-roUJxqqJc91RvCPHEsKxkrHvwWfs-6FxDLSiy-D8.tP2onHWD_5aZF5FFrLZj-Jrq_WLA7W5dym88E628TPk&dib_tag=se&keywords=rfid%2Bchip&qid=1720440048&sprefix=rfid%2Bchip%2Caps%2C95&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&tag=hackernette0b-21&th=1)

# Plugin Invoice Bundle

# Installation invoiceBundle

### Beschreibung:

Ein Plugin mit dem Gleichzeitig Stundenzettel generiert und Rechnungen erstellt werden können.  
Mich Persönlich interessieren nur die Stundenzettel

Da ich Kimai im Docker betreibe ist die Installation an dem Docker setup Angelehnt

### Vorrausetzungen:

```
apt install unzip
```

### Installation bei Kimai Docker:

In Das Verzeichnis Plugins die Zip Datei exhtrahieren. [InvoiceBundle-2.2.0.zip](https://wiki.hacker-net.de/attachments/94)  
Dazu per scp die Datei auf den Server kopieren, versionsnummer kann natürlich varieren

```
scp InvoiceBundle-2.2.0.zip root@zeit.example.tld:/root/kimai
```

Nun entpacken

```
cd root/kimai
unzip InvoiceBundle-2.2.0.zip
```

ls Ausgabe:

Nun haben Wir ein verzeichnis InvoiceBundle-2.2.0

```
ls
caddy_config  caddy_data  Caddyfile  certbot-etc  certbot-log  certbot-www  data  docker-compose.yml  InvoiceBundle-2.2.0  InvoiceBundle-2.2.0.zip  mariadb  plugins

```

Dieses umbenennen und verschieben

```
mv InvoiceBundle-2.2.0 plugins/InvoiceBundle
```

Nun muss im InvoiceBundle Verzeichnis der inhsalt so aussehen

ls Ausgabe:

```
ls
CHANGELOG.md  composer.json  Controller  DependencyInjection  EventSubscriber  Form  Invoice  InvoiceBundle.php  LICENSE  phpstan.neon	README.md  Resources  Tests

```

Nun nur noch den Cache leeren, dazu im kima Container einloggen

```
docker-compose exec kimai /opt/kimai/bin/console kimai:reload --env=prod
```

Ausgabe bei mir mit Fehler zu alt. :

```
root@debian-kimai-4gb-nbg1-2:~/kimai# docker-compose exec kimai /opt/kimai/bin/console kimai:reload --env=prod

In Kernel.php line 115:
                                                                                                                                                       
  Bundle "InvoiceBundle" requires minimum Kimai version 22700, but yours is lower: 2.18.0 (21800). Please update Kimai or use a lower Plugin version.
```

##### Also kimai aktualiseren

```
docker pull kimai/kimai2:apache
docker-compose up -d
docker-compose exec kimai /opt/kimai/bin/console kimai:reload --env=prod
docker-compose down
docker-compose up -d
docker-compose exec kimai /opt/kimai/bin/console assets:install
docker-compose exec kimai /opt/kimai/bin/console kimai:reload --env=prod

```

Nun Verzeichnis Berechtigungen setzten, Dazu in den Container einloggen

```
docker-compose exec kimai /bin/bash
```

Nun ausführen

```
cd /opt/kimai/var
chown -R :www-data .
chmod -R g+r .
chmod -R g+rw /opt/kimai/var/
```

#### Nun Einstellungen in Kimai:

Unter System -&gt; Einstellungen

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/S8qQRVfeYIr7m8kG-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/S8qQRVfeYIr7m8kG-grafik.png)

Nun runter scrollen bis Invoice  
Dort Rechungsnummerformat Sprache und template für den Stundenzettel Rechung einstellen

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/woBxMSuRoI0U9H6I-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/woBxMSuRoI0U9H6I-grafik.png)

# Einrichtung Invoice Bundle

Beschreibung:  
  
nach dem das Plugin installiert.  
Das format eingerichtet ist.  
  
geht nun weiter

Eigene Firmenvorlage einrichten:  
  
Unter Rechnungen -&gt; Rechungsvorlagen -&gt; Auf erstellen klicken

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/cftkZde2ASxCprlg-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/cftkZde2ASxCprlg-grafik.png)

Rechnung / Stundenzettel erstellen:

Nun Auf Rechnungen -&gt; Rechnung erstellen klicken und Zeitraum Kunde Projekt auswählen. Will man alle projekte, das Projekt wieder entfernen.  
Exportier nein und auf suchen klicken

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/sQjFROhZ0n1VmZKw-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/sQjFROhZ0n1VmZKw-grafik.png)

Nun erscheint eine Liste mit den gefunden Einträgen.  
Durch klick auf Speichern werden alle Eintrage auf eien Rechung / Leistungsnachweis gepackt.  
Möchte man das getrennt haben. Einfach nach mehren Datumsbereichen suchen und mehrere Rechungen abspeichern.  
Über die Buttons Vorschau kann man sich die Rechnung anschauen und speichern dann absenden.

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/440dNy2UOPhW5jlY-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/440dNy2UOPhW5jlY-grafik.png)  
Nun kann Unter Rechnungen -&gt; rechnungshistorie dier Stundenzettel downgeloaded werden

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/scaled-1680-/zGyArwvCXo6eyFNO-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-06/zGyArwvCXo6eyFNO-grafik.png)

Fertig