DEPLOYMENT / 01

Deploy Vane with Docker, without the guesswork

A bundled SearXNG container, persistent storage, a meaningful health check, and a clear path from startup to a working answer.

Before starting

Install Docker Engine or Docker Desktop with Compose v2. Confirm docker info and docker compose version succeed. Have a supported hosted-model key or a reachable local model server ready. This guide follows Vane 1.12.2 source; the published latest image is mutable.

1. Save the Compose file

The standard image already includes SearXNG. A single volume persists Vane data. Bind the host port to loopback for this local trial.

services:
  vane:
    image: itzcrazykns1337/vane:latest
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - vane-data:/home/vane/data
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
      interval: 30s
      timeout: 10s
      start_period: 60s
      retries: 5
volumes:
  vane-data:

Download this exact Compose file. Keep it in its own directory; Compose project names determine volume prefixes.

2. Validate, pull and start

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 vane

If port 3000 is already in use, change only the left-hand host port to 127.0.0.1:3001:3000, then open port 3001. Container port 3000 stays unchanged.

3. Finish provider setup

Open http://localhost:3000. Select the chat provider, supply its endpoint or key, and configure embeddings. A green HTTP health check does not prove the model provider, search results or citations work. Ask a factual web question, inspect a citation and retry after a container restart.

4. Read the right failure signal

  • Container exits: inspect logs before retrying. Check memory pressure, image architecture and permissions on mounted storage.
  • Page loads, answer fails: check provider credentials, quota, base URL and exact model ID. Verify chat and embedding separately.
  • No search results: the standard image uses bundled SearXNG. For the slim image, check the external URL and JSON configuration instead.
  • Health check stays starting: allow for first startup; inspect logs. Increasing retries cannot fix an invalid provider or broken image.
curl -f http://localhost:3000/
docker compose logs --tail=200 vane
docker compose exec vane node -e "fetch('http://localhost:8080/search?q=test&format=json').then(r=>console.log(r.status)).catch(console.error)"

The final command checks bundled SearXNG HTTP status. A 200 response still needs inspection of actual result content. For a custom SearXNG service, use its configured address instead.

Storage, upgrades and rollback

docker compose down retains named volumes. docker compose down -v deletes them. Stop the application for a consistent volume backup and protect any credentials in configuration. Before upgrading, record the current image digest and copy the data volume. Read release notes, pull, recreate, then repeat a prompt and citation test. A prior image may not read a migrated database; rollback needs the matching data backup too.

Using your own SearXNG

Use itzcrazykns1337/vane:slim-latest and set SEARXNG_API_URL to the reachable service URL. Enable JSON format and the upstream-required search engines in SearXNG settings. Within Docker, localhost is the current container, not a neighboring service or your host. See configuration behavior and Ollama networking.

THE PRACTICAL QUESTIONS

Before you deploy

Do I need two containers?

Not for the standard image: SearXNG is bundled. The slim image requires a separate reachable search instance.

Does restarting delete my history?

The example uses a named volume for persistent data. Removing that volume, changing project names or mounting a different volume can make the data disappear from the new instance.

Is this ready to expose to the public internet?

This recipe is for a loopback-bound local trial. Remote access requires an appropriate authenticated deployment, TLS and reviewed access controls.

Sources & verification

Official references checked 2026-10-22. Deployment snippets are documentation-reviewed and Compose-validated; containers and model inference have not been runtime-tested here.