diff --git a/Dockerfile b/Dockerfile index 8598071..be25d52 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,16 @@ -FROM node:20-alpine +FROM node:20-slim -# Install simple static file server -RUN npm install -g serve - -# Create app directory WORKDIR /app -# Copy all files +# Erst Manifeste kopieren → Layer-Cache für npm install +COPY package*.json ./ +RUN npm install --omit=dev + +# Rest der App COPY . . -# Start server on the port defined by Railway ($PORT) -# If $PORT is not set, default to 3000 -CMD serve -s . -l tcp://0.0.0.0:${PORT:-3000} +ENV PORT=3000 +ENV DATA_DIR=/data +EXPOSE 3000 + +CMD ["node", "server/index.js"] diff --git a/package.json b/package.json new file mode 100644 index 0000000..bce37c3 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "dienstplan-pro", + "version": "1.0.0", + "private": true, + "type": "commonjs", + "scripts": { + "start": "node server/index.js", + "test": "node --test" + }, + "dependencies": { + "better-sqlite3": "^11.3.0", + "express": "^4.21.0" + } +} diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..56b8579 --- /dev/null +++ b/server/index.js @@ -0,0 +1,17 @@ +const path = require('path'); +const express = require('express'); + +const app = express(); +app.use(express.json({ limit: '5mb' })); + +app.get('/api/health', (req, res) => res.json({ status: 'ok' })); + +// Statisches Frontend (Repo-Root). Dotfiles werden per Default nicht ausgeliefert. +app.use(express.static(path.join(__dirname, '..'))); + +if (require.main === module) { + const PORT = process.env.PORT || 3000; + app.listen(PORT, '0.0.0.0', () => console.log(`Dienstplan-Pro auf :${PORT}`)); +} + +module.exports = app; diff --git a/server/index.test.js b/server/index.test.js new file mode 100644 index 0000000..38a4433 --- /dev/null +++ b/server/index.test.js @@ -0,0 +1,16 @@ +const { test } = require('node:test'); +const assert = require('node:assert'); +const app = require('./index'); + +test('GET /api/health liefert ok', async () => { + const server = app.listen(0); + const { port } = server.address(); + try { + const res = await fetch(`http://127.0.0.1:${port}/api/health`); + assert.strictEqual(res.status, 200); + const body = await res.json(); + assert.strictEqual(body.status, 'ok'); + } finally { + server.close(); + } +});