SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor

SearXNG Docker ile Kendi Arama Motorunuzu Kurma

SearXNG meta arama motorunu Docker Compose kullanarak kendi VPS sunucunuzda barındırın. settings.yml yapılandırması, nginx TLS kurulumu ve JSON API kullanımı hakkında detaylı rehber.

Ne inşa ediyorsunuz

SearXNG'yi kendi sunucunuzda barındırmak, kendi sunucunuz üzerinde çalışan özel bir arama motoruna sahip olmanızı sağlar. SearXNG bir meta arama motorudur: sorgunuzu alır, Google, Bing, DuckDuckGo ve Wikipedia gibi diğer arama motorlarına iletir ve ardından gelen sonuçları tek bir sayfada birleştirir. Sorgunuzu saklayan tek makine sizin makineniz olduğu için hiçbir profil oluşturulmaz ve hiçbir takip çerezi yerleştirilmez. Eğer sadece Searx olarak adlandırılan eski kılavuzlara denk geldiyseniz, bu proje o projenin çatallanmış (fork) halidir. O proje, kendi deposunun Searx'in artık bakımının yapılmadığını duyurduğu Eylül 2023'ten beri güncellenmemektedir; Mayıs 2026'daki bir dokümantasyon notu içeren tek bir commit ise bu durumu değiştirmemiştir. Bu nedenle birini takip etmeden önce her ikisinin durumunu kontrol edin.

Kullanılan yığın küçüktür. İki container, bir ayar dosyası ve bir reverse proxy. Her self-hosted servis için geçerli olmayan bir şekilde, küçük bir VPS üzerinde rahatlıkla çalışabilir: PhotoPrism ile Immich karşılaştırmasında ele alınan fotoğraf kütüphaneleri, RAM tabanlarını web uygulamasından ziyade indeksleyiciye göre belirler. Asıl karar, örneğin özel mi (yani sadece siz ve kendi betikleriniz erişebilir) yoksa halka açık mı (yani internetteki herkes sorgu yapabilir) olacağıdır. Bu seçim güvenlik ayarlarını değiştireceğinden, herhangi bir komut yazmadan önce kararınızı verin. Varsayılan yanıt özeldir.

Bunu çalıştırmak için ikinci bir neden daha vardır. Bir SearXNG örneği JSON ile iletişim kurar; bu sayede yazdığınız herhangi bir betik veya yapay zeka ajanı, anahtar gerektirmeyen, sorgu başına ücretlendirilmeyen ve kota uyarısı içermeyen, size ait bir arama API'sine sahip olur.

Docker Compose ile SearXNG kurulumu

Proje bir container imajı ve bir Compose dosyası yayınlamaktadır. Her ikisini de Docker Engine ve Compose eklentisi halihazırda kurulu olan temiz bir Ubuntu 24.04 sunucusuna çekin. Docker sizin için yeniyse, VPS üzerinde Docker Compose temelleri ile başlayıp geri dönün.

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

Compose dosyası iki servis tanımlar. core SearXNG'nin kendisidir, valkey ise hız sınırlaması ve kısa süreli durum bilgisi için kullanılan bellek içi bir veri deposudur. ./core-config/ dizinini container içinde /etc/searxng/ konumuna bağlar, böylece yapılandırdığınız her şey ana makinedeki bu tek dizinde barınır.

Şimdi .env dosyasını düzenleyin. Gönderilen örnekteki her satır yorum satırı halindedir; bu nedenle container her adreste 8080 numaralı portta başlar. Yorum işaretlerini kaldırın ve şu üç ayarı yapılandırın.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 önemli olan ayardır. Yayınlanan portu 8080:8080 yerine 127.0.0.1:8080:8080 yapar; Docker bunu her adreste yayınladığı için container yalnızca loopback adresi üzerinden yanıt verir ve internet doğrudan erişemez. Bunu atlarsanız, yayınlanan bir Docker portu güvenlik duvarı kurallarınızın önüne eklendiği için container başladığı anda dış dünyaya açılır. Bu tuzağı bütünüyle okumakta fayda var: yayınlanan Docker portları ufw'yi atlar.

