SSD Nodes Learn RAM 8GB — $66/mwaka
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-01

Jinsi ya Kujihifadhi SearXNG kwa Docker Compose

Endesha SearXNG kwenye VPS yako kwa Docker Compose, ukiweka settings.yml, limiter, nginx yenye TLS na JSON API kwa script zako bila key wala quota.

Unachojenga

Kujihifadhi mwenyewe SearXNG hukupa injini ya utafutaji ya kibinafsi inayoendesha kwenye seva yako mwenyewe. SearXNG ni injini ya utafutaji wa meta: hupokea swali lako, huziuliza injini nyingine kama Google, Bing, DuckDuckGo na Wikipedia, kisha huunganisha majibu yanayopatikana kuwa ukurasa mmoja wa matokeo. Hakuna wasifu unaoundwa wala cookie ya ufuatiliaji inayowekwa, kwa sababu mashine pekee inayohifadhi swali lako ni yako.

Stack hii ni ndogo. Ina kontena mbili, faili moja ya mipangilio na reverse proxy moja. Uamuzi muhimu ni kama instansia itakuwa ya kibinafsi, ambapo ni wewe na script zako pekee mtakaoweza kuifikia, au ya umma, ambapo mtu yeyote kwenye intaneti ataweza kuitumia kutuma maswali. Chaguo hilo hubadilisha mipangilio ya usalama, kwa hiyo lifanye kabla hujaandika chochote. Jibu la chaguo-msingi ni ya kibinafsi.

Kuna sababu nyingine ya kuendesha instansia hiyo. Instansia ya SearXNG hutumia JSON, kwa hiyo script au wakala wa AI utakayeandika hupata API ya utafutaji unayomiliki, bila key, bila malipo kwa kila swali na bila ujumbe wa quota.

Sakinisha SearXNG kwa Docker Compose

Mradi hutoa image ya container na faili la Compose. Pakua zote mbili kwenye server mpya ya Ubuntu 24.04 ambayo tayari ina Docker Engine na plugin ya Compose. Ikiwa Docker ni mpya kwako, anza na Misingi ya Docker Compose kwenye VPS, kisha urudi.

sudo install -d -o "$USER" -g "$USER" -m 750 /opt/searxng
cd /opt/searxng
mkdir -p core-config
curl -fsSL \
  -O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
  -O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp -i .env.example .env

Faili la Compose linafafanua huduma mbili. core ni SearXNG yenyewe, na valkey ni hifadhi ya data iliyo kwenye kumbukumbu, inayotumika kuweka kikomo cha maombi na kuhifadhi hali ya muda mfupi. Linaweka ./core-config/ kwenye /etc/searxng/ ndani ya container, kwa hiyo kila kitu unachosanidi kinaishi kwenye saraka hiyo moja kwenye host.

Sasa hariri .env. Kila mstari kwenye mfano uliotolewa umewekewa maoni, ndiyo sababu container huanza kwenye port 8080 kwenye anwani zote. Ondoa alama ya maoni na uweke mipangilio hii mitatu.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 ni muhimu zaidi. Hufanya port iliyochapishwa iwe 127.0.0.1:8080:8080 badala ya [::]:8080:8080, kwa hiyo container hujibu kupitia anwani ya loopback pekee na mtandao wa intaneti hauwezi kuifikia moja kwa moja. Ukiruka hatua hii, container itawekwa wazi mara tu inapoanza, kwa sababu port ya Docker iliyochapishwa huwekwa kabla ya sheria zako za firewall. Soma kwa undani kuhusu mtego huo hapa: port zilizochapishwa za Docker hupita ufw.

SEARXNG_VERSION=latest inafaa wakati bado unajifunza. Kwenye server muhimu kwako, weka tag maalum. Kufikia July 2026, tag za matoleo hutegemea tarehe na huonekana kama 2026.3.25-541c6c3cb, kwa hiyo deployment iliyowekwa tag maalum husasishwa unapoamua, si wakati registry inabadilika bila kutarajiwa.

settings.yml: sehemu muhimu

Unda core-config/settings.yml kabla ya kuanzisha kwa mara ya kwanza. use_default_settings: true huiambia SearXNG ipakie mipangilio yake chaguo-msingi iliyosafirishwa pamoja na programu, kisha itumie tu funguo ulizoandika. Hivyo faili yako inabaki fupi na itaendelea kufanya kazi baada ya masasisho yanayoongeza chaguo jipya.

