Vier Schlüssel darin steuerten den mitgelieferten Collabora-Container statt Aether: OFFICE_ALIASGROUP, OFFICE_SSL, OFFICE_SSL_TERMINATION, OFFICE_PORT. Wer Office selbst betreibt, richtet das in dessen eigener Compose-Datei ein – in einer Vorlage für den Betrieb der Anwendung haben sie nichts zu suchen. Sie stehen jetzt kommentiert in build/docker-compose.yml, wo sie wirken; die Erklärung zu aliasgroup1 (regulärer Ausdruck, Punkte maskieren, Port anhängen) ist dorthin mitgewandert. Die Rückfallwerte im Compose gab es schon, ein frischer Aufbau ohne diese vier läuft also weiter. Meilisearch ist als "noch nicht gebaut" gekennzeichnet, statt einen Schalter vorzutäuschen: Kein Go-Code liest die beiden Werte, gesucht wird mit der Volltextsuche von Postgres. Der Rest bleibt ausführlich – die Vorlage ist auch die Übersicht, was möglich ist. Gegengeprüft: Beide Compose-Dateien lösen mit der gekürzten Vorlage als einziger .env sauber auf; Collabora bekommt aus den Rückfällen aliasgroup1=http://app:8080 und ssl.enable=false. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
118 lines
4.6 KiB
YAML
118 lines
4.6 KiB
YAML
# Aether – Entwicklung: aus dem Quelltext bauen.
|
||
#
|
||
# docker compose -f build/docker-compose.yml build app
|
||
# docker compose -f build/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 build/.env – als Vorlage dient die eine
|
||
# .env.example im Wurzelverzeichnis: cp .env.example build/.env
|
||
#
|
||
# 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:
|
||
app:
|
||
container_name: aether-app
|
||
build:
|
||
# Kontext ist das Wurzelverzeichnis – das Abbild braucht backend/ und
|
||
# frontend/, nicht nur diesen Ordner.
|
||
context: ..
|
||
dockerfile: build/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:
|
||
# Wer seine Dateien in Collabora öffnen darf. Derselbe Host wie in
|
||
# OFFICE_WOPI_URL, aber als regulärer Ausdruck: Punkte maskieren, Port
|
||
# anhängen – etwa OFFICE_ALIASGROUP=https://cloud\.example\.com:443.
|
||
# Fehlt er, lehnt Collabora ab: "No authorized hosts found matching the
|
||
# target host […] in config".
|
||
#
|
||
# Diese vier Werte (aliasgroup, ssl, ssl.termination, Port) stehen
|
||
# bewusst NICHT in .env.example: Die beschreibt, was die Anwendung liest.
|
||
# Hier konfigurierst du einen fremden Container – wer Office selbst
|
||
# betreibt, tut das in dessen eigener Compose-Datei.
|
||
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:
|
||
# 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.
|
||
# Die Datenbank bleibt ein benanntes Volume: An ihre Dateien geht man nicht
|
||
# von Hand, und Postgres mag fremde Besitzer nicht.
|
||
|
||
networks:
|
||
internal:
|
||
driver: bridge
|