"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>
163 lines
9.0 KiB
Bash
163 lines
9.0 KiB
Bash
# Aether – alle Einstellungen. cp .env.example .env
|
||
#
|
||
# Diese Datei gilt für beides: den Betrieb mit dem fertigen Abbild
|
||
# (docker-compose.example.yml hier im Wurzelverzeichnis) und die Entwicklung
|
||
# aus dem Quelltext (build/docker-compose.yml, liest build/.env).
|
||
# Für die Entwicklung: cp .env.example build/.env
|
||
#
|
||
# Zwei Fallen beim Bearbeiten:
|
||
# $ im Wert → als $$ schreiben, sonst schneidet Compose ab
|
||
# Kommentar hinter einem LEEREN Wert → der Kommentar wird zum Wert
|
||
# Erklärungen und Fallstricke: README.md, Abschnitt „Einstellungen"
|
||
|
||
# ══ Pflicht ═══════════════════════════════════════════════════════════════════
|
||
|
||
APP_ENV=production # development | production
|
||
# Adresse, unter der der BROWSER die Cloud sieht. Ohne Schrägstrich am Ende.
|
||
# Ein falscher Wert startet klaglos und fällt erst auf, wenn ein Freigabe-Link
|
||
# oder ein OIDC-Rücksprung ins Leere zeigt.
|
||
PUBLIC_URL=https://cloud.example.com
|
||
# openssl rand -hex 32
|
||
SESSION_SECRET=
|
||
|
||
# DB_HOST ist der Dienstname aus dem Compose, nicht localhost.
|
||
DB_HOST=postgres
|
||
DB_PORT=5432
|
||
DB_NAME=aether
|
||
DB_USER=aether
|
||
# Jedes Zeichen erlaubt – nur ein $ muss $$ heißen oder der Wert in
|
||
# 'einfache Anführungszeichen'. Sonst schneidet Compose lautlos ab. (README)
|
||
DB_PASSWORD=
|
||
|
||
# Verzeichnis auf dem Wirt. Nur lesend anfassen – zum Hineinlegen: WebDAV.
|
||
DATA_PATH=/pfad/zu/aether-data
|
||
# `id -u` / `id -g` – sonst gehören die Dateien einem Container-Nutzer.
|
||
APP_UID=1000
|
||
APP_GID=1000
|
||
|
||
# ══ Erster Start ══════════════════════════════════════════════════════════════
|
||
# Legt den Admin an. Danach ADMIN_PASSWORD leeren – das Konto bleibt.
|
||
# Auch hier: ein $ muss $$ heißen (siehe DB_PASSWORD).
|
||
ADMIN_USERNAME=admin
|
||
ADMIN_PASSWORD=
|
||
|
||
# ══ Reverse Proxy ═════════════════════════════════════════════════════════════
|
||
# IPs/CIDRs der Proxys, denen X-Forwarded-For/-Proto geglaubt wird. Steht hier
|
||
# das Falsche, sieht die Anwendung überall die IP des Proxys – Rate-Limit und
|
||
# Audit-Log werden damit wertlos, ohne dass etwas nach Fehler aussieht.
|
||
TRUSTED_PROXIES=172.18.0.1
|
||
# Port auf dem Wirt. Im Container bleibt es 8080.
|
||
APP_PORT=8080
|
||
# Wer den Port erreichen darf. 127.0.0.1 = nur dieser Rechner (Vorgabe, davor
|
||
# gehört der Proxy). 0.0.0.0 = das ganze Netz – dann unverschlüsselt.
|
||
APP_BIND=127.0.0.1
|
||
APP_LISTEN_ADDR=:8080 # im Container; der Proxy leitet hierher
|
||
|
||
# ══ Sitzung ═══════════════════════════════════════════════════════════════════
|
||
# Wie lange eine Anmeldung gilt – **ab der letzten Benutzung**, nicht ab dem
|
||
# Anmelden. Wer die Cloud regelmäßig öffnet, bleibt angemeldet; wer sie so
|
||
# lange nicht anfasst, meldet sich neu an. 2592000 = 30 Tage.
|
||
#
|
||
# Kürzer ist sinnvoll, wenn mehrere Leute denselben Rechner benutzen. Alle
|
||
# Sitzungen sofort beenden: SESSION_SECRET wechseln und neu starten.
|
||
SESSION_MAX_AGE=2592000 # Sekunden
|
||
|
||
# ══ Speicher ══════════════════════════════════════════════════════════════════
|
||
STORAGE_PATH=/data # im Container
|
||
TMP_PATH=/data/tmp
|
||
# Frühere Fassungen je Datei. Greift nur bei eingeschaltetem „Keep versions".
|
||
MAX_VERSIONS_KEPT=5
|
||
|
||
# ══ Anmeldung über einen Identitätsanbieter (optional) ════════════════════════
|
||
# Leerer OIDC_ISSUER = aus. Sonst die vollständige ADRESSE des Anbieters,
|
||
# z. B. https://id.example.com – nicht seinen Namen. Falsch gesetzt bricht der
|
||
# Start ab.
|
||
OIDC_ISSUER=
|
||
OIDC_CLIENT_ID=aether
|
||
OIDC_CLIENT_SECRET=
|
||
# Muss EXAKT <PUBLIC_URL>/api/v1/auth/oidc/callback sein.
|
||
OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
|
||
# Bestehendes Konto gleichen Namens mit der Identität verbinden, statt ein
|
||
# zweites anzulegen. VOR der ersten Anmeldung setzen – danach ist es zu spät.
|
||
# Nur bei einem Anbieter, dem die Namen gehören: Bei freier Registrierung wäre
|
||
# es die Übernahme fremder Konten.
|
||
OIDC_LINK_BY_USERNAME=false
|
||
# Beschriftung des Knopfes auf der Anmeldeseite.
|
||
OIDC_BUTTON_LABEL=Sign in with SSO / OIDC
|
||
|
||
# ══ Office (optional) ═════════════════════════════════════════════════════════
|
||
# Leer = aus, auch wenn ein Office-Container läuft.
|
||
# Compose-Schnipsel für Collabora, OnlyOffice und Euro-Office: README.md
|
||
# collabora | onlyoffice (auch Euro-Office)
|
||
OFFICE_PROVIDER=
|
||
|
||
# Drei Adressen für drei Richtungen – die häufigste Fehlerquelle.
|
||
#
|
||
# Backend → Office. Port je nach Anbieter:
|
||
# Collabora http://office:9980
|
||
# OnlyOffice/Euro-Office http://office
|
||
OFFICE_URL=http://office:9980
|
||
# Browser → Office. Deine Domain oder LAN-IP, nicht der Compose-Name.
|
||
OFFICE_PUBLIC_URL=https://office.example.com
|
||
# Office → Aether.
|
||
#
|
||
# **Bei Collabora die öffentliche Adresse der Cloud**, nicht app:8080: Aus
|
||
# diesem Wert baut Collabora sein frame-ancestors, und der Browser darf den
|
||
# Rahmen sonst nicht zeigen ("Framing … violates 'frame-ancestors …'").
|
||
# Collabora holt die Datei dann über deinen Reverse Proxy.
|
||
OFFICE_WOPI_URL=https://cloud.example.com
|
||
# Gegen SSRF: was das Backend anfragen darf. Der Host aus OFFICE_URL zählt
|
||
# immer dazu.
|
||
OFFICE_ALLOWED_HOSTS=office
|
||
# Nur OnlyOffice/Euro-Office, mind. 32 Zeichen: openssl rand -hex 32
|
||
# Muss mit JWT_SECRET des Office-Containers übereinstimmen. Ohne ihn schlägt
|
||
# das Wandeln nach PDF fehl (der Server antwortet `{"error":-8}`). Für den
|
||
# WOPI-Weg wird er nicht gebraucht, der hat eigene Token.
|
||
OFFICE_JWT_SECRET=
|
||
OFFICE_INSECURE_TLS=false # nur für Tests mit selbstsigniertem Zertifikat
|
||
|
||
# ══ Volltextsuche (OCR) ═══════════════════════════════════════════════════════
|
||
# Standardmäßig an; fehlen ocrmypdf/tesseract, schaltet es sich selbst ab.
|
||
# OCR_ENABLED=false
|
||
# OCR_LANGUAGES=deu+eng # weitere brauchen ein apk-Paket im Dockerfile
|
||
# OCR_MAX_PAGES=50 # 0 = unbegrenzt; rund 1 Minute je Seite
|
||
# OCR_TIMEOUT=10m # Notbremse je Datei
|
||
|
||
# ══ App-Umschalter (optional) ═════════════════════════════════════════════════
|
||
# Andere selbst gehostete Apps im Menü der Seitenleiste.
|
||
# EXTERNAL_APPS=InkNote|https://notes.example.com|📝
|
||
|
||
# ══ HoneyOS-Leiste (optional) ═════════════════════════════════════════════════
|
||
# Ursprung, von dem die Leiste geladen wird. Wird an zwei Stellen gebraucht und
|
||
# kommt deshalb aus einer Quelle: die CSP erlaubt ihn (script-src +
|
||
# connect-src), und die Oberfläche lädt das Skript von dort nach.
|
||
# Wirkt beim **Neustart** – kein Neubau nötig.
|
||
# Leer = keine Leiste, und die CSP bleibt so eng wie ohne sie.
|
||
HONEYBAR_ORIGIN=
|
||
# Ausweis, mit dem sich die Leiste die App-Liste holt. Muss zu HONEYOS_APPS_KEY
|
||
# drüben passen. Nur nötig, wenn HoneyOS auf einer anderen Site liegt als
|
||
# Aether – dann schickt der Browser die HoneyOS-Sitzung nicht mit.
|
||
HONEYBAR_KEY=
|
||
|
||
# ══ Nur für build/docker-compose.yml ══════════════════════════════════════════
|
||
# Diese vier steuern den Office-Container aus dem Entwicklungs-Compose. Beim
|
||
# Betrieb mit eigenem Office-Container stehen sie in dessen Compose-Datei.
|
||
#
|
||
# Wer seine Dateien in Collabora öffnen darf – derselbe Host wie in
|
||
# OFFICE_WOPI_URL, aber als regulärer Ausdruck: Punkte maskieren, Port
|
||
# anhängen. Fehlt er, lehnt Collabora ab:
|
||
# "No authorized hosts found matching the target host […] in config"
|
||
OFFICE_ALIASGROUP=https://cloud\.example\.com:443
|
||
OFFICE_SSL=false
|
||
OFFICE_SSL_TERMINATION=false # true nur, wenn davor wirklich HTTPS endet
|
||
OFFICE_PORT=9980
|
||
|
||
# ══ Später ════════════════════════════════════════════════════════════════════
|
||
# MEILISEARCH_URL=http://meilisearch:7700
|
||
# MEILISEARCH_KEY=
|
||
|
||
# ══ WebDAV ════════════════════════════════════════════════════════════════════
|
||
# Läuft unter /dav/, kein Schalter nötig. Der Proxy muss
|
||
# PROPFIND/MKCOL/MOVE/COPY durchreichen. Anmeldung ausschließlich mit
|
||
# App-Passwörtern, nie mit dem Kontopasswort.
|