Skip to content

Install Searchgirl

Searchgirl is two containers: the app (ghcr.io/diegoparras/searchgirl) and its internal SearXNG (the official image, unmodified and never exposed — only Searchgirl reaches it over the private network).

  • Docker (Docker Desktop on Windows/Mac, or Docker Engine on a VPS).
  • Nothing else: no database, no external services. Searchgirl keeps no state to migrate.
Terminal window
git clone https://github.com/diegoparras/searchgirl
cd searchgirl
docker compose up -d --build

Open http://localhost:8089 — private search, running.

For an installation of your own with a sign-in screen, define in a .env next to the compose:

Terminal window
SEARCHGIRL_USER=diego
SEARCHGIRL_PASS=a-long-password
SECRET_KEY=a-cookie-secret # optional; without it sessions reset with the container

The standard Escriba-family login appears (a card with a show/hide toggle on the password) and everything — UI, API, MCP, thumbnails — is gated until you sign in. It is a single user, with no database. In federated mode these variables are ignored: the suite’s contract forbids a local login living next to the SSO.

The published image plus the official SearXNG, as two services in one project. The end-to-end guide (mounts, domain, HTTPS, troubleshooting) is in DEPLOY.md.

  1. Create a project named searchgirl. Inside a project, services see each other by internal DNS as <project>_<service> (e.g. searchgirl_searxng).
  2. Service searxng — App → Docker Image ghcr.io/searxng/searxng:latest. Set SEARXNG_SECRET (openssl rand -hex 32) and add a File Mount at /etc/searxng/settings.yml with formats: [html, json] and limiter: false (the exact contents are in DEPLOY.md). No domain — it stays internal.
  3. Service app — App → Docker Image ghcr.io/diegoparras/searchgirl:latest. Environment: SEARXNG_URL=http://searchgirl_searxng:8080, your SEARCHGIRL_USER/SEARCHGIRL_PASS/SECRET_KEY, COOKIE_SECURE=1 and SEARCHGIRL_TRUSTED_PROXIES=172.16.0.0/12. Add your domain with HTTPS on, internal port 8080.
  4. Verify: curl https://your-domain/healthzok, then sign in from the browser.
  5. Update: hit Deploy on the app service — it pulls latest. Zero state to migrate.

Dokploy / Coolify / Portainer: all three accept Docker Compose — paste the repo’s docker-compose.yml as is (it already mounts searxng/ and does not expose the engine), set the same environment variables and put the panel’s reverse proxy in front of port 8089 with HTTPS (COOKIE_SECURE=1).

With a model configured, the AI Answer button, the POST /api/answer endpoint and the answer MCP tool light up. Pick one provider:

Terminal window
# Anthropic (native):
ANTHROPIC_API_KEY=sk-ant-... # optional: ANTHROPIC_MODEL
# ...or any OpenAI-compatible endpoint — local Ollama, OpenRouter, DeepSeek:
LLM_BASE_URL=http://host.docker.internal:11434/v1
LLM_MODEL=qwen2.5:7b

Without either, everything else works the same — the button just does not appear.

VariableDefaultWhat it controls
SEARXNG_URLhttp://searxng:8080URL of the internal SearXNG.
SEARCHGIRL_DEFAULT_LANGUAGEesDefault search language.
SEARCHGIRL_USER / SEARCHGIRL_PASSStandalone local login: one user, standard Escriba screen.
SECRET_KEYrandomHMAC key for the session cookie; set it so sessions survive restarts.
COOKIE_SECURE01 behind HTTPS.
SEARCHGIRL_MCP_TOKENBearer tokens for API+MCP. Several, named: claude:abc...,n8n:def... — revoking one does not rotate the rest.
SEARCHGIRL_TRUSTED_PROXIESReverse-proxy IPs/CIDRs so the rate limit sees the real client IP via X-Forwarded-For.
SEARCHGIRL_RATE_RPS / SEARCHGIRL_RATE_BURST20 / 60Per-IP rate limit on API, MCP and login (RPS=0 disables it).
AUTH_MODEemptyfederado enables OIDC with Lockatus (with LOCKATUS_ISSUER / LOCKATUS_CLIENT_ID / LOCKATUS_REDIRECT_URI).
ANTHROPIC_API_KEY / LLM_BASE_URL + LLM_MODELThe optional AI Answer provider.

The full table lives in the repo’s README.

Read the documentation