Es gab sie doppelt: schlank im Wurzelverzeichnis (für den Betrieb) und vollständig unter deploy/ (für die Entwicklung). Gedacht war das als Arbeitsteilung, geworden ist es Drift. Der produktiven fehlten zwölf Schlüssel – darunter SESSION_MAX_AGE, STORAGE_PATH und die HoneyOS-Leiste –, und sie empfahl für OFFICE_WOPI_URL weiterhin app:8080, also genau den Wert, an dem Collabora den Rahmen verweigert. Jetzt eine Datei im Wurzelverzeichnis für beides, nach Abschnitten geordnet, mit einem eigenen Abschnitt für die vier Werte, die nur den Entwicklungs-Compose betreffen. deploy/.env.example ist weg, die Verweise in README, TESTING und deploy/docker-compose.yml zeigen auf die verbliebene Datei. Gegengeprüft: Jeder Schlüssel, den config.go liest, kommt darin vor (40 Stück, kein Rest). Ein Container mit dieser Datei als env_file liefert die erwarteten Werte, auch den maskierten OFFICE_ALIASGROUP. Dabei selbst in die dokumentierte Falle getappt und wieder heraus: "OFFICE_PROVIDER= # collabora | onlyoffice" macht den Kommentar zum Wert. Der Test aus TESTING.md hat es gefunden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
98 lines
3.5 KiB
YAML
98 lines
3.5 KiB
YAML
# Aether – Entwicklung: aus dem Quelltext bauen.
|
||
#
|
||
# docker compose -f deploy/docker-compose.yml build app
|
||
# docker compose -f deploy/docker-compose.yml up -d
|
||
#
|
||
# Zum **Betreiben** ist docker-compose.example.yml im Wurzelverzeichnis
|
||
# gedacht: schlanker und ohne Quelltext, es zieht das fertige Abbild.
|
||
#
|
||
# Die Einstellungen kommen aus deploy/.env – als Vorlage dient die eine
|
||
# .env.example im Wurzelverzeichnis: cp .env.example deploy/.env
|
||
#
|
||
# Erklärungen zu allem hier: README.md
|
||
|
||
services:
|
||
app:
|
||
container_name: aether-app
|
||
build:
|
||
# Kontext ist das Wurzelverzeichnis – das Abbild braucht backend/ und
|
||
# frontend/, nicht nur diesen Ordner.
|
||
context: ..
|
||
dockerfile: deploy/Dockerfile
|
||
image: gitea.honeyy.duckdns.org/docker/aether:latest
|
||
restart: unless-stopped
|
||
env_file: .env
|
||
user: "${APP_UID:-1000}:${APP_GID:-1000}"
|
||
environment:
|
||
# ocrmypdf legt Arbeitsdateien unter $HOME ab – das aus dem Image ist
|
||
# für einen abweichenden Nutzer nicht beschreibbar.
|
||
HOME: /tmp
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
volumes:
|
||
# Bind-Mount, kein benanntes Volume: echte Ordner auf dem Wirt, per SFTP
|
||
# erreichbar. Nur lesend anfassen – zum Hineinlegen ist WebDAV der Weg,
|
||
# sonst kennt die Datenbank die Datei nicht.
|
||
- ${DATA_PATH:-./data}:/data
|
||
networks: [internal]
|
||
ports:
|
||
# Standardmäßig nur loopback – davor gehört dein Reverse Proxy mit TLS.
|
||
# Zum Ausprobieren im LAN: APP_BIND=0.0.0.0 in der .env. Dann liegt die
|
||
# Anmeldung allerdings unverschlüsselt im Netz.
|
||
- "${APP_BIND:-127.0.0.1}:${APP_PORT:-8080}:8080"
|
||
|
||
postgres:
|
||
container_name: aether-db
|
||
image: postgres:16-alpine
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_DB: ${DB_NAME}
|
||
POSTGRES_USER: ${DB_USER}
|
||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||
volumes:
|
||
- postgres_data:/var/lib/postgresql/data
|
||
networks: [internal]
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
|
||
interval: 5s
|
||
timeout: 5s
|
||
retries: 10
|
||
|
||
# Office – kostet rund 1 GB, deshalb hier im Profil (Entwicklerdatei, immer
|
||
# von der Kommandozeile): ... --profile office up -d
|
||
# Die Schnipsel im README haben bewusst kein Profil: Oberflächen wie
|
||
# Portainer oder Dockge kennen `--profile` nicht, dort entstünde der
|
||
# Container nie – ohne Fehlermeldung.
|
||
collabora:
|
||
container_name: aether-collabora
|
||
image: collabora/code:latest
|
||
profiles: ["office"]
|
||
restart: unless-stopped
|
||
environment:
|
||
aliasgroup1: ${OFFICE_ALIASGROUP:-http://app:8080}
|
||
# ssl.termination=true nur, wenn davor wirklich HTTPS endet – sonst
|
||
# verlangt Collabora eine wss://-Verbindung, die es nicht gibt, und der
|
||
# Editor bleibt leer. mount_jail_tree=false spart CAP_SYS_ADMIN.
|
||
extra_params: >-
|
||
--o:ssl.enable=${OFFICE_SSL:-false}
|
||
--o:ssl.termination=${OFFICE_SSL_TERMINATION:-false}
|
||
--o:mount_jail_tree=false
|
||
dictionaries: de_DE en_US
|
||
cap_add: [MKNOD]
|
||
extra_hosts:
|
||
- "host.docker.internal:host-gateway"
|
||
networks: [internal]
|
||
ports:
|
||
- "${APP_BIND:-127.0.0.1}:${OFFICE_PORT:-9980}:9980"
|
||
|
||
volumes:
|
||
postgres_data:
|
||
# "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
|
||
# von Hand, und Postgres mag fremde Besitzer nicht.
|
||
|
||
networks:
|
||
internal:
|
||
driver: bridge
|