docs: backlog the compose drift between repo and test server
Tessera CI/CD / Lint & Type Check (push) Successful in 44s
Tessera CI/CD / Tests (push) Successful in 49s
Tessera CI/CD / Build & Publish Images (push) Successful in 7s

/opt/tessera is not a working copy -- the compose file there is maintained by
hand, and the deploy path only pulls images. Two consequences showed up on the
same day: the renamed encryption key never reached the container although it
was in the server .env, and the "refuse to start without a key" guard does not
apply on alpha at all, because it only exists in the repository file.

The item deliberately stops short of proposing a fix to apply: it first asks
why the file is hand-maintained, since it may carry host-specific settings the
repository lacks, and moving to a checkout blindly would break the running
system.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-11 14:38:56 +02:00
parent f574884b32
commit af96865452
@@ -0,0 +1,58 @@
---
created: 2026-08-11
title: Compose-Datei auf dem Testserver ist eine handgepflegte Kopie und driftet vom Repository ab
area: infra
severity: major
trigger: bevor eine zweite Installation (Kunde oder Produktivsystem) aufgesetzt wird
files:
- docker-compose.yml
- docker-compose.prod.yml
- /opt/tessera/docker-compose.yml (auf 192.168.13.12, nicht im Repository)
---
## Problem
`/opt/tessera` auf dem Testserver (192.168.13.12) ist **keine** Git-Arbeitskopie —
dort liegt eine von Hand gepflegte `docker-compose.yml`. Der Deploy-Weg holt nur
die Images aus der Registry; Aenderungen an den Compose-Dateien im Repository
kommen dort nie an.
Am 2026-08-11 konkret aufgefallen: Der umbenannte Verschluesselungsschluessel
(`TESSERA_ENCRYPTION_KEY`, Commit f574884) wurde in die `.env` auf dem Server
eingetragen, kam aber nicht im Container an, weil die dortige Compose-Datei die
Variable gar nicht durchreicht. Die Anwendung fiel deshalb auf den alten Namen
zurueck und protokollierte die Veraltet-Warnung. Behoben durch eine
Hand-Aenderung an der Server-Datei — was das Problem genau wiederholt.
Zweiter, wichtigerer Effekt: die im selben Zug eingebaute Absicherung "Stack
startet nicht ohne Schluessel" (Commit 7bda56d) greift auf alpha **nicht**, weil
sie nur in der Repository-Datei steht. Beide Dateien laufen seit dem 2026-08-11
inhaltlich auseinander, und niemand merkt es, bis etwas nicht tut.
Fuer eine Kundeninstallation heisst das: aufgesetzt wird nach dem Repository,
alpha laeuft nach seiner eigenen Kopie. Was auf alpha funktioniert, ist damit
kein Beleg dafuer, dass die ausgelieferte Konfiguration funktioniert — und
genau dafuer ist ein Testsystem da.
## Solution
Noch offen, drei denkbare Wege — Entscheidung gehoert vor die Umsetzung:
1. **`/opt/tessera` zur Arbeitskopie machen.** `git clone`, danach zieht ein
`git pull` Compose-Datei und Deploy-Anleitung mit. Einfachster Weg, aber der
Server braucht dann Lesezugriff auf das Repository, und lokale Anpassungen
(die es geben mag) muessen vorher sichtbar gemacht werden.
2. **Compose-Datei als Artefakt ausliefern.** Die CI legt die passende Datei zu
jedem Image-Build ab, der Server holt sie zusammen mit den Images. Sauberste
Trennung, meiste Arbeit.
3. **Unterschiede bewusst machen.** Die Server-Datei bleibt handgepflegt, aber
ein Abgleich-Skript meldet Abweichungen zur Repository-Version. Loest das
Problem nicht, macht es aber sichtbar.
Vor der Entscheidung zu klaeren: **warum** die Datei dort ueberhaupt von Hand
gepflegt wird. Moeglicherweise enthaelt sie Anpassungen, die im Repository
fehlen (Ports, Netzwerke, Volumes fuer den konkreten Host) — die muessten dann
erst ins Repository, sonst bricht Weg 1 oder 2 den laufenden Betrieb.
Eine Sicherung der aktuellen Server-Datei liegt als
`/opt/tessera/docker-compose.yml.bak.20260811` daneben.