Files
kochwas/docker-compose.prod.yml

91 lines
3.3 KiB
YAML
Raw Normal View History

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}
# adapter-node-Default ist 512 KB; Rezept-Fotos koennen bis 8 MB sein.
# Multipart-Overhead einrechnen -> 10 MB gibt etwas Puffer.
- BODY_SIZE_LIMIT=10000000
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"
2026-04-18 13:06:14 +02:00
- "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