SEARXNG_VERSION=latest öğrenme aşamasında sorun yaratmaz. Önem verdiğiniz bir sunucuda ise etiketi sabitleyin. Ekim 2026 itibarıyla sürüm etiketleri tarih bazlıdır ve 2026.10.4-d48c4b555 gibi görünür; böylece sabitlenmiş bir dağıtım, kayıt defteri değiştiğinde değil, siz karar verdiğinizde güncellenir. Aynı disiplin, sunucudaki diğer uzun ömürlü servisler için de geçerlidir; bu yüzden kendi kendine barındırılan RustDesk relay servisi de imaj etiketlerini sabitler: uzak erişim servisine yapılan denetimsiz bir güncelleme, en kötü anda kendini belli eder.

settings.yml: önemli kısımlar

İlk başlatmadan önce core-config/settings.yml dosyasını oluşturun. use_default_settings: true, SearXNG'ye kendi varsayılanlarını yüklemesini ve ardından yalnızca sizin yazdığınız anahtarları uygulamasını söyler; böylece dosyanız kısa kalır ve yeni seçenekler ekleyen yükseltmelerden etkilenmez.

Değer doğrudan dosyaya yazılacağı için önce secret değerini oluşturun.

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, oturum ve token verilerini imzalar. Gönderilen varsayılan değer ultrasecretkey dizgisidir; bunu olduğu gibi bırakmak, bu varsayılanı bilen herkesin token'ları taklit edebileceği anlamına gelir. Bir kez değiştirin ve bir daha dokunmayın: daha sonra değiştirmek, kaydedilmiş tüm tercihlerin silinmesine neden olur.

base_url, sonunda eğik çizgi (/) bulunan genel HTTPS adresi olmalıdır. Bu, SearXNG'nin oluşturduğu bağlantıların içine yazdığı adrestir. Bunu localhost olarak bırakırsanız, uzak bir tarayıcıdaki "sonraki sayfa" bağlantısı okuyucunun kendi makinesini işaret eder ve başarısız olur.

formats, web uç noktasının hangi çıktı türlerini üreteceğine karar verir. json varsayılan listede yoktur, bu nedenle siz ekleyene kadar JSON isteği 403 hatası döndürür. image_proxy: true, sonuç küçük resimlerini sunucunuz üzerinden yönlendirir; böylece bu resimleri barındıran siteler ziyaretçilerinizin adreslerini asla görmez.

valkey.url, valkey ana bilgisayar adını kullanır çünkü bu, Compose dosyasındaki servis adıdır ve Compose her iki container'ı da servis adlarının çözümlenebildiği tek bir ağa yerleştirir. Bunu localhost olarak işaretlerseniz sınırlayıcı başarısız olur, çünkü core container'ı içinde localhost o container'ın kendisidir.

Secret düz bir dosyada durur, bu yüzden çevresindeki dizini de koruyun. chmod 750 /opt/searxng, diğer ana bilgisayar kullanıcılarını dışarıda tutar. Ayrıca core-config/settings.yml dosyasını hiçbir şeyi bozmadan 600 moduna getirebilirsiniz: resmi container'ın giriş noktası root olarak başlar ve FORCE_OWNERSHIP varsayılan true değerinde bırakıldığında, SearXNG başlamadan önce mount edilen yapılandırma dizinini container'ın kendi searxng kullanıcısına devreder, böylece dosya onun tarafından okunabilir kalır. Yan etki ana bilgisayarda görülür: bu adım core-config/ dosyasının sahibini container'ın kullanıcı kimliğine dönüştürür, bu nedenle dosyayı daha sonra sudo ile düzenlemeyi bekleyin.

Stack'i başlatın ve kontrol edin.

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

