# 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. # # 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: # Nur loopback. TLS und Domain gehören auf den Reverse Proxy des Wirts. - "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 – nur mit `--profile office`, kostet rund 1 GB Arbeitsspeicher. 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: - "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