Files
2026-06-30 20:02:07 +00:00

124 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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, MoFr)
- Lauf­ender 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.