services: redis: container_name: redis image: docker.io/valkey/valkey:8-alpine command: valkey-server --save 30 1 --loglevel warning restart: unless-stopped networks: - searxng volumes: - valkey-data2:/data logging: driver: "json-file" options: max-size: "1m" max-file: "1" searxng: container_name: searxng image: docker.io/searxng/searxng:latest restart: unless-stopped networks: - searxng ports: - "0.0.0.0:8999:8080" volumes: - ./config.yaml:/etc/searxng/settings.yml:ro - searxng-data:/var/cache/searxng:rw environment: - SEARXNG_BASE_URL=http://localhost:8999/ - BIND_ADDRESS=[::]:8080 logging: driver: "json-file" options: max-size: "1m" max-file: "1" # Single container that serves the HTTP API *and* hosts the `hermes` CLI # (inherited from nousresearch/hermes-agent). Per /research request, the # adapter spawns `hermes acp` as a subprocess and speaks ACP JSON-RPC over # stdio — no docker-in-docker, no socket-proxy. tavily-adapter: image: ghcr.io/vakovalskii/searcharvester:latest build: ./simple_tavily_adapter container_name: tavily-adapter restart: unless-stopped networks: - searxng ports: - "8000:8000" volumes: - ./config.yaml:/srv/searxng-docker/config.yaml:ro # Per-job workspaces (plan.md, notes.md, report.md, hermes.log, # events.jsonl). Exposed on the host for inspection / post-mortem. - ./jobs:/srv/searxng-docker/jobs:rw # HERMES_HOME — config.yaml, SOUL.md, skills. Bundled skills get # synced on boot; our 3 custom skills ship alongside in skills/. - ./hermes-data:/opt/data:rw environment: - JOBS_DIR=/srv/searxng-docker/jobs - HERMES_HOME=/opt/data - ADAPTER_URL_FOR_HERMES=http://localhost:8000 - RESEARCH_TIMEOUT_SEC=1200 # Match the UID of the repo owner so mounted files stay owned by # the right user. macOS: 501:20 is typical; override in .env if needed. - HERMES_UID=${HERMES_UID:-501} - HERMES_GID=${HERMES_GID:-20} # LLM credentials — pass-through from the invoking shell / .env. - OPENAI_API_KEY=${OPENAI_API_KEY:-} - OPENAI_BASE_URL=${OPENAI_BASE_URL:-} - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - GEMINI_API_KEY=${GEMINI_API_KEY:-} depends_on: - searxng healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 logging: driver: "json-file" options: max-size: "1m" max-file: "1" # React + Tailwind + Vite UI over the /research API. frontend: build: context: ./frontend args: VITE_API_URL: ${VITE_API_URL:-http://localhost:8000} container_name: searcharvester-frontend restart: unless-stopped ports: - "9762:9762" depends_on: - tavily-adapter logging: driver: "json-file" options: max-size: "1m" max-file: "1" networks: searxng: volumes: valkey-data2: searxng-data: