All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m17s
Der entrypoint-Override im vorherigen Commit scheiterte, weil der
erwartete Pfad /usr/local/searxng/dockerfiles/docker-entrypoint.sh im
aktuellen SearXNG-Image (granian-basiert) nicht existiert. Stattdessen
jetzt ein Ein-Shot-Init-Container mit dem gleichen SearXNG-Image:
- searxng-init: liest ./searxng/settings.yml read-only, expandiert
${VAR}-Platzhalter per Python os.path.expandvars, schreibt Ergebnis
auf ein named volume (searxng-config).
- searxng: mountet searxng-config auf /etc/searxng und startet
unverändert mit seinem Original-Entrypoint (kein Pfad-Raten).
- depends_on mit condition: service_completed_successfully → searxng
wartet auf fertigen Init.
settings.yml: secret_key nutzt ${SEARXNG_SECRET} ohne :- default
(Python-expandvars kennt das nicht). Der Default landet als ENV im
Compose.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
2.8 KiB
YAML
82 lines
2.8 KiB
YAML
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
|
|
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
|