SearXNG metahakukoneen voi asettaa käyttämään yksityisyyden säilyttävää tor-verkkoa kahdella tavalla, yhdessä tai erikseen. Joko niin, että SearXNG tekee hakukyselyt tor-verkon kautta, tai että kävijä saapuu tor-verkon kautta onion-osoitteeseen.
Syy miksi aloin painimaan SearXNG-asennukseni ja tor-verkon kanssa oli hyvin yksinkertainen. Olin laittanut jo omat WordPress-asennukseni onion-linkeille, kuin myös Mastodonin. Sekä pyynnöstä hostaamani WriteFreely-blogin (toim.huom.: WordPress on joka suhteessa parempi blogialusta, mutta minulta ei kysytty). Joten SearXNG menee samaan syssyyn.
Pixelfed ja Discourse ovat vielä täysin clearnetin puolella. Discourse siksi, että se on hankala, enkä ole varma onnistuisiko moinen edes. Pixelfed ihan siksi, että kuvat ovat raskaita siirtää tor-verkon läpi ja ne joutuisi proxyamaan oman serverin kautta. Koska olen instanssini ainoa käyttäjä, niin en ole motivoitunut tuohon muutokseen.
Muutos salauksen tarpeen mukaan
SearXNG:ssä lähestymistavan valinta riippuu tietysti tarpeesta. Ne kun suojaavat kahta eri asiaa:
- kyselyn tekeminen tor-verkon kautta salaa SearXNG:n IP-osoitteen, mutta ei poikkeuksellisesti käyttäjään
- onion-linkki salaa käyttäjän ja hänen liikkumisensa verkossa, mutta SearXNG näkyy normaalisti hakukoneille
Käyttäjähän on aina piilossa SearXNG:n toiminnassa. Joten onion-linkin käyttö oli omassa valinnassani oleellista, ei serverin piilottaminen. Tor-verkkoa käyttävät haluavat salata oman liikkumisensa sekä olemisensa ja vaikka SearXNG näkyisikin hakukoneille SearXNG:n IP-osoitteella, niin se ei yhdisty käyttäjään.
Minulla ei ole tarvetta piilottaa SearXNG:n olemassaoloa. Siinä ei ole mitään varsinaista pointtia, mutta siinä, että SearXNG tekee kyselyt tor-verkon kautta, on haittansa. Silloin hakukoneet näkevät tor-verkon exit pointin ja se kertoo olevansa tor exit – jotka on monessa paikassa bannattu.
SearXNG on muutoinkin jo ongelmissa meta/proxy-luonteensa takia. Mainostuksessa puhutaan, että käytössä on noin 270 hakukonetta/SearXNG-engineä. Niistä on toimivia ehkä 200, koska lisääntyvissä määrin hakukoneet ovat estäneet SearXNG:n erilaisin tavoin. Joten minulla ei ollut minkäänlaista halua lisätä estoja julkisesti ilmoitettavan tor-liikenteen takia. Varsinkin, kun en näe tuollaisessa tor-verkon käytössä mitään hyötyä.
Jos asuisin Venäjällä, Kiinassa, Iranissa tai Turkmenistanissa, niin kantani olisi toinen. Mutta olen suomalainen ja serverini on Helsingissä (noinkohan on hieman idempänä), joten… ei.
Edelleenkin hakujen proxyaminen tor-verkon kautta salaa SearXNG-serverin, eikä se liity mitenkään käyttäjään. Onion salaa käyttäjän.
Oman serverin tuunaus vai uusi
Minulla oli toinenkin mietittävä asia: käytänkö nykyistä SearXNG-asennustani vai teenkö uuden tor-verkon onion-käytölle.
WordPress-sivustoni ovat mirroreita. Ne on peilattu tor-verkon puolelle, mutta sisältö on clearnetin puolella. Silloin minulle ylläpitäjänä näkyy vain kelloaika ja mitä on pyydetty, ei muuta. Koska kävijä ei ole omalla liikkumisellaan jättänyt varsinaisia jälkiä mihinkään, niin en kykene suhtautumaan paikallisiin logeihin riittävällä vainoharhalla, että saisin rakennettua siitä ongelman. Siksi toiseksi tuo tieto tulee aina ja poikkeuksetta, sitä ei pysty välttämään.
SearXNG on perusteiltaan täysin erilainen kuin WordPress, WriteFreely tai Mastodon. Sillä ei ole omaa sisältöä. SearXNG on ”vain” käyttöliittymä hakukyselyille ja niiden esittämiselle. Joten varsinaista tarvetta alkaa tekemään ekstravirityksiä clearnetin ja darknetin yhteen ymppäämiselle ei ole. Siispä tein oman asennuksen onion-käytölle.
Oli erillisten instanssien käytölle toinenkin syy. Minulla on clearnetin puolella rate limiter käytössä hidastamassa bottiliikennettä, mutta koska se toimii IP-osoitteiden kanssa ja koska onionilla jokainen käyttäjä näkyy localhostin 127.0.0.1 IP:llä – tor/onion ei käytä IP-osoitteita – niin rate limiter ei toimi.
Asennus tor/onionia varten
Tuttuun tapaani ollaan Ubuntussa. Enkä laita sudoa esimerkkeihin, koska en käytä niitä itse. Teen töitä rootin ominaisuudessa.
Koska tehdään tor-asennus, niin tor täytyy olla… asennettuna.
apt update && apt install tor nyx -y && systemctl enable --now tor
Hyödynnän alkuperäistä SearXNG-asennustani. Jos teet neitseellistä asennusta, niin laita ensin paikalleen vanilja-asennus ja muuta joko matkalla tai viimeiseksi oleelliset kohdat.
Ihan ensimmäiseksi generoin onionin tarvitsemat avaimet:
nano /etc/tor/torrc
Lisää jotain tämän kaltaista:
HiddenServiceDir /var/lib/tor/onion_searxng/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:8887
- en tiedä tarvitaanko version ilmoittamista aidosti. Kolmosta ne aina ovat nykyään eikä kakkosta, eli lyhyempää onion-urlia, taida edes saada käyttöön kuin vanhalla tor-versiolla
Localhostin portti on valinnainen. Lopuksi tarvitaan systemctl restart tor@default
.
On ainakin kaksi tapaa. Joko tekee kokonaan uuden containerin, jolloin kannattaa kopioida koko /opt/searxng
hakemisto (tai mitä polkua käytätkin) uudelle nimelle. Tai sitten käyttää samaa containeria ja lisää uuden servicen tai kuten minä tein copy&paste ammattilaisena: kopioi vanhan uudelle nimelle
Minulla oli tuohon näkemys. Olen tehnyt säätöjä, ja niiden virittely uudelle containerille olisi saattanut vaatia lisää säätämistä. Plus nyt molemmat päivittyvät lähtökohtaisesti samaan versioon yhdellä komennolla.
Kopioin siis searxng
osan uudelle nimelle searxng_onion
ja muutin vanhan nimelle searxng_web
. Ihan pelkästään selvyyden ja johdonmukaisuuden takia.
Uudessa servicessä täytyy vaihtaa nimet, portit ja sellaiset.
Valkey mietitytti. Tässäkin olisi kaksi vaihtoehtoa. Joko kopioida samalla tavalla vanha uudelle nimelle, ja kytkeä vanhat toisiinsa, ja uudet yhteen. Tai käyttää samaa.
Tyydyin vain vaihtamaan databasen numeron ja pitämään yhden Valkey asennuksen. Syy oli se, että ymmärtääkseni muistinkulutus, muistivaraukset tai jotkut muut samankaltaiset asia olisivat myös tuplaantuneet. Eikä minulla ole WordPresseillekään ikiomaa erillistä MariaDB-asennusta.
Toki docker mahdollistaa erilliset paljon helpommin kuin tavallisessa localhostissa, mutta silti. Haittahan tietysti on tilanne, jossa Valkey kaatuu syystä tai toisesta. Silloin kaatuu molemmat SearXNG:t.
Lienee helpompi laittaa näkyviin miltä oma docker-compose.yml
näyttää, mutta ei siinä mitään ihmeellistä ole:
services:
valkey:
image: valkey/valkey:latest
networks: [searxnet]
command: >
valkey-server
--protected-mode no
--port 6379
--maxmemory 512mb
--maxmemory-policy allkeys-lru
--save ""
--appendonly no
healthcheck:
test: ["CMD", "valkey-cli", "-h", "127.0.0.1", "-p", "6379", "PING"]
interval: 2s
timeout: 2s
retries: 12
restart: unless-stopped
searxng_web:
image: searxng/searxng:latest
# image: searxng/searxng:2025.9.14-23257bd
container_name: searxng_web
depends_on:
valkey:
condition: service_healthy
restart: unless-stopped
networks: [searxnet]
ports:
- "127.0.0.1:8888:8080"
volumes:
- /opt/searxng/settings.yml:/etc/searxng/settings.yml
- /opt/searxng/limiter.toml:/etc/searxng/limiter.toml
- /opt/searxng/static/custom:/usr/local/searxng/searx/static/custom
# Logo
- /opt/searxng/static/custom/img/searxng.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png
- /opt/searxng/static/custom/img/favicon.svg:/usr/local/searxng/searx/templates/simple/searxng-wordmark.min.svg
- /opt/searxng/static/img/favicon.png:/usr/local/searxng/searx/static/img/favicon.png
- /opt/searxng/static/img/favicon.svg:/usr/local/searxng/searx/static/img/favicon.svg
extra_hosts:
- "host.docker.internal:172.18.0.1"
environment:
- SEARXNG_VALKEY_URL=valkey://valkey:6379/0
- SEARXNG_BASE_URL=https://haku.eksis.eu/
- SEARXNG_SECRET_KEY=<pitkä-merkkisarja>
- UWSGI_WORKERS=2
- UWSGI_THREADS=2
# - SEARXNG_DEBUG=1
searxng_onion:
image: searxng/searxng:latest
# image: searxng/searxng:2025.9.14-23257bd
container_name: searxng_onion
depends_on:
valkey:
condition: service_healthy
restart: unless-stopped
networks: [searxnet]
ports:
- "127.0.0.1:8889:8080"
volumes:
- /opt/searxng/onion/settings.yml:/etc/searxng/settings.yml
- /opt/searxng/onion/limiter.toml:/etc/searxng/limiter.toml
- /opt/searxng/onion/static/custom:/usr/local/searxng/searx/static/custom
# Logo
- /opt/searxng/onion/static/custom/img/searxng.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png
- /opt/searxng/onion/static/custom/img/favicon.svg:/usr/local/searxng/searx/templates/simple/searxng-wordmark.min.svg
# favicon vaihto
- /opt/searxng/onion/static/img/favicon.png:/usr/local/searxng/searx/static/img/favicon.png
- /opt/searxng/onion/static/img/favicon.svg:/usr/local/searxng/searx/static/img/favicon.svg
extra_hosts:
- "host.docker.internal:172.18.0.1"
environment:
- SEARXNG_VALKEY_URL=valkey://valkey:6379/1
- SEARXNG_BASE_URL=http://metahaku5ihva54436zba6m7ylypw46dzbtqfcvgugz3wzlfc6wkemad.onion/
- SEARXNG_SECRET_KEY=<pitkä-merkkisarja>
- UWSGI_WORKERS=2
- UWSGI_THREADS=2
# - SEARXNG_DEBUG=1
networks:
searxnet:
external: true
Vaihdetaan servicen nimi, containerin nimi, tietokannan numero ja base url. Vähimmillään täytyy muuttaa myös settings.yml
nimi.
Minä oikaisin mutkia, tai oikeammin tein elämästäni mahdollisesti hieman hankalaa. Tein hakemiston onion
ja kopioin kaikki rojut sinne. Sen jälkeen korjasin polut onioninvolumes
osaan. Joten jos lisään tai muutan jotain samanlaista asiaa molemmissa, niin minun on muistettava tehdä muutos kumpaankin.
Taka-ajatus tuossa oli, että saatan tehdä muutoksia sen mukaan koskeeko se onionia vai web-versiota. Toki voisin silloin käyttää ikiomaa polkua, tai erilaista tiedostonimeä, mutta nyt ei tarvitse muistaa moisia.
Vielä täytyy muuttaa onionin settings.yml
. Osa tiedoista tulee docker-compose.yml
:stä, mutta kannattaa ne asetuksiinkin laittaa. Joten oikeat tiedot paikoilleen.
Oikeastaan kaksi asiaa täytyy muistaa: ota rate limiter pois päältä, jos se on käytössä, äläkä pakota liikennettä https:ään. Ja vaihda secret, jos ja kun muutit sen.
Lopuksi tarvitaan
docker compose pull
docker compose down
docker compose up -d --build
Tuo ei mene läpi. Jos muutat olevaa setupia, niin saat ilmoituksen orvosta servicestä, ja portti kerrotaan varatuksi. Sen portin varaa juurikin se orpo.
En laittanut tarvittavaa lippua esimerkkiin, koska en muista sitä. Mutta se kerrotaan virheessä ja on jotain --remove-orphan
kaltaista. Joten sammuta kaikki docker compose down
, lisää se puuttuva lippu komentoon docker compose up -d --remove-orphan
tms ja tee sen avulla uusi käynnistys.
Nginxin vhost onionille
Nyt on tor sekä docker-puoli käynnissä – tai ainakin minulla oli. Mutta Nginx puuttuu vielä.
On hieman makuasia tekeekö uuden vhostin vai käyttääkö vanhaa, mutta koska minä haluan, että samanlaiset asiat ovat samassa paikassa, niin laitoin samaan missä on webin haku.eksis.eu
.
Lisää tämä:
server {
listen 127.0.0.1:8887;
server_name metahaku5ihva54436zba6m7ylypw46dzbtqfcvgugz3wzlfc6wkemad.onion;
access_log /var/log/nginx/searxng_onion.access.log main;
error_log /var/log/nginx/searxng_onion_error.log;
location ^~ /static/ {
add_header Cache-Control "public, max-age=31536000, immutable";
# Varsinainen upstream
proxy_pass http://127.0.0.1:8889;
proxy_http_version 1.1;
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;
proxy_read_timeout 30s;
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
}
# Sama proxy-määritys kuin clearnetissä
location / {
gunzip on;
proxy_set_header Accept-Encoding "gzip"; # sub_filter ei osaa br:ää
sub_filter_once off;
# meta
sub_filter '<meta name="description" content="SearXNG — a privacy-respecting, open metasearch engine">' '<meta name="description" content=EksisXNG - yksityisyyttä kunnioittava avoin metahakukone">';
sub_filter '<meta name="keywords" content="SearXNG, search, search engine, metasearch, meta search">' '<meta name="keywords" content="SearXNG, haku, hakukone, metahaku, metahakukone">';
# Custom CSS
sub_filter '</head>' '<link rel="stylesheet" href="/static/custom/css/custom.css" type="text/css" media="screen"></head>';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8889; # searxng_onion host-port
proxy_read_timeout 30s;
}
}
Muutat tietenkin hostin (joka ei ole onionissa oleellinen, mutta informatiivinen) ja portit (jotka on oltava oikein) niihin mitä käytät.
Jos haluat auttaa tor-selainta siirtymään onion-hostiin, niin lisää tämän kaltainen location /
osaan:
add_header Onion-Location http://metahaku5ihva54436zba6m7ylypw46dzbtqfcvgugz3wzlfc6wkemad.onion$request_uri always;
Nginxin uudelleenkäynnistystä ollaan vielä vailla ja sen jälkeen testaamaan.
Webin pitäisi toimia urlilla
https://haku.eksis.eu (kunhan olet asentanut myös web-version
Jos kokeilet tor-selaimella, niin sen pitäisi kääntää suoraan, tai ainakin esittää onion-badge, tänne:
http://metahaku5ihva54436zba6m7ylypw46dzbtqfcvgugz3wzlfc6wkemad.onion
access.log
Tor-porukka eivät pidä logeista. Sitten kannattaa mennä sellaiseen, joka ei logita ei edes syslogia. Minun instanssini logittaa niin kauan kun minä joudun ylläpitämään serveriä ja yksinäni vajavaisilla taidollani korjaamaan vikoja.
Mutta jotta ymmärrettäisiin mistä on kyse, niin tässä on GET-metodilla tehty haku iPadin Onion Browserilla:
127.0.0.1 - - [08/Oct/2025:17:23:14 +0300] "GET /search?q=tor+onion+privacy&category_general=1&language=auto&time_range=&safesearch=0&theme=simple HTTP/1.1" 200 29926 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15"
User agent on asetuksissa vaihdettu esitettyyn.
Ja tämä on samalta sohvalta samalla hakusanoilla, mutta Safarilla:
85.76.32.32 FI - [08/Oct/2025:17:28:44 +0300] "GET https://haku.eksis.eu/search?q=tor+onion+privacy&category_general=1&language=auto&time_range=&safesearch=0&theme=simple HTTP/2.0" 200 31772 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0.1 Safari/605.1.15"
Ero tulee IP:stä. Edes user agent ei ole sellainen (paitsi että en tiedä mistä sen saa Safarissa edes vaihdettu).
Tiedän edelleenkin, että jossain sortohallituksen maassa, jossa tehdään kattavaa nettivalvontaa, niin päiväys ja kellonaika saattaa olla raskauttavaa. Enkä edes tiedä mitä kaikkea syslog ja muut kirjaavat. Mutta pointtini on, että täällä ja tässä ajassa, minä en uhraa sekuntiakaan aikaa siihen, että piilotaan localhostilta näyttävän liikenteen, jossa käytetty laite väittää olevansa päivityksistä tipahtanut Apple.
Mutta sitä väitän, että jos ette halua juoruta jokaikisen serverin ylläpitäjälle IP:tä, joka ei kylläkään kerro kotiosoitetta tällä maailmankolkalla, liittymänne operaattoria ja mikä on laitteenne, niin käyttäkää edes VPN:ää IP:n piilottamiseen
Keskustele foorumilla Katiskan foorumi