SSD Nodes Learn RAM 8GB — $66/tahun
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-01

Cara Hos Sendiri SearXNG dengan Docker Compose

Bina enjin carian peribadi SearXNG pada VPS menggunakan Docker Compose, settings.yml, limiter, nginx dengan TLS dan API JSON untuk skrip anda.

Perkara yang anda bina

Mengehos sendiri SearXNG memberikan anda enjin carian peribadi yang berjalan pada pelayan anda sendiri. SearXNG ialah enjin metacarian: ia menerima pertanyaan anda, menghantarnya kepada enjin lain seperti Google, Bing, DuckDuckGo dan Wikipedia, kemudian menggabungkan hasil yang diterima ke dalam satu halaman hasil. Tiada profil dibina dan tiada kuki penjejakan ditetapkan kerana satu-satunya mesin yang menyimpan pertanyaan anda ialah mesin milik anda.

Tindanan ini kecil. Dua bekas, satu fail tetapan dan satu proksi terbalik. Keputusan sebenar ialah sama ada tika itu bersifat peribadi, iaitu hanya anda dan skrip anda sendiri boleh mengaksesnya, atau bersifat awam, iaitu sesiapa sahaja di internet boleh membuat pertanyaan kepadanya. Pilihan itu mengubah tetapan keselamatan, jadi buat keputusan sebelum menaip apa-apa. Jawapan lalai ialah peribadi.

Terdapat satu lagi sebab untuk menjalankannya. Satu tika SearXNG menggunakan JSON, jadi mana-mana skrip atau ejen AI yang anda tulis akan mendapat API carian milik anda sendiri, tanpa kunci, caj bagi setiap pertanyaan atau e-mel kuota.

Pasang SearXNG dengan Docker Compose

Projek ini menerbitkan imej kontena dan fail Compose. Tarik kedua-duanya ke pelayan Ubuntu 24.04 baharu yang sudah mempunyai Docker Engine dan pemalam Compose. Jika Docker masih baharu bagi anda, mulakan dengan Asas Docker Compose pada VPS dan kembali ke sini.

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

Fail Compose mentakrifkan dua perkhidmatan. core ialah SearXNG, manakala valkey ialah stor data dalam memori yang digunakan untuk mengehadkan kadar dan menyimpan keadaan sementara. Fail ini melekapkan ./core-config/ pada /etc/searxng/ di dalam kontena. Oleh itu, semua konfigurasi anda berada dalam satu direktori itu pada hos.

Sekarang edit .env. Setiap baris dalam contoh yang disertakan dijadikan ulasan. Sebab itu kontena bermula pada port 8080 pada semua alamat. Nyahkomen dan tetapkan tiga baris ini.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 ialah tetapan yang penting. Tetapan ini menjadikan port yang diterbitkan 127.0.0.1:8080:8080 dan bukannya [::]:8080:8080. Oleh itu, kontena hanya menjawab pada alamat gelung balik dan internet tidak dapat mencapainya secara terus. Jika anda melangkau tetapan ini, kontena terdedah sebaik sahaja bermula kerana port Docker yang diterbitkan disisipkan sebelum peraturan tembok api anda. Baca perangkap ini dengan teliti: port Docker yang diterbitkan memintas ufw.

SEARXNG_VERSION=latest sesuai semasa anda masih belajar. Pada pelayan yang penting, tetapkan tag secara khusus. Pada Julai 2026, tag keluaran berasaskan tarikh dan kelihatan seperti 2026.3.25-541c6c3cb. Oleh itu, penggunaan yang dikunci versinya dinaik taraf apabila anda memutuskannya, bukan apabila registri berubah tanpa pengetahuan anda.

settings.yml: bahagian yang penting

Cipta core-config/settings.yml sebelum permulaan pertama. use_default_settings: true mengarahkan SearXNG memuatkan nilai lalai yang disertakan bersamanya, kemudian menggunakan hanya kunci yang anda tulis. Oleh itu, fail anda kekal ringkas dan terus berfungsi selepas naik taraf yang menambah pilihan baharu.

Jana rahsia itu terlebih dahulu kerana nilainya akan dimasukkan terus ke dalam fail.

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 menandatangani data sesi dan token. Nilai lalai yang disertakan ialah rentetan literal ultrasecretkey. Jika nilai itu dikekalkan, sesiapa yang mengetahui nilai lalai tersebut boleh memalsukan token itu. Gantikannya sekali sahaja, kemudian jangan ubah lagi: perubahan selepas itu akan memadamkan semua pilihan yang disimpan.

base_url mestilah alamat HTTPS awam dengan garis condong di hujung. SearXNG menggunakan alamat ini dalam pautan yang dijananya. Jika alamat itu dibiarkan menunjuk ke localhost, pautan "halaman seterusnya" dalam pelayar jauh akan menunjuk ke mesin pembaca sendiri dan gagal.

formats menentukan jenis output yang akan dihasilkan oleh endpoint web. json tiada dalam senarai lalai. Oleh itu, permintaan JSON akan mengembalikan 403 sehingga anda menambahnya. image_proxy: true menghalakan lakaran kecil hasil melalui pelayan anda. Dengan itu, laman yang mengehos imej tersebut tidak akan melihat alamat pelawat anda.

valkey.url menggunakan nama hos valkey kerana itu ialah nama perkhidmatan dalam fail Compose. Compose meletakkan kedua-dua kontena pada satu rangkaian, dan nama perkhidmatan boleh diselesaikan pada rangkaian tersebut. Jika anda menghalakannya ke localhost, pembatas kadar gagal kerana localhost dalam kontena core merujuk kepada kontena itu sendiri.

Rahsia tersebut berada dalam fail biasa. Oleh itu, lindungi direktori yang mengandungi fail itu, bukan fail tersebut sahaja. chmod 750 /opt/searxng menghalang pengguna hos lain daripada mengaksesnya. Jangan ketatkan core-config/settings.yml kepada mod 600: kontena berjalan sebagai pengguna tanpa keistimewaan sendiri. Jika pengguna itu tidak dapat membaca fail, SearXNG tidak akan bermula.

Mulakan tindanan dan semak keadaannya.

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

docker compose ps sepatutnya memaparkan kedua-dua kontena dalam keadaan running. curl sepatutnya memberikan respons HTTP/1.1 200 OK. Jika tiada respons, baca docker compose logs core kerana kesilapan YAML dalam settings.yml akan dipaparkan di situ sebagai ralat penghuraian yang menyatakan nombor baris.

Letakkan di belakang nginx dengan TLS

Bekas hanya mendengar pada loopback, jadi nginx membolehkannya dicapai. nginx juga menambahkan keselamatan lapisan pengangkutan (TLS). Tulis /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 mencetak syntax is ok dan test is successful sebelum anda memuat semula. Certbot menulis semula fail yang sama untuk mendengar pada 443 dengan sijil dan menambahkan pengalihan daripada port 80. Rekod DNS untuk search.example.com mestilah sudah menghala ke pelayan ini kerana pihak berkuasa sijil membuktikan pemilikan dengan mengambil fail melalui HTTP. Panduan lengkap, termasuk pembaharuan, tersedia dalam panduan Certbot dan nginx untuk Ubuntu 24.04.

Dua pengepala pemajuan itu bukan sekadar hiasan. Tanpa X-Forwarded-For dan X-Real-IP, setiap permintaan yang tiba di SearXNG membawa alamat proksi. Oleh itu, pengehad kadar menganggap seorang klien menjana semua trafik dan tidak dapat membezakan pelawat.

Mengapa skrip dan ejen memerlukan API carian JSON

Dengan json dalam formats, titik akhir yang sama yang memaparkan halaman turut mengembalikan data berstruktur.

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

Anda menerima objek dengan tatasusunan results. Setiap entri mengandungi url, title, content dan enjin yang membekalkannya, bersama-sama answers, infoboxes dan suggestions. Maklumat ini mencukupi untuk disalurkan kepada peringkas, penyemak pautan atau gelung penyelidikan.

Hal ini penting untuk sebarang sistem yang melibatkan ejen. Model bahasa mempunyai had masa data latihan, jadi model memerlukan carian langsung untuk menjawab soalan tentang keadaan semasa. API carian komersial pula mengenakan caj bagi setiap pertanyaan dan mengehadkan kadar dengan ketat. Instance tempatan hanya menggunakan satu container pada pelayan yang telah anda bayar, dan pertanyaan tidak pernah meninggalkan pelayan tersebut. Jika anda menyambungkan alat kepada model, alasan yang sama terpakai untuk menjalankan pelayan MCP pada VPS, kerana alat carian biasanya merupakan alat pertama yang ditambahkan.

Ikuti dua peraturan untuk penggunaan API. Pastikan instance itu persendirian. Ikat bahagian API pada alamat loopback atau rangkaian persendirian, dan benarkan hanya hos anda sendiri mencapainya. Kemudian, hantar pertanyaan secara berhemah. SearXNG memajukan permintaan anda kepada enjin carian sebenar. Oleh itu, skrip yang menjalankan seratus pertanyaan sesaat boleh menyebabkan Google menyekat pelayan anda.

Penghad dan perkara yang berubah untuk tikaian awam

Penghad ialah pertahanan bot SearXNG. Ia memantau pengepala permintaan, alamat dan kadar permintaan, kemudian menggugurkan trafik yang kelihatan dijana secara automatik. Penghad memerlukan Valkey untuk menyimpan keadaan tersebut. Sebab itu fail Compose menyertakannya.

Pada tikaian persendirian, kekalkan limiter: false. Skrip anda sendiri sememangnya trafik automatik. Oleh itu, penghad akan menyekat panggilan JSON yang menjadi tujuan anda membina tikaian tersebut. Kawalan akses ialah tugas proksi terbalik: pasangan allow dan deny dalam location nginx, pengesahan asas HTTP, atau tembok api yang hanya membenarkan pelayan anda yang lain.

