feat: Versionierung mit Changelog, Version 1.0.0

Bis jetzt stand nirgends, welcher Stand laeuft. Beim Aktualisieren auf
einem Server ist das die erste Frage.

CHANGELOG.md nach Keep a Changelog, Versionsnummern nach SemVer. Der
Changelog sagt, was sich beim Arbeiten aendert - nicht, welche Datei
angefasst wurde. Dazu eine Tabelle, was Major, Minor und Patch fuer den
Betreiber praktisch bedeuten, und der Hinweis, dass sich eine
Datenbank-Migration nicht zurueckrollen laesst.

Die Version steht bewusst an zwei Stellen: package.json und
src/lib/version.ts. Ein Import der package.json waere im
Standalone-Build eine andere Datei als die des Projekts - die Zahl haenge
dann an der Laufzeit. Ein Test haelt beide zusammen, und
"npm run version" setzt sie gemeinsam samt Changelog-Abschnitt.

Committet und getaggt wird nicht automatisch. Ein Changelog-Eintrag, den
niemand gegengelesen hat, ist keinen Deut besser als keiner.

Sichtbar wird die Version unten in der Seitenleiste und unter
/api/gesundheit - dort mit Git-Stand, den der Docker-Build hineinreicht.
Auf der Anmeldeseite steht sie nicht: wer nicht angemeldet ist, muss
nicht wissen, welche Fassung hier laeuft.

Etappe: 8
Phase: Haertung
This commit is contained in:
Florian Wilde
2026-08-22 10:41:33 +02:00
parent 4b953e7887
commit b2ac13e128
10 changed files with 442 additions and 8 deletions
+2
View File
@@ -7,6 +7,7 @@ import { aktiveBetreute, erfordereBenutzer, erfordereZweitenFaktor, meineBetreut
import { darf } from '@/lib/auth/rollen'
import { ROLLEN_BESCHRIFTUNG } from '@/lib/auth/rollen'
import { db, nichtGeloescht } from '@/lib/db'
import { versionstext } from '@/lib/version'
/**
* Rahmen aller Fachseiten.
@@ -64,6 +65,7 @@ export default async function AppLayout({ children }: { children: React.ReactNod
return (
<AppHuelle
navigation={navigation}
version={versionstext()}
kopfzeile={
<BetreuteAuswahl
aktiveId={aktive.id}
+13 -5
View File
@@ -1,12 +1,17 @@
import { NextResponse } from 'next/server'
import { db } from '@/lib/db'
import { COMMIT, VERSION } from '@/lib/version'
/**
* Betriebsbereitschaft fuer den Healthcheck in docker-compose.
*
* Bewusst ohne Anmeldung, aber auch ohne jede Auskunft ueber Inhalte:
* geprueft wird nur, ob die Datenbank antwortet. Version und Datenbestand
* gehen niemanden etwas an, der die Adresse errät.
* Bewusst ohne Anmeldung, aber ohne jede Auskunft ueber Inhalte: geprueft
* wird nur, ob die Datenbank antwortet.
*
* Die Version steht dabei: sie wird beim Aktualisieren gebraucht, um zu
* sehen, ob der neue Stand tatsaechlich laeuft. Das ist keine Auskunft
* ueber die betreuten Daten, und die Adresse ist ohnehin nur ueber den
* eigenen Reverse Proxy erreichbar.
*/
export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'
@@ -14,10 +19,13 @@ export const dynamic = 'force-dynamic'
export async function GET() {
try {
await db.$queryRaw`SELECT 1`
return NextResponse.json({ status: 'bereit' }, { headers: { 'Cache-Control': 'no-store' } })
return NextResponse.json(
{ status: 'bereit', version: VERSION, commit: COMMIT || undefined },
{ headers: { 'Cache-Control': 'no-store' } },
)
} catch {
return NextResponse.json(
{ status: 'datenbank nicht erreichbar' },
{ status: 'datenbank nicht erreichbar', version: VERSION },
{ status: 503, headers: { 'Cache-Control': 'no-store' } },
)
}