.env.example hebelt mit einem Beispielwert den Standard der docker-compose.yml aus #45

Closed
opened 2026-09-01 13:43:19 +00:00 by florian.wilde · 1 comment
Owner

Problem

.env.example enthält:

S3_ENDPOINT=https://fsn1.your-objectstorage.com

Das ist die Adresse eines externen Anbieters, gedacht als Beispiel. Wer die Datei nach .env kopiert und die Zeile übersieht, schickt seine Dokumente an einen fremden Host.

Verschärfend: Die docker-compose.yml hat einen sinnvollen Standard —

S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000}

— der aber nur bei leerer Variable greift. Weil .env.example sie vorbelegt, greift er nie. Der Mechanismus, der genau diesen Fehler verhindern sollte, ist damit wirkungslos.

Am 31.08.2026 ist das auf dem Livesystem passiert: Die Anwendung sprach monatelang mit Hetzner statt mit dem lokalen MinIO, jede Ablage scheiterte mit NoSuchBucket, und die Zugangs-ID des lokalen Speichers ging bei jedem Versuch an einen fremden Host.

Umsetzung

Die Zeile auskommentieren und erklären, wann man sie braucht:

# Nur setzen, wenn ein EXTERNER Objektspeicher benutzt wird. Bleibt die
# Zeile weg, nimmt die docker-compose.yml das mitgelieferte MinIO.
# Beispiel Hetzner Falkenstein:
# S3_ENDPOINT=https://fsn1.your-objectstorage.com

Bei der Gelegenheit die übrigen Werte in .env.example durchsehen: Überall dort, wo die docker-compose.yml einen brauchbaren Standard hat, gehört in die Beispieldatei kein Wert, sondern ein Kommentar.

Akzeptanzkriterien

  • Eine frisch aus .env.example erzeugte .env führt mit dem mitgelieferten Stack zu einer funktionierenden Installation, ohne dass jemand S3_ENDPOINT anfassen muss.
  • Kein Wert in .env.example zeigt auf einen fremden Host.
  • Der Kommentar sagt, wann die Zeile gebraucht wird.
## Problem `.env.example` enthält: ```bash S3_ENDPOINT=https://fsn1.your-objectstorage.com ``` Das ist die Adresse eines externen Anbieters, gedacht als Beispiel. Wer die Datei nach `.env` kopiert und die Zeile übersieht, schickt seine Dokumente an einen fremden Host. Verschärfend: Die `docker-compose.yml` hat einen sinnvollen Standard — ```yaml S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} ``` — der aber **nur bei leerer Variable** greift. Weil `.env.example` sie vorbelegt, greift er nie. Der Mechanismus, der genau diesen Fehler verhindern sollte, ist damit wirkungslos. Am 31.08.2026 ist das auf dem Livesystem passiert: Die Anwendung sprach monatelang mit Hetzner statt mit dem lokalen MinIO, jede Ablage scheiterte mit `NoSuchBucket`, und die Zugangs-ID des lokalen Speichers ging bei jedem Versuch an einen fremden Host. ## Umsetzung Die Zeile auskommentieren und erklären, wann man sie braucht: ```bash # Nur setzen, wenn ein EXTERNER Objektspeicher benutzt wird. Bleibt die # Zeile weg, nimmt die docker-compose.yml das mitgelieferte MinIO. # Beispiel Hetzner Falkenstein: # S3_ENDPOINT=https://fsn1.your-objectstorage.com ``` Bei der Gelegenheit die übrigen Werte in `.env.example` durchsehen: Überall dort, wo die `docker-compose.yml` einen brauchbaren Standard hat, gehört in die Beispieldatei **kein** Wert, sondern ein Kommentar. ## Akzeptanzkriterien - Eine frisch aus `.env.example` erzeugte `.env` führt mit dem mitgelieferten Stack zu einer funktionierenden Installation, ohne dass jemand `S3_ENDPOINT` anfassen muss. - Kein Wert in `.env.example` zeigt auf einen fremden Host. - Der Kommentar sagt, wann die Zeile gebraucht wird.
florian.wilde added the in-arbeit label 2026-09-01 14:13:44 +00:00
florian.wilde started working 2026-09-01 14:13:56 +00:00
florian.wilde worked for 2 minutes 2026-09-01 14:16:23 +00:00
Author
Owner

🚀 Umgesetzt und nach main übernommen.

Vorgehen

  1. S3_ENDPOINT auskommentiert, mit Erklärung, wann man die Zeile braucht — Auskommentieren allein hätte jemanden mit externem Speicher ratlos zurückgelassen.
  2. Alle übrigen aktiven Werte der Beispieldatei durchgesehen.
  3. Test gebaut, der die Regel prüft statt der Ausnahme.
  4. Hinweis in INSTALLATION.md, Schritt 3.

Dabei aufgefallen: SEED_ADMIN_EMAIL stand mit deiner persönlichen Adresse in der mitgelieferten Beispieldatei. Das ist keine Sicherheitslücke, aber es gehört nicht in eine Datei, die andere kopieren. Jetzt leer.

Warum der Test die Regel prüft. Ein Test, der nur S3_ENDPOINT abfragt, hätte die nächste solche Zeile nicht gefunden. Er sucht deshalb nach jedem aktiven Wert, der auf einen Rechner außerhalb der mitgelieferten Zusammenstellung zeigt — localhost, 127.0.0.1, minio und db sind erlaubt, alles andere schlägt an.

Geprüft: 741 Unit-Tests · tsc sauber · Lint sauber · zwei Mutationen, beide werden rot.

Für dein System ändert sich nichts — deine .env steht schon auf http://minio:9000. Die Korrektur betrifft künftige Installationen.

Pull Request: #51 (gemergt)

🚀 **Umgesetzt und nach `main` übernommen.** <!-- claude-status pr: 51 --> **Vorgehen** 1. `S3_ENDPOINT` auskommentiert, mit Erklärung, wann man die Zeile braucht — Auskommentieren allein hätte jemanden mit externem Speicher ratlos zurückgelassen. 2. Alle übrigen aktiven Werte der Beispieldatei durchgesehen. 3. Test gebaut, der die **Regel** prüft statt der Ausnahme. 4. Hinweis in `INSTALLATION.md`, Schritt 3. **Dabei aufgefallen:** `SEED_ADMIN_EMAIL` stand mit deiner persönlichen Adresse in der mitgelieferten Beispieldatei. Das ist keine Sicherheitslücke, aber es gehört nicht in eine Datei, die andere kopieren. Jetzt leer. **Warum der Test die Regel prüft.** Ein Test, der nur `S3_ENDPOINT` abfragt, hätte die nächste solche Zeile nicht gefunden. Er sucht deshalb nach jedem aktiven Wert, der auf einen Rechner außerhalb der mitgelieferten Zusammenstellung zeigt — `localhost`, `127.0.0.1`, `minio` und `db` sind erlaubt, alles andere schlägt an. **Geprüft:** 741 Unit-Tests · `tsc` sauber · Lint sauber · zwei Mutationen, beide werden rot. **Für dein System ändert sich nichts** — deine `.env` steht schon auf `http://minio:9000`. Die Korrektur betrifft künftige Installationen. **Pull Request:** #51 (gemergt)
florian.wilde removed the in-arbeit label 2026-09-01 14:17:06 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Total Time Spent: 2 minutes
florian.wilde
2 minutes
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/betreuungs-cockpit#45