diff --git a/README.md b/README.md index db6c479..8e1ff6e 100644 --- a/README.md +++ b/README.md @@ -87,16 +87,25 @@ 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`). +gebaute Frontend intern über Port 8080. `docker-compose.yml` ist auf den in +Coolify installierten Caddy-Proxy zugeschnitten (siehe Abschnitt +"Deployment in Coolify") — es wird kein Host-Port mehr veröffentlicht, +stattdessen hängt sich der Container über das externe Docker-Netzwerk +`coolify` in den Proxy ein und ist über die im `caddy`-Label hinterlegte +Domain erreichbar. + +Für einen rein lokalen Test außerhalb von Coolify muss das Netzwerk zuerst +angelegt werden, danach ist die App (ohne Domain/TLS) nur über die +Container-IP oder testweise per Port-Override erreichbar: ```bash +docker network create coolify # einmalig, falls nicht vorhanden docker compose up --build ``` -Danach ist die App unter http://localhost:8090 erreichbar. Die SQLite-Datenbank -liegt im Docker-Volume `data`. `ADMIN_EMAIL` vor dem ersten Start setzen (z. B. -in einer `.env`-Datei neben `docker-compose.yml`), damit ein Start-Admin für +Die SQLite-Datenbank liegt im Docker-Volume `data`. `ADMIN_EMAIL` vor dem +ersten Start setzen (z. B. in einer `.env`-Datei neben `docker-compose.yml`), +damit ein Start-Admin für einen bestehenden Mitarbeiter angelegt wird. ## Umstieg von der alten Version (ohne Login) @@ -150,15 +159,17 @@ beim nächsten Login vergeben. Mit `--password` wird sofort ein Passwort gesetzt 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. +3. **Routing über den Caddy-Proxy**: Der Container veröffentlicht keinen + Host-Port mehr, sondern hängt sich über das externe Netzwerk `coolify` + (von Coolify automatisch angelegt) in den von Coolify verwalteten + Caddy-Proxy ein. Die Labels in `docker-compose.yml` + (`caddy: ressourceksr.bbundco.de` / `caddy.reverse_proxy: + "{{upstreams 8080}}"`) sorgen dafür, dass Caddy die Domain automatisch + auf Container-Port `8080` routet und ein TLS-Zertifikat besorgt. Damit + das funktioniert, muss die Domain per DNS (A/AAAA-Record) auf den + Coolify-Host zeigen; einen zusätzlichen Domain-/Port-Eintrag in der + Coolify-UI braucht es für dieses Setup nicht mehr. Soll die App unter + einer anderen Domain laufen, das `caddy`-Label entsprechend anpassen. 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 diff --git a/docker-compose.yml b/docker-compose.yml index b51f020..bf13296 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,22 @@ services: app: build: . - ports: - - "8090:8080" + expose: + - "8080" environment: - ADMIN_EMAIL=${ADMIN_EMAIL} volumes: - data:/app/server/data + networks: + - coolify + labels: + caddy: ressourceksr.bbundco.de + caddy.reverse_proxy: "{{upstreams 8080}}" restart: unless-stopped +networks: + coolify: + external: true + volumes: data: