refactor(repo): deploy/ heißt jetzt build/ – der Name sagte das Gegenteil

"deploy" klang nach Ausrollen, drin steht das Gegenteil: das Bau-Rezept
und das Compose, das aus dem Quelltext baut. Ausgerollt wird mit
docker-compose.example.yml im Wurzelverzeichnis. Marc ist genau darüber
gestolpert.

Zwei Dinge mussten dafür vorher fest werden, sonst hätte das Umbenennen
die Entwicklungsdatenbank gekostet: Compose leitet den Projektnamen aus
dem Ordnernamen ab und hätte unter "build" ein neues, leeres Projekt mit
neuem, leerem Volume angelegt. Der Projektname steht deshalb jetzt im
Compose (name: aether), und das Volume trägt seinen alten Namen
ausdrücklich weiter (deploy_postgres_data) – unschön, aber die Daten
bleiben.

Ebenfalls angepasst: .gitignore. Dort stand deploy/.env; nach dem
Umbenennen wäre build/.env nur noch von der allgemeinen .env-Zeile
gedeckt gewesen.

Nachgeprüft nach dem Umzug: Abbild baut, Stapel startet, 113 Dateien in
der Datenbank wie vorher, Volume unverändert deploy_postgres_data,
GET / → 200.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-02 09:24:09 +02:00
1 parent a7a67da040
commit 471679ff64
7 files changed
+30 -20

No files matched your search

+3 -3
View File
@@ -2,8 +2,8 @@
# #
# Diese Datei gilt für beides: den Betrieb mit dem fertigen Abbild # Diese Datei gilt für beides: den Betrieb mit dem fertigen Abbild
# (docker-compose.example.yml hier im Wurzelverzeichnis) und die Entwicklung # (docker-compose.example.yml hier im Wurzelverzeichnis) und die Entwicklung
# aus dem Quelltext (deploy/docker-compose.yml, liest deploy/.env). # aus dem Quelltext (build/docker-compose.yml, liest build/.env).
# Für die Entwicklung: cp .env.example deploy/.env # Für die Entwicklung: cp .env.example build/.env
# #
# Zwei Fallen beim Bearbeiten: # Zwei Fallen beim Bearbeiten:
# $ im Wert → als $$ schreiben, sonst schneidet Compose ab # $ im Wert → als $$ schreiben, sonst schneidet Compose ab
@@ -139,7 +139,7 @@ HONEYBAR_ORIGIN=
# Aether – dann schickt der Browser die HoneyOS-Sitzung nicht mit. # Aether – dann schickt der Browser die HoneyOS-Sitzung nicht mit.
HONEYBAR_KEY= HONEYBAR_KEY=
# ══ Nur für deploy/docker-compose.yml ═════════════════════════════════════════ # ══ Nur für build/docker-compose.yml ══════════════════════════════════════════
# Diese vier steuern den Office-Container aus dem Entwicklungs-Compose. Beim # Diese vier steuern den Office-Container aus dem Entwicklungs-Compose. Beim
# Betrieb mit eigenem Office-Container stehen sie in dessen Compose-Datei. # Betrieb mit eigenem Office-Container stehen sie in dessen Compose-Datei.
# #
+1 -1
View File
@@ -1,5 +1,5 @@
# Secrets # Secrets
deploy/.env build/.env
.env .env
# Aus den Beispielen kopiert – gehört in die Umgebung, nicht ins Repo. # Aus den Beispielen kopiert – gehört in die Umgebung, nicht ins Repo.
+2 -2
View File
@@ -36,7 +36,7 @@ aether/
│ ├── pages/ │ ├── pages/
│ ├── api/ # Typed API-Client │ ├── api/ # Typed API-Client
│ └── hooks/ │ └── hooks/
├── deploy/ # Docker Compose, Dockerfile, .env.example ├── build/ # Dockerfile + Compose zum Bauen aus dem Quelltext
└── CLAUDE.md └── CLAUDE.md
``` ```
@@ -156,7 +156,7 @@ Kein Commit ohne grüne Tests.
## Docker & Secrets ## Docker & Secrets
- **Backend immer via Docker starten/laufen lassen (`docker compose ...` in `deploy/`), nie `go run`.** Der Host hat kein Go-Toolchain installiert; Builds/Compile-Checks laufen über das `golang:1.25-alpine`-Image. Migrations + DB-Verbindung sind auf die Compose-Umgebung ausgelegt. - **Backend immer via Docker starten/laufen lassen (`docker compose -f build/docker-compose.yml ...`), nie `go run`.** Der Host hat kein Go-Toolchain installiert; Builds/Compile-Checks laufen über das `golang:1.25-alpine`-Image. Migrations + DB-Verbindung sind auf die Compose-Umgebung ausgelegt.
- Secrets **nur** über `.env` / Compose-Env – nie im Image oder Repo - Secrets **nur** über `.env` / Compose-Env – nie im Image oder Repo
- Multi-Stage-Build: Builder-Stage (Go-Compiler) → Alpine final - Multi-Stage-Build: Builder-Stage (Go-Compiler) → Alpine final
- `.env` ist in `.gitignore`; `.env.example` zeigt alle Keys ohne Werte - `.env` ist in `.gitignore`; `.env.example` zeigt alle Keys ohne Werte
+8 -8
View File
@@ -42,11 +42,11 @@ Zwei Wege, je nachdem was du vorhast:
| | | | | |
|---|---| |---|---|
| **Betreiben** | `docker-compose.example.yml` im Wurzelverzeichnis. Zieht das fertige Abbild, braucht keinen Quelltext. | | **Betreiben** | `docker-compose.example.yml` im Wurzelverzeichnis. Zieht das fertige Abbild, braucht keinen Quelltext. |
| **Entwickeln** | `deploy/docker-compose.yml`. Baut aus dem Quelltext. | | **Entwickeln** | `build/docker-compose.yml`. Baut aus dem Quelltext. |
Die **`.env.example` im Wurzelverzeichnis gilt für beide** – eine Datei, alle Die **`.env.example` im Wurzelverzeichnis gilt für beide** – eine Datei, alle
Einstellungen. Sie lag bis zum 02.09.2026 doppelt vor (einmal schlank hier, Einstellungen. Sie lag bis zum 02.09.2026 doppelt vor (einmal schlank hier,
einmal vollständig unter `deploy/`), und die beiden liefen auseinander: Der einmal vollständig im Bau-Ordner), und die beiden liefen auseinander: Der
produktiven fehlten am Ende zwölf Schlüssel, darunter `SESSION_MAX_AGE`, und produktiven fehlten am Ende zwölf Schlüssel, darunter `SESSION_MAX_AGE`, und
sie empfahl für `OFFICE_WOPI_URL` einen Wert, der mit Collabora nicht sie empfahl für `OFFICE_WOPI_URL` einen Wert, der mit Collabora nicht
funktioniert. funktioniert.
@@ -73,7 +73,7 @@ cd aether
```bash ```bash
cp .env.example .env # beim Betreiben cp .env.example .env # beim Betreiben
cp .env.example deploy/.env # beim Entwickeln (dorthin schaut das Compose) cp .env.example build/.env # beim Entwickeln (dorthin schaut das Compose)
``` ```
Ausfüllen musst du mindestens: Ausfüllen musst du mindestens:
@@ -110,8 +110,8 @@ Beim ersten Start:
Aus dem Quelltext bauen statt ziehen: Aus dem Quelltext bauen statt ziehen:
```bash ```bash
docker compose -f deploy/docker-compose.yml build app docker compose -f build/docker-compose.yml build app
docker compose -f deploy/docker-compose.yml up -d docker compose -f build/docker-compose.yml up -d
``` ```
Aktualisieren: Aktualisieren:
@@ -313,9 +313,9 @@ nur `GET`/`POST`, und dann scheitert das Einbinden mit einem `405`.
## Abbild bauen und veröffentlichen ## Abbild bauen und veröffentlichen
```bash ```bash
# im Wurzelverzeichnis des Projekts, nicht in deploy/ # im Wurzelverzeichnis des Projekts, nicht in build/
IMG=gitea.honeyy.duckdns.org/docker/aether IMG=gitea.honeyy.duckdns.org/docker/aether
docker build -f deploy/Dockerfile -t $IMG:$(date +%Y.%m.%d) -t $IMG:latest . docker build -f build/Dockerfile -t $IMG:$(date +%Y.%m.%d) -t $IMG:latest .
docker push $IMG:$(date +%Y.%m.%d) docker push $IMG:$(date +%Y.%m.%d)
docker push $IMG:latest docker push $IMG:latest
``` ```
@@ -395,7 +395,7 @@ aether/
│ ├── components/ │ ├── components/
│ ├── hooks/ │ ├── hooks/
│ └── pages/ │ └── pages/
├── deploy/ ├── build/
│ ├── docker-compose.yml # app + postgres (kein Proxy-Container) │ ├── docker-compose.yml # app + postgres (kein Proxy-Container)
│ ├── Dockerfile │ ├── Dockerfile
│ └── .env.example │ └── .env.example
File renamed without changes.
@@ -1,16 +1,22 @@
# Aether – Entwicklung: aus dem Quelltext bauen. # Aether – Entwicklung: aus dem Quelltext bauen.
# #
# docker compose -f deploy/docker-compose.yml build app # docker compose -f build/docker-compose.yml build app
# docker compose -f deploy/docker-compose.yml up -d # docker compose -f build/docker-compose.yml up -d
# #
# Zum **Betreiben** ist docker-compose.example.yml im Wurzelverzeichnis # Zum **Betreiben** ist docker-compose.example.yml im Wurzelverzeichnis
# gedacht: schlanker und ohne Quelltext, es zieht das fertige Abbild. # gedacht: schlanker und ohne Quelltext, es zieht das fertige Abbild.
# #
# Die Einstellungen kommen aus deploy/.env – als Vorlage dient die eine # Die Einstellungen kommen aus build/.env – als Vorlage dient die eine
# .env.example im Wurzelverzeichnis: cp .env.example deploy/.env # .env.example im Wurzelverzeichnis: cp .env.example build/.env
# #
# Erklärungen zu allem hier: README.md # Erklärungen zu allem hier: README.md
# Der Projektname steht hier fest und wird **nicht** aus dem Ordnernamen
# abgeleitet. Sonst hinge er daran, wie der Ordner gerade heißt: Beim
# Umbenennen von deploy/ nach build/ hätte Compose ein neues, leeres Projekt
# angelegt – mit einer neuen, leeren Datenbank.
name: aether
services: services:
app: app:
container_name: aether-app container_name: aether-app
@@ -18,7 +24,7 @@ services:
# Kontext ist das Wurzelverzeichnis – das Abbild braucht backend/ und # Kontext ist das Wurzelverzeichnis – das Abbild braucht backend/ und
# frontend/, nicht nur diesen Ordner. # frontend/, nicht nur diesen Ordner.
context: .. context: ..
dockerfile: deploy/Dockerfile dockerfile: build/Dockerfile
image: gitea.honeyy.duckdns.org/docker/aether:latest image: gitea.honeyy.duckdns.org/docker/aether:latest
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
@@ -88,6 +94,10 @@ services:
volumes: volumes:
postgres_data: postgres_data:
# Fester Name, aus demselben Grund. Er stammt noch aus der Zeit, als der
# Ordner „deploy" hieß – umbenennen hieße hier: neues Volume, leere
# Datenbank. Der unschöne Name ist der Preis dafür, die Daten zu behalten.
name: deploy_postgres_data
# "data" ist bewusst weg – die Dateien liegen unter DATA_PATH auf dem Wirt. # "data" ist bewusst weg – die Dateien liegen unter DATA_PATH auf dem Wirt.
# Die Datenbank bleibt ein benanntes Volume: An ihre Dateien geht man nicht # Die Datenbank bleibt ein benanntes Volume: An ihre Dateien geht man nicht
# von Hand, und Postgres mag fremde Besitzer nicht. # von Hand, und Postgres mag fremde Besitzer nicht.
+1 -1
View File
@@ -16,7 +16,7 @@
# `docker compose stop office`. # `docker compose stop office`.
# #
# Hintergrund und Fallstricke: README.md # Hintergrund und Fallstricke: README.md
# Aus dem Quelltext bauen statt ziehen: deploy/docker-compose.yml # Aus dem Quelltext bauen statt ziehen: build/docker-compose.yml
services: services:
app: app: