SearXNG — a privacy-respecting, hackable metasearch engine that aggregates results from 70+ search engines without profiling or tracking you. Deployed as a host-networked Nomad service with a persistent settings/config volume.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 37.5k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "searxng"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The SearXNG container image. Pin a tag in production.
image = "searxng/searxng:latest"
# Host port for the SearXNG web UI. The container listens on 8080; keep this at 8080 unless you also change server.port in the settings volume.
port = 8080
# Public base URL SearXNG is served at (SEARXNG_BASE_URL), e.g. https://search.example.com/. Empty = http://localhost:<port>/.
base_url = ""
# Secret used to sign the search UI (SEARXNG_SECRET). CHANGE THIS — generate with: openssl rand -hex 32.
secret_key = "change-me-to-a-random-secret"
# Named volume for SearXNG settings and config (/etc/searxng, holds settings.yml).
data_volume = "searxng_data"
# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the SearXNG task.
resources = {
cpu = 500
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "searxng" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "searxng/searxng:latest" | The SearXNG container image. Pin a tag in production. |
| port | number | 8080 | Host port for the SearXNG web UI. The container listens on 8080; keep this at 8080 unless you also change server.port in the settings volume. |
| base_url | string | "" | Public base URL SearXNG is served at (SEARXNG_BASE_URL), e.g. https://search.example.com/. Empty = http://localhost:<port>/. |
| secret_key set me | string | "change-me-to-a-random-secret" | Secret used to sign the search UI (SEARXNG_SECRET). CHANGE THIS — generate with: openssl rand -hex 32. |
| data_volume | string | "searxng_data" | Named volume for SearXNG settings and config (/etc/searxng, holds settings.yml). |
| constraints | list | [] | Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 500
memory = 256
} | Resources for the SearXNG task. |
No variables match.
This pack stores data in one Docker named volume:
searxng_data
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/searxng_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/searxng_data/_data backup:<bucket>/searxng_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
SearXNG — a privacy-respecting, hackable metasearch engine. It queries 70+ search engines and aggregates the results, without profiling you, storing your searches, or serving ads. A great private front-end for the web, and a popular search backend for self-hosted LLM tools.
Single host-networked Nomad service with a persistent settings volume (/etc/searxng).
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run searxng --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
8080 |
Web UI port. The container listens on 8080 — keep this unless you also change server.port in the settings volume. |
base_url |
"" → http://localhost:<port>/ |
SEARXNG_BASE_URL — set to your public URL. |
secret_key |
change-me-… |
SEARXNG_SECRET — change it (openssl rand -hex 32). |
data_volume |
searxng_data |
/etc/searxng — holds settings.yml. |
image |
searxng/searxng:latest |
Container image. Pin a tag in production. |
resources |
{ cpu = 500, memory = 256 } |
Task resources. |
On first boot SearXNG writes a default settings.yml into the volume. Edit it to tune engines,
change server.port, or enable the JSON format under search.formats (required if you point
Open WebUI or an LLM agent at SearXNG). Serves plain HTTP — front it with a reverse proxy for TLS.
Pin the job to the node holding the volume with constraints.