From 74c9fee38eab10dee6865e9046f6015a5fafb8db Mon Sep 17 00:00:00 2001 From: orejudo Date: Fri, 3 Jul 2026 23:08:46 +0200 Subject: [PATCH] Make image Coolify-ready: fix native module build, add healthcheck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .dockerignore fehlte, wodurch node_modules vom Host (macOS-Binaries) das im Container frisch installierte better-sqlite3 überschrieben hat (invalid ELF header). node_modules jetzt rekursiv ausgeschlossen. - Finales Image von node:20-alpine auf node:20-slim gewechselt, da better-sqlite3-Prebuilds gegen glibc gelinkt sind und auf musl/Alpine nicht laden. - HEALTHCHECK gegen /health ergänzt. - README um Coolify-Deployment-Anleitung erweitert. --- .dockerignore | 4 ++++ Dockerfile | 4 +++- README.md | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f620521 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +**/node_modules +server/data +client/dist +.git diff --git a/Dockerfile b/Dockerfile index 5162c89..6ce77ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN npm install COPY client/ ./ RUN npm run build -FROM node:20-alpine +FROM node:20-slim WORKDIR /app COPY server/package.json ./server/ RUN cd server && npm install --omit=dev @@ -15,4 +15,6 @@ COPY --from=client-build /app/client/dist ./client/dist WORKDIR /app/server ENV PORT=8080 EXPOSE 8080 +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s \ + CMD node -e "require('http').get('http://localhost:8080/health', r => process.exit(r.statusCode===200?0:1)).on('error', () => process.exit(1))" CMD ["node", "index.js"] diff --git a/README.md b/README.md index 080b165..725e24e 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,26 @@ docker compose up --build Danach ist die App unter http://localhost:8080 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 auf Port `8080`. In Coolify unter + "Domains"/der Port-Konfiguration der Ressource **muss dieser Port (8080) + explizit eingetragen werden** — das passiert nicht automatisch. Falls + Port 8080 auf dem Host bereits von einer anderen Coolify-Ressource belegt + ist, in `docker-compose.yml` den Host-Port anpassen (z. B. `"8081: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.