Belegungsplan
  • TypeScript 99.1%
  • JavaScript 0.6%
  • Dockerfile 0.2%
Find a file
ollo2012 9c699e043f
All checks were successful
web / gate (push) Successful in 11s
web / release (push) Successful in 14s
Merge pull request 'Turn a person without an account into an account (Stufe 27)' (#7) from ollo2012/stufe-27-konto-umwandeln into main
Reviewed-on: #7
2026-10-12 16:25:12 +00:00
.forgejo/workflows ci: publish images for the staging branch as well as main 2026-10-11 11:00:26 +00:00
assets Stufe 8 Betriebsreife: Einstellungen, Sicherung, PWA, Push, Feinschliff 2026-09-30 11:44:31 +00:00
drizzle feat(persons): turn a person without an account into an account 2026-10-12 11:52:57 +00:00
e2e feat(persons): turn a person without an account into an account 2026-10-12 11:52:57 +00:00
public Stufe 8 Betriebsreife: Einstellungen, Sicherung, PWA, Push, Feinschliff 2026-09-30 11:44:31 +00:00
scripts feat: show a red "Staging" banner when APP_ENV=staging 2026-10-12 09:30:52 +00:00
src feat(persons): turn a person without an account into an account 2026-10-12 11:52:57 +00:00
.dockerignore build: add test stage and run image as uid 1000 2026-10-03 05:45:47 +00:00
.gitignore Stufe 1: Konten, Login & Admin-Modus 2026-09-27 19:52:11 +00:00
.prettierignore Stufe 1: Konten, Login & Admin-Modus 2026-09-27 19:52:11 +00:00
.prettierrc.json Stufe 0: Grundgerüst 2026-09-27 17:33:18 +00:00
AGENTS.md Initial commit from Create Next App 2026-09-27 17:12:16 +00:00
CLAUDE.md Initial commit from Create Next App 2026-09-27 17:12:16 +00:00
Dockerfile build: add test stage and run image as uid 1000 2026-10-03 05:45:47 +00:00
drizzle.config.ts Stufe 0: Grundgerüst 2026-09-27 17:33:18 +00:00
eslint.config.mjs Stufe 0: Grundgerüst 2026-09-27 17:33:18 +00:00
next.config.ts feat: serve health check at /healthz 2026-10-03 05:45:47 +00:00
package-lock.json Stufe 8 Betriebsreife: Einstellungen, Sicherung, PWA, Push, Feinschliff 2026-09-30 11:44:31 +00:00
package.json Stufe 8 Betriebsreife: Einstellungen, Sicherung, PWA, Push, Feinschliff 2026-09-30 11:44:31 +00:00
playwright.config.ts Stufe 1: Konten, Login & Admin-Modus 2026-09-27 19:52:11 +00:00
postcss.config.mjs Initial commit from Create Next App 2026-09-27 17:12:16 +00:00
README.md docs: describe backup download and restore in the danger zone 2026-10-03 12:52:30 +00:00
tsconfig.json Initial commit from Create Next App 2026-09-27 17:12:16 +00:00
vitest.config.mts test: raise unit test timeout to 30 seconds 2026-10-03 13:04:41 +00:00

Ferienwohnung

Web-App für eine Familie zum Belegen einer gemeinsamen Ferienwohnung: Kalender mit Zimmern, Buchungen und Sperren, Benachrichtigungen in der App und per Push, Admin-Modus für Änderungen an Einträgen anderer. Oberfläche auf Deutsch, installierbar als PWA.

Technik: Next.js 16 (App Router), React 19, TypeScript, Drizzle ORM mit SQLite, Vitest, Playwright.

Voraussetzungen

  • Node.js 22

Entwicklung

npm install
npm run dev

Beim ersten Start wird das Konto admin angelegt (siehe ADMIN_START_PASSWORT und TESTPHASE).

Prüfen

npm run check

Führt Formatprüfung, ESLint, Typprüfung, Unit-Tests und E2E-Tests aus. Die E2E-Tests starten einen eigenen Server auf E2E_PORT (Standard 3100); der Port muss frei sein, z. B. E2E_PORT=3100 npm run test:e2e. Nur in der Container-Umgebung dieses Projekts muss zusätzlich LD_LIBRARY_PATH für Playwright gesetzt sein; sonst weglassen.

Betrieb

npm run build
npm run start:standalone

Das Skript kopiert statische Dateien und Migrationen in .next/standalone und startet den Server. Die Datenbank liegt standardmäßig in data/app.db.

Hosting auf onk.style

Die App läuft als Web-Container auf onk.style unter https://glashuette.ollo2012.web.onk.style.

  • Pull Requests durchlaufen den Gate-Job web / gate: die test-Stufe im Dockerfile (Format, Lint, Typprüfung, Unit-Tests, Build und Starttest mit scripts/smoke.mjs) und der Bau des Images. Die E2E-Tests laufen lokal (npm run check) vor dem Merge.
  • Ein Merge auf main ist ein Deployment: .forgejo/workflows/web.yaml veröffentlicht das Image als git.ziemlichoptimal.de/web/ollo2012/glashuette:main. Ein Revert ist ein Rollback.
  • Der Container läuft als Nutzer 1000 mit schreibgeschütztem Dateisystem. Datenbank und Sicherungen liegen im Volume /data (DATABASE_PATH=/data/app.db). Die Plattform prüft GET /healthz.
  • Umgebungsvariablen (z. B. ADMIN_START_PASSWORT für den ersten Start) werden im Concierge (https://concierge.onk.style) beim Container gesetzt, nie im Repo. TESTPHASE bleibt dort ungesetzt.

Sicherung

  • Die laufende App legt täglich automatisch eine Sicherung an, in data/backups bzw. in BACKUP_DIR. Sicherungen der letzten 14 Tage bleiben erhalten, ältere werden gelöscht.
  • Im Gefahrenbereich der Einstellungsseite (Admin-Modus und Recht „Gefahrenbereich“) lässt sich jede Sicherung herunterladen und bei laufender App zurückspielen. Vorher wird der aktuelle Stand als …-vor-wiederherstellung gesichert, danach sind alle abgemeldet.
  • npm run backup erstellt sofort eine Sicherung.
  • npm run restore -- <datei> spielt eine Sicherung zurück (nur ein Dateiname bezieht sich auf den Sicherungsordner; ohne Argument werden die vorhandenen aufgelistet). Die App dafür vorher stoppen. Der bisherige Stand wird als Sicherung …-vor-wiederherstellung abgelegt.

Umgebungsvariablen

Variable Bedeutung Standard
DATABASE_PATH Pfad der SQLite-Datei data/app.db
BACKUP_DIR Ordner der Sicherungen backups neben der Datenbank
TESTPHASE 1: Startpasswort des ersten Kontos ist admin, wenn ADMIN_START_PASSWORT fehlt nicht gesetzt
ADMIN_START_PASSWORT Startpasswort des Kontos admin; nötig beim ersten Start ohne TESTPHASE=1, muss beim Login geändert werden –
VAPID_PUBLIC_KEY Öffentlicher VAPID-Schlüssel für Push (mit dem privaten zusammen) wird erzeugt und in der DB gespeichert
VAPID_PRIVATE_KEY Privater VAPID-Schlüssel für Push wie oben
VAPID_SUBJECT Kontakt für Push-Dienste (mailto: oder https:) mailto:fun@olejancke.com
PORT Port des Servers 3000
HOSTNAME Adresse, an die der Server sich bindet alle Adressen