diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8f35301..5039e03 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -30,38 +30,48 @@ services: # Explicitly tell Traefik which network to use (since kochwas is on two networks) - "traefik.docker.network=traefik_proxy" - searxng: - # Absichtlich nur intern erreichbar — keine Traefik-Labels, kein externer Port. + # 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 - # settings.yml wird read-only gemountet und beim Start in eine beschreib- - # bare /etc/searxng-Kopie expandiert (${…}-Platzhalter → ENV-Werte), - # damit der Brave-API-Key aus .env eingesetzt werden kann, ohne ihn im - # Repo zu pflegen. SearXNG selbst hat kein !env-Tag, daher machen wir - # es per Python im Entrypoint-Hook. Das SearXNG-Image hat Python bereits - # installiert; envsubst fehlt im Alpine-Base. - volumes: - - ./searxng:/config-src:ro - environment: - - BASE_URL=http://searxng:8080/ - - INSTANCE_NAME=kochwas-search - # Brave Search API-Key aus .env (auf dem Pi gepflegt, nicht im Repo). - # Leer oder fehlend → brave-Engine antwortet mit 401, andere Engines - # laufen normal weiter. - - BRAVE_API_KEY=${BRAVE_API_KEY:-} - - SEARXNG_SECRET=${SEARXNG_SECRET:-dev-secret-change-in-prod} + restart: 'no' + user: root entrypoint: - /bin/sh - -c - | set -e - mkdir -p /etc/searxng - python3 -c "import os,sys; sys.stdout.write(os.path.expandvars(open('/config-src/settings.yml').read()))" > /etc/searxng/settings.yml - exec /usr/local/searxng/dockerfiles/docker-entrypoint.sh "$@" - - -- + 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. diff --git a/searxng/settings.yml b/searxng/settings.yml index 00a81bd..42479c4 100644 --- a/searxng/settings.yml +++ b/searxng/settings.yml @@ -1,8 +1,9 @@ use_default_settings: true server: - # In production override via env (see docker-compose.prod.yml). - secret_key: ${SEARXNG_SECRET:-dev-secret-change-in-prod} + # Platzhalter wird beim Container-Start per os.path.expandvars aus der + # SEARXNG_SECRET-Env-Variable gesetzt (Default im docker-compose.prod.yml). + secret_key: "${SEARXNG_SECRET}" # Disables rate limiter + bot detection. This is a private internal service # called only by kochwas — no public exposure, no abuse risk. limiter: false