Jika anda menerbitkan tikaian tersebut untuk orang lain, hidupkan kedua-dua suis.

server:
  limiter: true
  public_instance: true

Kawalan yang lebih terperinci terdapat dalam core-config/limiter.toml, yang dibaca oleh bekas daripada /etc/searxng/limiter.toml. Tulis hanya kekunci yang ingin diubah. Di sebalik proksi, anda mesti mengisytiharkan proksi tersebut. Jika tidak, penghad menganggap alamat nginx anda sebagai klien yang menyalahgunakan perkhidmatan.

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

[botdetection.ip_limit]
link_token = true

link_token = true menyebabkan SearXNG mengeluarkan token yang hanya akan diambil oleh sesi pelayar sebenar. Ini menghentikan kebanyakan pengikis mudah. Jangkakan tikaian awam akan menarik pengikis tersebut dalam tempoh beberapa hari. Jangkakan ralat enjin juga, kerana semakin banyak trafik yang anda teruskan, semakin cepat enjin huluan mula mengembalikan CAPTCHA kepada alamat pelayan anda. Tikaian SearXNG awam memerlukan pengurusan berterusan. Tikaian persendirian tidak memerlukannya. Sebab itu ia terdapat dalam kebanyakan senarai pendek perkara yang wajar dihoskan sendiri pada 2026.

Mengapa carian tidak mengembalikan hasil

Buka /stats pada instance anda. Fail ini menyenaraikan setiap enjin bersama kadar ralat dan masa tindak balasnya. Fail ini ialah tempat pertama untuk diperiksa apabila hasil carian terlalu sedikit.

Enjin yang memaparkan ralat "Access denied" atau "CAPTCHA" telah menyekat alamat pelayan anda. Keadaan ini biasa berlaku pada alamat dalam julat pusat data kerana enjin carian menganggap alamat tersebut milik pengikis. SearXNG kemudian menggantung enjin yang gagal buat sementara waktu dan bukannya mencubanya semula. Oleh itu, enjin yang disekat boleh terkeluar daripada hasil carian tanpa disedari. Nyahdayakannya dalam settings.yml atau terima kehilangan tersebut. Enjin yang selebihnya masih memberikan respons.

Jika semua enjin gagal serentak, container tidak mempunyai resolusi nama keluar yang berfungsi atau tiada laluan ke internet. Uji keadaan ini dari dalam container.

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

FAQ

Adakah SearXNG menjadikan carian saya tanpa nama?

SearXNG menyembunyikan identiti anda daripada enjin yang ditanyakannya kerana enjin tersebut melihat pelayan anda membuat permintaan, bukannya pelayar anda. SearXNG tidak menyembunyikan pertanyaan itu daripada pelayan anda dan tidak menyembunyikan pelayan anda daripada enjin tersebut. Pada tika satu pengguna, semua trafik daripada alamat itu datang daripada anda, jadi alamat itu sendiri menjadi pengecam. Trafik antara pelayar anda dengan tika anda dilindungi oleh sijil TLS.

Mengapakah permintaan JSON mengembalikan 403 Forbidden?

Terdapat 2 punca, dan kedua-duanya berkaitan dengan konfigurasi. Sama ada json tiada dalam senarai formats di bawah search: dalam settings.yml, yang merupakan keadaan lalai, atau pembatas telah diaktifkan dan mengelaskan skrip anda sebagai bot. Tambahkan format itu dahulu, mulakan semula dengan docker compose restart core, kemudian cuba lagi. Jika masih gagal, tetapkan limiter: false dan kawal akses pada proksi songsang.

Adakah saya memerlukan kontena Valkey jika saya membiarkan pembatas dimatikan?

Biarkan kontena itu terus berjalan. SearXNG boleh berfungsi tanpanya, tetapi pembatas tidak boleh diaktifkan kemudian tanpanya, dan kontena itu juga menyimpan keadaan jangka pendek yang lain. Kontena itu kecil dan hanya menyimpan data cache, jadi membuangnya menjimatkan sedikit sahaja dan menyebabkan anda kehilangan pilihan tersebut.

Bagaimanakah saya mengemas kini SearXNG?

Jalankan docker compose pull kemudian docker compose up -d dalam /opt/searxng. Compose mencipta semula mana-mana kontena yang imejnya berubah dan membiarkan direktori core-config/ anda tanpa perubahan, jadi settings.yml kekal. Oleh sebab use_default_settings: true menggabungkan kunci anda dengan nilai lalai yang disertakan, pilihan yang ditambahkan oleh pihak upstream akan tersedia dengan nilai yang munasabah tanpa merosakkan fail tersebut.

Bolehkah beberapa orang berkongsi satu tika?

Ya. Keadaan ini ialah apabila anda mengaktifkan pembatas dan menetapkan public_instance: true. Keutamaan disimpan dalam pelayar setiap pelawat, jadi tiada akaun yang perlu diurus. Pantau /stats selama seminggu selepas membukanya kerana enjin upstream mula menolak pelayan anda jauh sebelum anda menyedari bahawa hasil carian berkurangan.

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