Tengeneza siri kwanza, kwa sababu thamani hiyo itawekwa moja kwa moja kwenye faili.

openssl rand -hex 32
use_default_settings: true

general:
  instance_name: "search.example.com"

server:
  base_url: "https://search.example.com/"
  secret_key: "paste-the-openssl-output-here"
  limiter: false
  public_instance: false
  image_proxy: true

valkey:
  url: valkey://valkey:6379/0

search:
  safe_search: 0
  autocomplete: "duckduckgo"
  formats:
    - html
    - json

secret_key hutia sahihi data ya vipindi na tokeni. Chaguo-msingi iliyosafirishwa ni mfuatano halisi ultrasecretkey. Ukiiacha hivyo, mtu yeyote anayejua chaguo-msingi hiyo anaweza kutengeneza tokeni hizo. Ibadilishe mara moja, kisha iache bila kubadilika: kuibadilisha baadaye hufuta kila mapendeleo yaliyohifadhiwa.

base_url lazima iwe anwani ya HTTPS ya umma, ikiwa na alama ya slash mwishoni. Hiyo ndiyo anwani ambayo SearXNG huandika kwenye viungo inavyotoa. Ukiiacha ikienda localhost, kiungo cha "ukurasa unaofuata" katika kivinjari cha mbali kitaelekea kwenye mashine ya msomaji mwenyewe na hakitafanya kazi.

formats huamua aina za matokeo ambazo endpoint ya wavuti itatoa. json haipo kwenye orodha chaguo-msingi, kwa hiyo ombi la JSON litarudisha 403 hadi uiongeze. image_proxy: true hupitisha vijipicha vya matokeo kupitia seva yako, hivyo tovuti zinazohifadhi picha hizo hazitaona anwani za wageni wako.

valkey.url hutumia jina la mwenyeji valkey kwa sababu hilo ndilo jina la huduma katika faili ya Compose, na Compose huweka kontena zote mbili kwenye mtandao mmoja ambako majina ya huduma hutatuliwa. Ielekeze kwenye localhost na kidhibiti cha viwango kitashindwa, kwa sababu ndani ya kontena la core localhost ni kontena hilo hilo.

Siri iko kwenye faili ya kawaida, kwa hiyo linda saraka inayoizunguka badala ya faili yenyewe. chmod 750 /opt/searxng huwazuia watumiaji wengine wa mwenyeji kuifikia. Usibane core-config/settings.yml hadi hali 600: kontena huendeshwa na mtumiaji wake asiye na upendeleo, na faili ambayo haiwezi kusomwa huizuia SearXNG kuanza kabisa.

Anzisha stack na uikague.

cd /opt/searxng
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080/

docker compose ps inapaswa kuonyesha kontena zote mbili zikiwa katika hali running. curl inapaswa kujibu HTTP/1.1 200 OK. Ikiwa haijibu chochote, soma docker compose logs core, kwa sababu kosa la YAML katika settings.yml litaonekana humo kama kosa la kuchanganua linalotaja mstari.

Iweke nyuma ya nginx yenye TLS

Kontena linasikiliza loopback pekee, kwa hiyo nginx ndiyo inayolifanya lifikike. Pia nginx ndiyo inayoongeza usalama wa safu ya usafirishaji (TLS). Andika /etc/nginx/sites-available/searxng.

server {
    listen 80;
    server_name search.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d search.example.com

nginx -t huchapisha syntax is ok na test is successful kabla ya kupakia upya usanidi. Certbot huandika upya faili hiyo hiyo ili isikilize kwenye 443 kwa kutumia cheti, na huongeza uelekezaji kutoka porti 80. Rekodi ya DNS ya search.example.com lazima iwe tayari inaelekeza kwenye seva hii, kwa sababu mamlaka ya vyeti huthibitisha umiliki kwa kuchota faili kupitia HTTP. Mwongozo kamili, pamoja na kusasisha cheti, unapatikana katika mwongozo wa Certbot na nginx kwa Ubuntu 24.04.

Vichwa viwili vya kupeleka maombi si mapambo. Bila X-Forwarded-For na X-Real-IP, kila ombi linalofika SearXNG hubeba anwani ya proksi. Kwa hiyo kikomo cha kasi huona mteja mmoja akituma trafiki yote na hakiwezi kuwatofautisha wageni.

Kwa nini hati na mawakala wanahitaji API ya utafutaji ya JSON

Kwa kutumia json katika formats, endpoint hiyo hiyo inayowasilisha ukurasa hurejesha data iliyopangwa.

curl -s 'http://127.0.0.1:8080/search?q=wireguard+mtu&format=json' \
  | jq -r '.results[0:5][] | .url'

Unapokea kitu chenye safu ya results, ambapo kila ingizo lina url, title, content pamoja na injini iliyolitoa, na pia answers, infoboxes na suggestions. Hiyo inatosha kulisha zana ya kufupisha, kikagua viungo au mzunguko wa utafiti.

Hili ni muhimu kwa kitu chochote kinachohusisha mawakala. Modeli ya lugha ina kikomo cha muda cha data yake ya mafunzo. Kwa hiyo, inahitaji utafutaji wa moja kwa moja ili kujibu maswali kuhusu hali ya sasa. Pia, API za kibiashara za utafutaji hutoza kwa kila ombi na huweka vikomo vikali vya kiwango cha maombi. Instance ya ndani inahitaji container moja tu kwenye server ambayo tayari unailipia, na hoja za utafutaji haziondoki humo. Ukiunganisha zana kwenye modeli, mantiki hiyo hiyo inahusu kuendesha server za MCP kwenye VPS, ambapo zana ya utafutaji huwa ya kwanza kuongezwa na watu wengi.

Fuata sheria mbili unapotumia API. Weka instance ikiwa ya faragha. Funga upande wa API kwenye anwani ya loopback au kwenye mtandao wa faragha, na uruhusu hosts zako pekee kuifikia. Kisha tuma hoja kwa kiwango cha wastani. SearXNG huelekeza ombi lako kwenye injini halisi za utafutaji. Kwa hiyo, script inayotuma hoja mia moja kwa sekunde inaomba Google kuzuia server yako.

Kizuiaji, na mabadiliko kwa mfano wa umma

Kizuiaji ni ulinzi wa SearXNG dhidi ya roboti. Hufuatilia vichwa vya maombi, anwani na viwango vya maombi, kisha huacha trafiki inayoonekana kuwa ya kiotomatiki. Kinahitaji Valkey kuhifadhi hali hiyo, ndiyo maana faili ya Compose inakijumuisha.

Kwa mfano wa faragha, acha limiter: false. Skripti zako ni trafiki ya kiotomatiki kwa ufafanuzi, kwa hiyo kizuiaji kitazuia hasa maombi ya JSON uliyoundia mfano huo. Udhibiti wa ufikiaji ni kazi ya proksi ya nyuma badala yake: jozi ya allow na deny katika location ya nginx, uthibitishaji msingi wa HTTP, au firewall inayoruhusu tu seva zako nyingine.

Ukichapisha mfano huo kwa watu wengine, washa swichi zote mbili.

server:
  limiter: true
  public_instance: true

Udhibiti wa kina zaidi uko katika core-config/limiter.toml, ambayo kontena husoma kutoka /etc/searxng/limiter.toml. Andika tu funguo unazotaka kubadilisha. Ukiwa nyuma ya proksi, lazima utangaze proksi hiyo; la sivyo kizuiaji kitaichukulia anwani ya nginx yako kuwa mteja mmoja anayefanya matumizi mabaya.

[botdetection]
trusted_proxies = [
  '127.0.0.0/8',
  '::1',
]

[botdetection.ip_limit]
link_token = true

link_token = true hufanya SearXNG itoe tokeni ambayo kipindi halisi cha kivinjari pekee ndicho kitakachopata, hivyo huzuia vichanganuzi rahisi vingi. Tarajia mfano wa umma kuvutia vichanganuzi hivyo ndani ya siku chache. Tarajia pia hitilafu za injini, kwa sababu kadiri unavyopitisha trafiki nyingi, ndivyo injini za juu zinavyoanza mapema zaidi kurudisha CAPTCHA kwenye anwani ya seva yako. Mfano wa umma wa SearXNG ni kazi inayoendelea. Wa faragha si hivyo, ndiyo maana unaonekana kwenye orodha fupi nyingi za mambo yanayofaa kujipangia mwaka 2026.

Kwa nini utafutaji haurudishi chochote

Fungua /stats kwenye instance yako. Inaorodhesha injini zote pamoja na kiwango cha hitilafu na muda wa majibu. Hapo ndipo pa kwanza pa kuangalia matokeo yanapoonekana kuwa machache.

Injini inayoonyesha hitilafu za "Access denied" au "CAPTCHA" imezuia anwani ya server yako. Hili hutokea mara nyingi kwa anwani zilizo katika safu za vituo vya data, kwa sababu injini za utafutaji hudhani kuwa anwani hizo ni za scrapers. Kisha SearXNG husimamisha injini inayoshindwa kwa muda fulani badala ya kuijaribu tena. Kwa hiyo, injini moja iliyozuiwa huondoka kwenye matokeo yako bila taarifa. Izime kwenye settings.yml au ukubali kupoteza matokeo yake. Injini zilizosalia bado zitajibu.

Injini zote zikishindwa kwa wakati mmoja, container haina name resolution inayofanya kazi kwa miunganisho ya nje au haina njia ya kufikia internet. Jaribu hilo ukiwa ndani ya container.

docker compose exec core wget -qO- https://duckduckgo.com > /dev/null && echo ok

FAQ

Je, SearXNG hufanya utafutaji wangu usijulikane?

Huficha utambulisho wako kutoka kwa injini inazouliza, kwa sababu injini hizo huona seva yako ikituma ombi badala ya kivinjari chako. Haifichi ombi hilo kutoka kwa seva yako, wala haifichi seva yako kutoka kwa injini hizo. Kwenye kiinstanti cha mtumiaji mmoja, trafiki yote kutoka kwenye anwani hiyo ni yako, hivyo anwani yenyewe huwa kitambulisho. Trafiki kati ya kivinjari chako na kiinstanti chako inalindwa na cheti cha TLS.

Kwa nini ombi la JSON hurudisha 403 Forbidden?

Kuna sababu mbili, na zote zinahusu usanidi. Aidha json haipo kwenye orodha ya formats iliyo chini ya search: katika settings.yml, hali hiyo ikiwa ndiyo ya kawaida, au kizuiaji kimewashwa na kimeainisha script yako kuwa bot. Ongeza muundo huo kwanza, anzisha upya kwa docker compose restart core, kisha ujaribu tena. Ikiendelea kushindikana, weka limiter: false na udhibiti ufikiaji kwenye reverse proxy badala yake.

Je, ninahitaji kontena la Valkey ikiwa nimeacha kizuiaji kikiwa kimezimwa?

Liache likiendelea kufanya kazi. SearXNG hufanya kazi bila kontena hilo, lakini kizuiaji hakiwezi kuwashwa baadaye bila hilo, na kontena hilo pia huhifadhi hali nyingine ya muda mfupi. Kontena hilo ni dogo na huhifadhi data iliyowekwa kwenye akiba pekee, kwa hiyo kuliondoa huokoa kiasi kidogo sana na hukunyima chaguo hilo.

Je, ninasasishaje SearXNG?

Tekeleza docker compose pull kisha docker compose up -d katika /opt/searxng. Compose huunda upya kontena lolote ambalo image yake imebadilika na huacha saraka yako ya core-config/ bila kubadilishwa, hivyo settings.yml hubaki. Kwa sababu use_default_settings: true huunganisha funguo zako juu ya chaguo-msingi zilizotolewa, chaguo zilizoongezwa na upstream huwasili zikiwa na thamani zinazofaa badala ya kuvuruga faili.

Je, watu kadhaa wanaweza kushiriki kiinstanti kimoja?

Ndiyo, na huo ndio wakati wa kuwasha kizuiaji na kuweka public_instance: true. Mapendeleo huhifadhiwa kwenye kivinjari cha kila mgeni, kwa hiyo hakuna akaunti za kusimamia. Fuatilia /stats kwa wiki moja baada ya kukifungua, kwa sababu injini za upstream huanza kukataa seva yako muda mrefu kabla hujaona matokeo yakikosekana.

#searxng#search#privacy#self-hosting#docker