docker compose ps, her iki container'ı da running durumunda göstermelidir. curl, HTTP/1.1 200 OK yanıtını vermelidir. Eğer hiçbir yanıt vermezse docker compose logs core dosyasını okuyun, çünkü settings.yml içindeki bir YAML hatası orada satırı belirten bir ayrıştırma hatası (parse error) olarak görünür.

Nginx arkasına TLS ile yerleştirme

Container yalnızca loopback üzerinde dinleme yaptığı için erişilebilirliği sağlayan ve taşıma katmanı güvenliğini (TLS) ekleyen Nginx'tir. /etc/nginx/sites-available/searxng dosyasını oluşturun.

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 komutu, yeniden yükleme yapmadan önce syntax is ok ve test is successful çıktılarını verir. Certbot, aynı dosyayı bir sertifika ile 443 numaralı portu dinleyecek şekilde yeniden yazar ve 80 numaralı porttan yönlendirme ekler. search.example.com için DNS kaydı halihazırda bu sunucuyu işaret ediyor olmalıdır; çünkü sertifika yetkilisi, sahipliği HTTP üzerinden bir dosya çekerek doğrular. Yenileme süreci de dahil olmak üzere tam kılavuz Ubuntu 24.04 için Certbot ve Nginx rehberi içerisinde yer almaktadır.

İki yönlendirme başlığı süsleme amaçlı değildir. X-Forwarded-For ve X-Real-IP olmadan, SearXNG'ye ulaşan her istek proxy adresini taşır; bu durumda hız sınırlayıcı (rate limiter), tüm trafiğin tek bir istemciden geldiğini görür ve ziyaretçileri birbirinden ayırt edemez.

Betiklerin ve aracıların neden JSON arama API'sine ihtiyaç duyduğu

json içindeki formats ile, sayfayı oluşturan uç nokta aynı zamanda yapılandırılmış veri döndürür.

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

Her bir girdinin url, title, content ve onu sağlayan motorun yanı sıra answers, infoboxes ve suggestions bilgilerini taşıdığı bir results dizisine sahip bir nesne alırsınız. Bu, bir özetleyiciyi, bağlantı denetleyicisini veya araştırma döngüsünü beslemek için yeterlidir. Bu sonuçları bir dil modeline aktarmak, göründüğünden daha büyük bir adımdır; çünkü arama sonuçları, kendi talimatlarını taşıyabilen güvenilmeyen metinlerdir. Bir yapay zeka aracısını SearXNG örneğinize yönlendirme konusu bunu ayrıntılı olarak ele alır.

Bu durum, aracı biçimindeki her şey için önemlidir. Bir dil modelinin eğitim kesim tarihi vardır, bu nedenle güncel soruları yanıtlamak için canlı aramaya ihtiyaç duyar; ticari arama API'leri ise sorgu başına ücret alır ve katı hız sınırları uygular. Yerel bir örnek, halihazırda ödemesini yaptığınız bir sunucudaki tek bir container maliyetine sahiptir ve sorgular sunucudan asla dışarı çıkmaz. Eğer bir modele araçlar bağlıyorsanız, aynı mantık bir VPS üzerinde MCP sunucuları çalıştırma sürecini yönlendirir; burada bir arama aracı, insanların genellikle eklediği ilk araçtır.

API kullanımı için iki kural vardır. Örneği gizli tutun; bu nedenle API tarafını loopback adresine veya özel bir ağa bağlayın ve yalnızca kendi ana bilgisayarlarınızın erişmesine izin verin. Bu, kendi kendine barındırılan bir konum izleyicinin, telefonunuzun konumunu bildirdiği uç nokta için ihtiyaç duyduğu işlemle aynıdır. Ardından sorguları nazikçe yapın. SearXNG, isteğinizi gerçek arama motorlarına iletir; bu nedenle saniyede yüz sorgu çalıştıran bir betik, Google'dan sunucunuzu engellemesini istemek anlamına gelir.

