Degoog Environment variables
Everything you configure before Degoog starts, rather than from the settings page.
How to set them
Degoog reads its configuration from the process environment at startup. The
usual way to supply it is a .env file: one
KEY=value per line, no export prefix,
# for comments.
Some things can only be set this way.
DEGOOG_SETTINGS_PASSWORDS in particular is read exclusively from
the environment; there is no settings UI and no on-disk file for it. If your
instance is reachable from the internet, set it before the first start. An
unlocked instance lets anyone install extensions, and extensions run code on
your server.
# .env
DEGOOG_PORT=4444
DEGOOG_SETTINGS_PASSWORDS=your-secure-password
LOG_LEVEL=info
# Optional: listen on a Unix socket instead of a port
# DEGOOG_UNIX_SOCKET=/run/degoog/degoog.sock
Docker and Podman
Put .env next to your compose file and add
env_file: .env to the service, or pass
--env-file .env to docker run /
podman run. Container images also honour PUID and
PGID so ownership on mounted volumes matches your host user.
services:
degoog:
image: ghcr.io/degoog-org/degoog:latest
env_file: .env
volumes:
- ./data:/app/data
ports:
- "4444:4444"
Native install or release tarball
Save .env in the project root next to package.json;
Bun loads it automatically when you start from that directory. Always start
Degoog from that directory, because paths like
data/plugins resolve relative to the working directory.
Prebuilt archives are attached to each GitHub release. You also need bun, git, and curl on the host.
systemd
[Service]
WorkingDirectory=/opt/degoog
EnvironmentFile=/opt/degoog/.env
ExecStart=/usr/local/bin/bun run src/server/index.ts
Restart=on-failure
Viewing server logs
LOG_LEVEL controls how much gets printed. Where to read it:
- Docker Compose:
docker compose logs -f - Podman:
podman logs -f degoog - systemd:
journalctl -u degoog -f - Tarball or native: the terminal you started it in. Redirect stdout and stderr to a file if you run detached.
Server and networking
| Variable | Description | Default |
|---|---|---|
DEGOOG_PORT |
The port the server listens on. | 4444 |
DEGOOG_UNIX_SOCKET |
Listen on a Unix domain socket instead of a TCP port, for example
/run/degoog/degoog.sock. Degoog detects and removes a stale
socket left behind by an unclean shutdown.
|
|
DEGOOG_BASE_URL |
Base path when serving behind a reverse proxy at a sub-path, for example
/degoog. A full URL is accepted and only its path is used,
so a bare domain with no sub-path has no effect. The OpenSearch
descriptor always uses just the path portion so its URLs stay valid.
|
|
DEGOOG_DISTRUST_PROXY |
Whether to ignore X-Forwarded-For, X-Real-IP,
and X-Forwarded-Proto when determining the client IP and
protocol. Defaults to distrusting them, which is correct when Degoog is
exposed directly, since otherwise any client could spoof its source IP.
Set to 0 or false only behind a reverse proxy
you control that strips those headers on the way in.
|
1 |
DEGOOG_OUTGOING_ALLOWED_HOSTS |
Comma-separated allowlist of hostnames Degoog may reach for outgoing
requests. Wildcards such as *.example.com are accepted.
Unset means no hostname restriction. A good hardening layer on an
exposed instance.
|
Access and settings gate
| Variable | Description | Default |
|---|---|---|
DEGOOG_SETTINGS_PASSWORDS |
Comma-separated list of passwords for the settings page. If unset and the gate is not explicitly disabled, Degoog generates a one-off password for that run and prints it in the startup logs. | |
DEGOOG_DANGEROUSLY_NO_PASSWORD |
Set to true to remove the settings gate entirely. Degoog
logs a loud warning at startup when this is on. Only sensible on a
trusted local network.
|
false |
DEGOOG_PUBLIC_INSTANCE |
Set to true or 1 to run in public mode.
Visitors get a cut-down settings page (appearance, search options,
engine toggles) and every server-side mutation API returns Unauthorized.
The admin panel moves to /admin, and is only reachable if a
password is configured too.
|
|
DEGOOG_SETTINGS_PATH |
Moves the admin settings panel to a custom path. Defaults to
settings on a normal instance and admin on a
public one. Leading slashes are stripped. On a public instance the panel
at this path returns 404 with no hint that it exists unless a password
is also configured.
|
Behaviour and localisation
| Variable | Description | Default |
|---|---|---|
DEGOOG_DEFAULT_SEARCH_LANGUAGE |
Language applied to searches when the user has not picked one. Only the
primary subtag is used, so en-US becomes en.
Unset means no language is sent and each engine uses its own default.
|
|
DEGOOG_I18N |
Forces the UI locale for every request, overriding
Accept-Language. For example en-US,
fr-FR, it, he.
|
|
DEGOOG_WIZARD |
Set to false to suppress the first-run setup wizard
regardless of persisted state. Useful when provisioning instances
automatically.
|
|
DEGOOG_BETA_STORE |
Set to 1 to prefer the develop branch of every
store repository over main or master, falling
back silently when it does not exist. For extension developers and
nightly testers.
|
|
LOG_LEVEL |
Console verbosity, from most to least severe: fatal,
error, warn, info,
log, debug. Each level includes the more
severe ones. debug also prints plugin execution times.
|
info |
LOG_TRANSLATION |
Set to true for translation-specific logging: missing keys,
locale resolution, broken locale files. Independent of
LOG_LEVEL.
|
false |
NO_COLOR |
Set to any value to strip ANSI colour from all console output. Follows the no-color convention. |
Cache
| Variable | Description | Default |
|---|---|---|
DEGOOG_VALKEY_URL |
Connection URL for Valkey, or any RESP-compatible server (Redis, KeyDB,
Dragonfly). When set, Degoog uses it as a shared cache and cross-process
invalidation bus, so replicas share search and autocomplete results and
react to settings changes instantly. Without it, all caching is
per-process and in memory. Example: redis://valkey:6379.
|
|
DEGOOG_CACHE_TTL_MS |
Default lifetime for cached search responses and autocomplete suggestions, in milliseconds. | 43200000 (12 hours) |
DEGOOG_CACHE_SHORT_TTL_MS |
Shorter lifetime used when a search came back with failed engines, so the next attempt refetches sooner. Also used by short-lived extension caches. | 120000 (2 minutes) |
DEGOOG_CACHE_MAX_ENTRIES |
Maximum entries per in-memory cache namespace. The least recently used
entry is evicted on insert once the cap is reached. Only bounds the
in-process cache; a shared Valkey cache is governed by Valkey's own
maxmemory policy.
|
1000 |
Docker
| Variable | Description | Default |
|---|---|---|
PUID |
User ID the container process runs as. Match it to your host user so the
mounted data directory stays writable.
|
1000 |
PGID |
Group ID the container process runs as. | 1000 |
Data directories and files
Everything below defaults to somewhere inside the data directory, so
overriding DEGOOG_DATA_DIR alone usually gets you what you want.
| Variable | Description | Default |
|---|---|---|
DEGOOG_DATA_DIR |
Root directory for all on-disk state. | data (relative to the working directory) |
DEGOOG_PLUGINS_DIR |
Installed plugins. | data/plugins |
DEGOOG_ENGINES_DIR |
Installed search engines. | data/engines |
DEGOOG_THEMES_DIR |
Installed themes. | data/themes |
DEGOOG_TRANSPORTS_DIR |
Installed transports. | data/transports |
DEGOOG_AUTOCOMPLETE_DIR |
Installed autocomplete providers. | data/autocomplete |
DEGOOG_SHORTCUTS_DIR |
Installed keyboard shortcuts. | data/shortcuts |
DEGOOG_PLUGIN_SETTINGS_FILE |
Per-extension settings for plugins, themes, engines, autocomplete providers, and transports. | data/plugin-settings.json |
DEGOOG_SERVER_SETTINGS_FILE |
Instance-level settings: honeypot, streaming, rate limits, API secret, wizard state, and the per-instance identifier used to namespace the shared cache. | data/server-settings.json |
DEGOOG_DEFAULT_ENGINES_FILE |
The instance's default enabled and disabled engines. | data/default-engines.json |
DEGOOG_SEARCH_LISTS_FILE |
Domain blocking, replacement, and scoring lists. Edit this directly when a list grows too large for the UI to render. | data/search/search-lists.json |
DEGOOG_ALIASES_FILE |
Your custom bang command aliases. | data/aliases.json |
DEGOOG_BLOCKLIST_FILE |
Banned IP addresses. | data/blocklist.json |
DEGOOG_SETTINGS_TOKENS_FILE |
Active settings session tokens. | data/settings-tokens.json |
Indexer
| Variable | Description | Default |
|---|---|---|
DEGOOG_POSTGRES |
Postgres connection URL. When set, the indexer uses Postgres instead of SQLite, which scales concurrent writes and full-text search far better on a busy instance. | |
DEGOOG_INDEXER_DIR |
Directory holding the index databases and its config. | data/indexer |
DEGOOG_INDEXER_DB |
Path to the main SQLite index file. | data/indexer/index.db |
DEGOOG_INDEXER_CONFIG_FILE |
Indexer filters and limits. Edit directly when a list is too large for the UI. | data/indexer/indexer-config.json |
SearX compatibility layer
| Variable | Description | Default |
|---|---|---|
DEGOOG_SEARX_ENGINES_DIR |
Where downloaded SearXNG engine files are kept. | data/searx/engines |
DEGOOG_SEARX_EXTRA_ENGINES |
Comma-separated SearXNG engine codes to treat as supported in addition to the built-in compatibility list. For trying engines that have not been verified yet. | |
DEGOOG_PYTHON_BIN |
Python interpreter used to run SearXNG engine files. | python3 |
The degoog-mcp sidecar has its own
DEGOOG_MCP_* variables, documented in the
MCP README
rather than here, since it is a separate process.