124 lines
4.9 KiB
Markdown
124 lines
4.9 KiB
Markdown
# Zeitkonto
|
||
|
||
Eine kleine Web-App zur Arbeitszeiterfassung. Du trägst pro Tag Start-,
|
||
End- und Pausenzeit ein, die App berechnet daraus automatisch deine
|
||
Über- bzw. Minusstunden (dein "Zeitkonto") — pro Tag, pro Monat und als
|
||
laufenden Gesamtsaldo.
|
||
|
||
**Stack:** Node.js / Express / EJS, Daten werden in MongoDB gespeichert.
|
||
Login ist über einen einzelnen Benutzer geschützt (Zugangsdaten per
|
||
Umgebungsvariable).
|
||
|
||
## Funktionen
|
||
|
||
- Tägliche Buchung von Start-, Endzeit und Pause → automatische Berechnung
|
||
der geleisteten Stunden
|
||
- Soll-Stunden pro Tag und Arbeitstage frei einstellbar (z. B. 8 h, Mo–Fr)
|
||
- Laufender Gesamtsaldo (Überstunden/Minusstunden), inkl. optionalem
|
||
Start-Guthaben für bereits bestehende Überstunden
|
||
- Monatsübersicht
|
||
- Bearbeiten und Löschen einzelner Buchungen
|
||
- Einfacher Login-Schutz (ein Benutzer, Zugangsdaten per Env-Variable)
|
||
|
||
## Lokal testen
|
||
|
||
Voraussetzung: Docker und Docker Compose.
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
# .env nach Bedarf anpassen (APP_PASSWORD, SESSION_SECRET ...)
|
||
|
||
docker compose up --build
|
||
```
|
||
|
||
Die App ist danach unter `http://localhost:3000` erreichbar. Login mit den
|
||
Werten aus `APP_USERNAME` / `APP_PASSWORD` (Standard: `admin` / siehe
|
||
`.env.example`).
|
||
|
||
## Deployment in Coolify
|
||
|
||
Die App bringt ein fertiges `docker-compose.yml` mit (App + MongoDB inkl.
|
||
Volume für die Datenbank), das sich als ein einziges Coolify-Projekt
|
||
deployen lässt.
|
||
|
||
1. **Code in ein Git-Repository pushen** (GitHub, GitLab, Gitea, Bitbucket
|
||
— egal, Coolify unterstützt alle gängigen Anbieter, auch selbst
|
||
gehostete).
|
||
2. In Coolify: **New Resource → Docker Compose** und das Repository
|
||
auswählen bzw. die URL eingeben. Coolify erkennt die `docker-compose.yml`
|
||
automatisch (Build Pack: *Docker Compose*).
|
||
3. **Umgebungsvariablen setzen** (Tab *Environment Variables* der
|
||
Resource): mindestens
|
||
- `APP_USERNAME`
|
||
- `APP_PASSWORD`
|
||
- `SESSION_SECRET` (langer zufälliger String)
|
||
|
||
`MONGODB_URI` und `PORT` sind in der `docker-compose.yml` bereits fest
|
||
auf die interne Mongo-Verbindung gesetzt und müssen nicht verändert
|
||
werden.
|
||
4. **Domain für die App vergeben.** Dafür zwei Möglichkeiten:
|
||
- Im Coolify-UI bei der Resource den Service `app` öffnen und unter
|
||
*Domains* eine Domain (oder Coolifys generierte `sslip.io`-Domain)
|
||
eintragen, **oder**
|
||
- in der `docker-compose.yml` die Zeile `# - SERVICE_FQDN_APP_3000`
|
||
einkommentieren — Coolify generiert dann automatisch eine Domain auf
|
||
Basis deiner Wildcard-Domain.
|
||
5. **Deploy** klicken. Coolify baut das Image, startet MongoDB und die App
|
||
im selben internen Docker-Netzwerk und richtet automatisch HTTPS
|
||
(Let's Encrypt) für die vergebene Domain ein.
|
||
|
||
Die MongoDB ist dabei **nicht** öffentlich erreichbar — sie läuft nur im
|
||
internen Netzwerk und ist für die App über den Service-Namen `mongo`
|
||
ansprechbar. Die Daten liegen in einem persistenten Volume (`mongo_data`)
|
||
und bleiben bei Redeploys erhalten.
|
||
|
||
### Alternative: Coolifys eigene Mongo-Datenbank nutzen
|
||
|
||
Statt MongoDB im `docker-compose.yml` mitlaufen zu lassen, kannst du in
|
||
Coolify auch **New Resource → Database → MongoDB** als eigene, separat
|
||
verwaltete Datenbank anlegen und die App stattdessen per `Dockerfile` als
|
||
normale *Application*-Resource deployen. Trag in diesem Fall die von
|
||
Coolify angezeigte Connection-String als `MONGODB_URI` in den
|
||
Umgebungsvariablen der App ein. Das `docker-compose.yml` brauchst du dann
|
||
nicht.
|
||
|
||
## Einstellungen nach dem ersten Login
|
||
|
||
Unter **Einstellungen** legst du fest:
|
||
|
||
- Soll-Arbeitszeit pro Arbeitstag (z. B. 8 Stunden)
|
||
- An welchen Wochentagen überhaupt gearbeitet wird
|
||
- Ein optionales Start-Guthaben in Stunden, falls du schon vor der
|
||
Nutzung dieser App ein Über- oder Minusstunden-Konto hattest
|
||
|
||
Diese Werte wirken sich nur auf **neue** Buchungen aus — bereits
|
||
gespeicherte Tage behalten den Saldo, der zum Zeitpunkt ihrer Erfassung
|
||
berechnet wurde.
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
zeitkonto/
|
||
├── server.js Einstiegspunkt (Express-App)
|
||
├── src/
|
||
│ ├── db.js MongoDB-Verbindung (mit Retry)
|
||
│ ├── middleware/auth.js Login-Schutz
|
||
│ ├── models/ Mongoose-Schemas (TimeEntry, Settings)
|
||
│ ├── routes/ Login, Dashboard/Buchungen, Einstellungen
|
||
│ └── utils/time.js Zeit-/Saldoberechnungen
|
||
├── views/ EJS-Templates
|
||
├── public/css/style.css Styling
|
||
├── Dockerfile
|
||
├── docker-compose.yml App + MongoDB für Coolify/lokal
|
||
└── .env.example
|
||
```
|
||
|
||
## Sicherheitshinweis
|
||
|
||
Der Login schützt mit einem einzelnen Benutzernamen/Passwort-Paar aus den
|
||
Umgebungsvariablen. Das reicht für ein persönliches Tool hinter HTTPS
|
||
(Coolify richtet das automatisch ein), ersetzt aber kein vollwertiges
|
||
Mehrbenutzer-Auth-System. Setze in jedem Fall ein eigenes, starkes
|
||
`APP_PASSWORD` und einen zufälligen `SESSION_SECRET`, bevor du die App
|
||
öffentlich erreichbar machst.
|