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).
Requirements
Section titled “Requirements”- 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.
Quick start (Docker Compose)
Section titled “Quick start (Docker Compose)”git clone https://github.com/diegoparras/searchgirlcd searchgirldocker compose up -d --buildOpen http://localhost:8089 — private search, running.
Local login (standalone)
Section titled “Local login (standalone)”For an installation of your own with a sign-in screen, define in a .env next to the compose:
SEARCHGIRL_USER=diegoSEARCHGIRL_PASS=a-long-passwordSECRET_KEY=a-cookie-secret # optional; without it sessions reset with the containerThe 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.
Deploy on EasyPanel
Section titled “Deploy on EasyPanel”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.
- Create a project named
searchgirl. Inside a project, services see each other by internal DNS as<project>_<service>(e.g.searchgirl_searxng). - Service
searxng— App → Docker Imageghcr.io/searxng/searxng:latest. SetSEARXNG_SECRET(openssl rand -hex 32) and add a File Mount at/etc/searxng/settings.ymlwithformats: [html, json]andlimiter: false(the exact contents are inDEPLOY.md). No domain — it stays internal. - Service
app— App → Docker Imageghcr.io/diegoparras/searchgirl:latest. Environment:SEARXNG_URL=http://searchgirl_searxng:8080, yourSEARCHGIRL_USER/SEARCHGIRL_PASS/SECRET_KEY,COOKIE_SECURE=1andSEARCHGIRL_TRUSTED_PROXIES=172.16.0.0/12. Add your domain with HTTPS on, internal port 8080. - Verify:
curl https://your-domain/healthz→ok, then sign in from the browser. - Update: hit Deploy on the
appservice — it pullslatest. 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).
Optional: AI Answer
Section titled “Optional: AI Answer”With a model configured, the AI Answer button, the POST /api/answer endpoint and the
answer MCP tool light up. Pick one provider:
# 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/v1LLM_MODEL=qwen2.5:7bWithout either, everything else works the same — the button just does not appear.
Main environment variables
Section titled “Main environment variables”| Variable | Default | What it controls |
|---|---|---|
SEARXNG_URL | http://searxng:8080 | URL of the internal SearXNG. |
SEARCHGIRL_DEFAULT_LANGUAGE | es | Default search language. |
SEARCHGIRL_USER / SEARCHGIRL_PASS | — | Standalone local login: one user, standard Escriba screen. |
SECRET_KEY | random | HMAC key for the session cookie; set it so sessions survive restarts. |
COOKIE_SECURE | 0 | 1 behind HTTPS. |
SEARCHGIRL_MCP_TOKEN | — | Bearer tokens for API+MCP. Several, named: claude:abc...,n8n:def... — revoking one does not rotate the rest. |
SEARCHGIRL_TRUSTED_PROXIES | — | Reverse-proxy IPs/CIDRs so the rate limit sees the real client IP via X-Forwarded-For. |
SEARCHGIRL_RATE_RPS / SEARCHGIRL_RATE_BURST | 20 / 60 | Per-IP rate limit on API, MCP and login (RPS=0 disables it). |
AUTH_MODE | empty | federado enables OIDC with Lockatus (with LOCKATUS_ISSUER / LOCKATUS_CLIENT_ID / LOCKATUS_REDIRECT_URI). |
ANTHROPIC_API_KEY / LLM_BASE_URL + LLM_MODEL | — | The optional AI Answer provider. |
The full table lives in the repo’s README.
Read the documentation