A direct hit on the published port has no X-Forwarded-For header, so the bot-detection cannot resolve a client and returns 429. SearXNG must be reached through Caddy (search.dankclaw.local), which sets X-Forwarded-For. Add the podman bridge subnets to trusted_proxies so Caddy's source is trusted for XFF extraction; note the CIDR is dynamic and should be pinned. Verified agentic JSON search returns 26-31 relevant results via this path.
52 lines
1.7 KiB
TOML
52 lines
1.7 KiB
TOML
# SearXNG limiter / bot-detection config.
|
|
# Deployed to /opt/searxng/config/limiter.toml on Dankclaw (mounted at
|
|
# /etc/searxng/limiter.toml). Loaded when server.limiter: true in settings.yml.
|
|
#
|
|
# The "trusted group" lives HERE, not in settings.yml.
|
|
# Docs: https://docs.searxng.org/admin/searx.limiter.html
|
|
|
|
[botdetection]
|
|
|
|
# Number of leading bits compared to group addresses into a (client) network.
|
|
ipv4_prefix = 32
|
|
ipv6_prefix = 48
|
|
|
|
# If the request IP is in trusted_proxies, the real client IP is read from the
|
|
# X-Forwarded-For / X-Real-IP headers (set by the Caddy reverse proxy).
|
|
# SearXNG must be reached through Caddy (search.dankclaw.local): a direct hit on
|
|
# the published port has no X-Forwarded-For header, so the bot-detection cannot
|
|
# resolve a client and rate-limits it. Caddy connects from the podman bridge, so
|
|
# the bridge subnet must be trusted here. NOTE: rootless podman assigns the bridge
|
|
# CIDR dynamically; pin the network (podman network create with a fixed --subnet)
|
|
# so these entries stay stable.
|
|
trusted_proxies = [
|
|
'127.0.0.0/8',
|
|
'::1',
|
|
'192.168.0.0/24',
|
|
'10.88.0.0/24',
|
|
'10.89.1.0/24',
|
|
]
|
|
|
|
[botdetection.ip_limit]
|
|
|
|
# Link-local addresses (fe80::/10, 169.254.0.0/16) are not monitored.
|
|
filter_link_local = false
|
|
|
|
# link_token: per-session URL bypass token. Keep off.
|
|
link_token = false
|
|
|
|
[botdetection.ip_lists]
|
|
|
|
# ip_lists outranks every other method: an IP in pass_ip gets unrestricted
|
|
# access and is not checked by user-agent or other bot detection.
|
|
# The whole homelab LAN is trusted.
|
|
pass_ip = [
|
|
'192.168.0.0/24',
|
|
]
|
|
|
|
# Blocklist (none).
|
|
block_ip = []
|
|
|
|
# Keep the SearXNG org passlist (e.g. check.searx.space) enabled.
|
|
pass_searxng_org = true
|