Sınırlayıcı ve herkese açık bir örnek için değişenler

Sınırlayıcı, SearXNG'nin bot savunma mekanizmasıdır. İstek başlıklarını, adresleri ve istek oranlarını izler; otomatik olduğu anlaşılan trafiği reddeder. Bu durum bilgisini tutmak için Valkey'e ihtiyaç duyar, Compose dosyasının onu içerme nedeni budur.

Özel bir örnekte limiter: false ayarını koruyun. Kendi betikleriniz tanım gereği otomatik trafik oluşturur; bu nedenle sınırlayıcı, örneği tam olarak bu JSON çağrıları için kurmuş olmanıza rağmen onları engelleyecektir. Erişim kontrolü bunun yerine reverse proxy'nin görevidir: nginx location dosyasında bir allow ve deny çifti, HTTP temel kimlik doğrulaması veya yalnızca diğer sunucularınıza izin veren bir güvenlik duvarı kullanın. Özel bir örneğe ağlar arasında gezinen bir dizüstü bilgisayardan erişmeniz gerekiyorsa, önüne bir v3 onion adresi koymak dördüncü bir seçenektir; çünkü tor, internete yeni bir şey açmadan aynı loopback portuna bağlanır.

Örneği başkalarının kullanımına açacaksanız, her iki anahtarı da etkinleştirin.

server:
  limiter: true
  public_instance: true

Daha hassas kontrol, container tarafından /etc/searxng/limiter.toml konumunda okunan core-config/limiter.toml dosyasında yer alır. Yalnızca değiştirmek istediğiniz anahtarları yazın. Bir proxy arkasındaysanız, proxy'yi tanımlamanız gerekir; aksi takdirde sınırlayıcı, nginx adresinizi tek bir kötü niyetli istemci olarak algılar.

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

[botdetection.ip_limit]
link_token = true

link_token = true, SearXNG'nin yalnızca gerçek bir tarayıcı oturumunun alabileceği bir token yayınlamasını sağlar; bu da çoğu basit kazıyıcıyı durdurur. Herkese açık bir örneğin birkaç gün içinde bu tür botları çekeceğini öngörmelisiniz. Motor hataları da bekleyin; çünkü ne kadar çok trafik yönlendirirseniz, yukarı akış motorları sunucu adresinize o kadar çabuk CAPTCHA döndürmeye başlar. Herkese açık bir SearXNG örneği sürekli bakım gerektiren bir iştir. Özel bir örnek ise böyle değildir; bu yüzden 2026 yılında kendi kendine barındırmaya değer şeyler listelerinin çoğunda yer alır. Bu listelerdeki her girdi altyapı ile ilgili değildir: Jellyfin kütüphanesini 90'ların gezilebilir bir video kiralama dükkanı gibi yeniden oluşturmak, aynı nginx bloğunun arkasındaki aynı container ile yapılır ve bir iş akışından ziyade keyifli bir akşama odaklanır.

Aramalar neden sonuç döndürmüyor

Örneğiniz üzerinde /stats dosyasını açın. Bu dosya, hata oranı ve yanıt süresiyle birlikte her motoru listeler; sonuçların yetersiz olduğunu düşündüğünüzde bakmanız gereken ilk yer burasıdır.

"Access denied" veya "CAPTCHA" hataları gösteren bir motor, sunucu adresinizi engellemiş demektir. Arama motorları veri merkezi aralıklarındaki adreslerin botlar tarafından kullanıldığını varsaydığı için bu durum yaygındır. SearXNG, başarısız olan motoru yeniden denemek yerine belirli bir süre askıya alır; bu nedenle engellenen bir motor sessizce sonuçlarınızdan çıkar. Motoru settings.yml üzerinden devre dışı bırakın veya bu kaybı kabul edin. Bunlar tek seçenek değildir, çünkü bazı CAPTCHA engellerinin yeniden başlatma sonrasında da geçerliliğini koruyan bir çözümü vardır. Geriye kalan motorlar yanıt vermeye devam eder. 429 hatası belirsiz bir durumdur; çünkü bu hata kendi sınırlayıcınızdan veya sunucunuzu reddeden bir üst motor kaynağından gelebilir. Ayarları değiştirmeye başlamadan önce log satırı size bu iki durumdan hangisiyle karşı karşıya olduğunuzu söyler.

