admin 29f7ca507e Fix: Team-Mitglied hinzufügen aktualisiert Anzeige ohne Reload
api.js hat bei jeder Antwort außer Status 204 zwingend versucht, den
Body als JSON zu parsen. POST /api/teams/:id/members antwortet aber
mit leerem 201-Body, wodurch ein "Unexpected end of JSON input"-Fehler
die Ausführung abbrach, bevor der neue Mitarbeiter in die reaktive
Team-Mitgliederliste gepusht wurde. request() prüft jetzt generisch,
ob überhaupt ein Body vorhanden ist, statt sich auf den Statuscode zu
verlassen.
2026-07-04 00:26:09 +02:00

Ressourcenplanung

Leichtgewichtige App zur Planung von Projekten, Aufgaben, Mitarbeitern und Teams mit Zeitplan (Gantt), Auslastungs-Heatmap und Team-Verwaltung. Daten liegen in SQLite.

Aufbau

ressourcenplanung/
├── server/        Node/Express + SQLite (better-sqlite3)
│   ├── schema.sql     Tabellen & Beziehungen
│   ├── db.js          DB-Init + Beispieldaten
│   └── index.js       REST-API (CRUD + Auslastungsberechnung)
└── client/        Vue 3 + Vite
    └── src/
        ├── App.vue              Tab-Navigation
        ├── SchedulePanel.vue     Gantt-Zeitplan
        ├── UtilizationPanel.vue  Auslastungs-Heatmap
        ├── ProjectsPanel.vue     Projekte/Aufgaben inkl. Zuweisungen
        ├── EmployeesPanel.vue    Mitarbeiter
        ├── TeamsPanel.vue        Teams (n:m-Mitgliedschaft)
        ├── store.js              Reaktiver State + CRUD gegen die API
        ├── api.js                API-Client
        └── helpers.js            Datum-/Gantt-/Farbberechnung

Lokale Entwicklung

Zwei Terminals.

1) Backend

cd server
npm install
npm run dev          # startet auf http://localhost:8080

Beim ersten Start wird server/data/data.db angelegt und mit Beispieldaten befüllt.

2) Frontend

cd client
npm install
npm run dev          # startet auf http://localhost:5173

Browser auf http://localhost:5173 öffnen. Vite leitet /api und /health per Proxy an das Backend weiter.

Deployment (Docker)

Die App läuft als ein Container: Das Backend serviert die REST-API und das gebaute Frontend intern über Port 8080, nach außen gemappt auf Host-Port 8090 (siehe docker-compose.yml).

docker compose up --build

Danach ist die App unter http://localhost:8090 erreichbar. Die SQLite-Datenbank liegt im Docker-Volume data.

Deployment in Coolify

  1. Repository verbinden: Dieses Repo (admin/ressourcenplanung auf Gitea) in Coolify als neue Ressource hinzufügen (New Resource → Application → Gitea-Repo auswählen).
  2. Build-Pack: Docker Compose wählen. Das mitgelieferte docker-compose.yml baut das Dockerfile (Multi-Stage: Vue-Build + Node-Server) und startet einen einzelnen Container.
  3. Port: Der Container lauscht intern auf Port 8080, im docker-compose.yml auf Host-Port 8090 gemappt (Port 8080 war auf dem Host bereits durch eine andere Ressource belegt → driver failed programming external connectivity ... port is already allocated). In Coolify unter "Domains"/der Port-Konfiguration der Ressource muss der Host-Port (8090) explizit eingetragen werden — das passiert nicht automatisch. Falls auch 8090 belegt sein sollte, in docker-compose.yml einen anderen freien Host-Port wählen (z. B. "8091:8080") und die Coolify-Konfiguration entsprechend nachziehen.
  4. Persistenz: Das Docker-Volume data sichert server/data/data.db (SQLite). Bei Redeploys bleiben die Daten erhalten, solange das Volume nicht gelöscht wird. Coolifys eingebaute Volume-Backup-Funktion kann dafür verwendet werden.
  5. Healthcheck: Das Image bringt einen HEALTHCHECK gegen /health mit; Coolify nutzt ihn automatisch, um den Container-Status anzuzeigen.
  6. Deploy klicken. Beim allerersten Start legt der Server automatisch data.db an und befüllt sie mit Beispieldaten.
S
Description
Ressourcenplanung: Projekte, Aufgaben, Mitarbeiter, Teams, Zeitplan & Auslastung
Readme 152 KiB
Languages
JavaScript 61.4%
Vue 33.3%
CSS 4.3%
Dockerfile 0.7%
HTML 0.3%