services: kochwas: # Image wird via Gitea Actions gebaut und in die Gitea-Container-Registry gepusht. # Tag-Override per Umgebungsvariable: KOCHWAS_TAG=sha-abcd1234 docker compose pull image: gitea.siegeln.net/claude/kochwas:${KOCHWAS_TAG:-latest} pull_policy: always volumes: - ./data:/data environment: - DATABASE_PATH=/data/kochwas.db - IMAGE_DIR=/data/images - SEARXNG_URL=http://searxng:8080 - NODE_ENV=production # Im Header als kleine Versionsnummer unter dem Logo angezeigt. - KOCHWAS_TAG=${KOCHWAS_TAG:-dev} # Gemini (Foto-Rezept-Magie). Leer = Feature deaktiviert. - GEMINI_API_KEY=${GEMINI_API_KEY:-} - GEMINI_MODEL=${GEMINI_MODEL:-gemini-2.5-flash} - GEMINI_TIMEOUT_MS=${GEMINI_TIMEOUT_MS:-20000} depends_on: - searxng restart: unless-stopped networks: - traefik_proxy - internal labels: - "traefik.enable=true" # Router for HTTPS traffic - "traefik.http.routers.kochwas.rule=Host(`kochwas.siegeln.net`)" - "traefik.http.routers.kochwas.entrypoints=websecure" - "traefik.http.routers.kochwas.tls.certresolver=cloudflareResolver" - "traefik.http.routers.kochwas.tls.domains[0].main=siegeln.net" - "traefik.http.routers.kochwas.tls.domains[0].sans=*.siegeln.net" # Specify which port Traefik should forward traffic to inside the container - "traefik.http.services.kochwas.loadbalancer.server.port=3000" # Explicitly tell Traefik which network to use (since kochwas is on two networks) - "traefik.docker.network=traefik_proxy" # Ein-Shot-Init: expandiert ${…}-Platzhalter in der Source-settings.yml und # legt das gerenderte File aufs searxng-config Named-Volume. Verwendet das # gleiche SearXNG-Image — bereits gepullt, hat Python 3 an Bord. Kein # zusätzliches Image, kein apk add gettext, kein fragiler entrypoint-Override # am Hauptcontainer. FORCE_OWNERSHIP=false, damit der Init-Container nicht # versucht den chown-Setup zu machen. searxng-init: image: searxng/searxng:latest restart: 'no' user: root entrypoint: - /bin/sh - -c - | set -e python3 -c "import os; open('/out/settings.yml','w').write(os.path.expandvars(open('/in/settings.yml').read()))" volumes: - ./searxng:/in:ro - searxng-config:/out environment: - FORCE_OWNERSHIP=false - BRAVE_API_KEY=${BRAVE_API_KEY:-} - SEARXNG_SECRET=${SEARXNG_SECRET:-dev-secret-change-in-prod} searxng: # Absichtlich nur intern erreichbar — keine Traefik-Labels, kein externer Port. image: searxng/searxng:latest volumes: - searxng-config:/etc/searxng environment: - BASE_URL=http://searxng:8080/ - INSTANCE_NAME=kochwas-search depends_on: searxng-init: condition: service_completed_successfully restart: unless-stopped networks: - internal volumes: searxng-config: networks: traefik_proxy: # Dasselbe externe Netz wie bei deinem Gitea-Compose. external: true internal: # Eigenes internes Netz für kochwas ↔ searxng, von außen nicht erreichbar. driver: bridge