Tüm motorlar aynı anda başarısız oluyorsa, container dışa dönük çalışan bir isim çözümlemesine veya internete giden bir rotaya sahip değildir. Bunu container içinden test edin.

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

Sistemdeki hiçbir şey bu kontrolün ne zaman başarısız olmaya başladığını size bildirmez. Bu nedenle testi cron üzerinden çalıştırın ve sonuçların azaldığını fark etmeyi beklemeden, bir hata durumunda kendi ntfy sunucunuz üzerinden telefonunuza bir uyarı gönderilmesini sağlayın.

FAQ

SearXNG aramalarımı anonim hale getirir mi?

Sorgu gönderdiği arama motorlarından kimliğinizi gizler; çünkü bu motorlar tarayıcınız yerine sunucunuzun istek yaptığını görür. Sorguyu sunucunuzdan gizlemez ve sunucunuzu da onlardan gizlemez. Tek kullanıcılı bir örnekte, o adresten gelen tüm trafik size aittir; dolayısıyla adresin kendisi tanımlayıcı haline gelir. Tarayıcınız ile örneğiniz arasındaki trafik, TLS sertifikası ile korunur. ISS'nize, herkese açık bir örneğin operatörüne ve arama motorlarının kendisine karşı durumunuzun ne olduğu, SearXNG'nin aslında neyi gizlediği bölümünde açıklanmıştır.

JSON isteği neden 403 Forbidden hatası döndürüyor?

İki nedeni vardır ve her ikisi de yapılandırma ile ilgilidir. Ya json, settings.yml içindeki search: altında bulunan formats listesinde eksiktir (varsayılan durum budur) ya da sınırlayıcı (limiter) açıktır ve betiğinizi bot olarak sınıflandırmıştır. Önce formatı ekleyin, docker compose restart core ile yeniden başlatın ve tekrar deneyin. Hata devam ederse, limiter: false ayarını yapın ve erişimi reverse proxy üzerinden kontrol edin.

Sınırlayıcıyı kapalı tutarsam Valkey container'ına ihtiyacım var mı?

Çalışır durumda bırakın. SearXNG onsuz çalışır ancak sınırlayıcı daha sonra onsuz açılamaz; ayrıca kısa ömürlü diğer durum bilgilerini de tutar. Container küçüktür ve yalnızca önbelleğe alınmış verileri saklar; bu nedenle onu kaldırmak çok az yer kazandırır ancak seçeneklerinizi kısıtlar.

SearXNG'yi nasıl güncellerim?

/opt/searxng dizininde önce docker compose pull, ardından docker compose up -d komutlarını çalıştırın. Compose, imajı değişen her container'ı yeniden oluşturur ve core-config/ dizininize dokunmaz; bu sayede settings.yml korunur. use_default_settings: true, anahtarlarınızı varsayılan değerlerin üzerine birleştirdiği için, upstream tarafında eklenen seçenekler dosyayı bozmak yerine mantıklı değerlerle gelir.

Birden fazla kişi tek bir örneği paylaşabilir mi?

Evet, sınırlayıcıyı açıp public_instance: true ayarını yaptığınız durum budur. Tercihler her ziyaretçinin kendi tarayıcısında saklandığı için yönetilecek bir hesap yoktur. Erişime açtıktan sonra bir hafta boyunca /stats kayıtlarını izleyin; çünkü upstream arama motorları, sonuçların eksik olduğunu fark etmenizden çok önce sunucunuzu reddetmeye başlayabilir.

Bu yazı işinize yaradı mı?