SSD Nodes Learn 8GB RAM — yılda $66
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-01

SearXNG Kendi Sunucunuzda Nasıl Kurulur?

Docker Compose ile SearXNG'yi VPS üzerinde çalıştırın: settings.yml, limiter, nginx TLS ve script'lerin çağırabileceği JSON search API yapılandırmasını öğrenin.

Ne inşa ediliyor

SearXNG'yi kendi sunucunuzda barındırmak, kendi sunucunuzda çalışan özel bir arama motoru sağlar. SearXNG bir meta arama motorudur: sorgunuzu alır, Google, Bing, DuckDuckGo ve Wikipedia gibi diğer motorlara iletir, ardından dönen sonuçları tek bir sonuç sayfasında birleştirir. Profil oluşturulmaz ve izleme çerezi ayarlanmaz. Bunun nedeni, sorgunuzu saklayan tek makinenin size ait olmasıdır.

Yığın küçüktür. İki container, bir settings dosyası ve bir reverse proxy kullanılır. Asıl karar, instance'ın yalnızca sizin ve kendi script'lerinizin eriştiği private mı, yoksa internet üzerindeki herkesin sorgulayabildiği public mi olacağıdır. Bu seçim security settings'i değiştirir. Bu nedenle herhangi bir şey yazmadan önce karar verilmelidir. Varsayılan seçenek private'tır.

Bunu çalıştırmanın ikinci bir nedeni vardır. Bir SearXNG instance'ı JSON kullanır. Böylece yazılan herhangi bir script veya AI agent, key, sorgu başına ücret ve quota bildirimi olmadan sahip olunan bir search API'ye erişir.

Docker Compose ile SearXNG kurulumu

Proje bir container image ve Compose dosyası yayımlar. Bunların ikisini de Docker Engine ve Compose eklentisi yüklü olan yeni bir Ubuntu 24.04 sunucusuna indirin. Docker konusunda yeniyseniz VPS üzerinde Docker Compose temelleri ile başlayıp ardından buraya 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 ömürlü durum bilgileri 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 bulunur.

Şimdi .env dosyasını düzenleyin. Gönderilen örnekteki her satır yorum işaretiyle kapatılmıştır. Bu nedenle container her adreste 8080 portundan başlar. Aşağıdaki üç satırın yorum işaretini kaldırın ve değerlerini ayarlayın.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 en önemli ayardır. Yayımlanan portu 127.0.0.1:8080:8080 yerine [::]:8080:8080 yapar. Böylece container yalnızca loopback adresinden yanıt verir ve internet üzerinden doğrudan erişilemez. Bu ayarı atlarsanız container başlar başlamaz dışarıya açılır. Bunun nedeni, yayımlanan bir Docker portunun firewall kurallarınızdan önce uygulanmasıdır. Bu tuzağın tamamını okuyun: yayımlanan Docker portları ufw kurallarını atlar.

Öğrenme aşamasında SEARXNG_VERSION=latest kullanılabilir. Önem verdiğiniz bir sunucuda tag değerini sabitleyin. Temmuz 2026 itibarıyla release tag değerleri tarihe dayalıdır ve 2026.3.25-541c6c3cb biçimindedir. Böylece deployment, registry üzerinde değişiklik olduğunda değil, sizin karar verdiğinizde yükseltilir.

settings.yml: önemli bölümler

İlk başlatmadan önce core-config/settings.yml oluşturulmalıdır. use_default_settings: true, SearXNG'nin önce kendi yayımlanan varsayılanlarını yüklemesini, ardından yalnızca yazdığınız anahtarları uygulamasını sağlar. Böylece dosya kısa kalır ve yeni seçenekler ekleyen yükseltmelerden etkilenmez.

Önce gizli değer oluşturulmalıdır. Çünkü bu değer doğrudan dosyaya yazılır.

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. Yayımlanan varsayılan değer, tam olarak ultrasecretkey dizgesidir. Bu değer bırakılırsa varsayılanı bilen herkes bu token'ları sahte olarak oluşturabilir. Değer bir kez değiştirilip sabit bırakılmalıdır. Daha sonra değiştirilmesi, kaydedilmiş tüm tercihleri siler.

base_url, sonunda eğik çizgi bulunan genel HTTPS adresi olmalıdır. SearXNG oluşturduğu bağlantılara bu adresi yazar. Değer localhost'u göstermeye devam ederse uzak tarayıcıdaki "next page" bağlantısı okuyucunun kendi makinesini gösterir ve çalışmaz.

formats, web endpoint'inin üreteceği çıktı türlerini belirler. json varsayılan listede bulunmaz. Bu nedenle eklenene kadar JSON isteği 403 döndürür. image_proxy: true, sonuç küçük resimlerini sunucunuz üzerinden yönlendirir. Böylece bu görüntüleri barındıran siteler ziyaretçilerinizin adreslerini görmez.

valkey.url, valkey ana bilgisayar adını kullanır. Çünkü bu, Compose dosyasındaki hizmet adıdır. Compose, her iki container'ı hizmet adlarının çözümlendiği tek bir ağa yerleştirir. Değer localhost olarak ayarlanırsa sınırlayıcı çalışmaz. Bunun nedeni, core container'ının içinde localhost'un o container'ı göstermesidir.

Gizli değer düz metin içeren bir dosyada bulunur. Bu nedenle dosyanın kendisi yerine dosyanın bulunduğu dizin korunmalıdır. chmod 750 /opt/searxng, diğer host kullanıcılarının erişimini engeller. core-config/settings.yml değeri 600 kipine sıkılaştırılmamalıdır. Container, ayrıcalıksız kendi kullanıcısıyla çalışır. Bu kullanıcı dosyayı okuyamazsa SearXNG hiç başlatılamaz.

Stack başlatılıp denetlenmelidir.

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

docker compose ps, her iki container'ın da running durumunda olduğunu göstermelidir. curl, HTTP/1.1 200 OK yanıtını vermelidir. Hiçbir yanıt alınmazsa docker compose logs core okunmalıdır. Çünkü settings.yml içindeki YAML hatası burada satır numarasını belirten bir ayrıştırma hatası olarak görünür.

TLS ile nginx arkasına alın

Container yalnızca loopback üzerinde dinler. Bu nedenle erişilebilir olmasını nginx sağlar. Transport Layer Security (TLS) de nginx tarafından eklenir. /etc/nginx/sites-available/searxng yazılmalıdır.

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 yeniden yükleme işleminden önce syntax is ok ve test is successful çıktısını verir. Certbot aynı dosyayı, sertifika ile 443 portunu dinleyecek şekilde yeniden yazar ve 80 portundan yönlendirme ekler. Sertifika yetkilisi sahipliği HTTP üzerinden bir dosya getirerek doğruladığından search.example.com için DNS kaydı önceden bu sunucuyu göstermelidir. Yenileme işlemi dahil tüm adımlar Ubuntu 24.04 için Certbot ve nginx kılavuzunda açıklanmıştır.

İki yönlendirme başlığı yalnızca biçimsel değildir. X-Forwarded-For ve X-Real-IP olmadan SearXNG'ye ulaşan her istekte proxy adresi taşınır. Bu nedenle hız sınırlayıcı, tüm trafiği tek bir istemcinin oluşturduğunu görür ve ziyaretçileri birbirinden ayırt edemez.

Betikler ve aracılar neden bir JSON arama API'si ister

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

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

url, title, content ve sonucu sağlayan arama motorunu içeren bir results dizisine sahip bir nesne döner. Bu nesne ayrıca answers, infoboxes ve suggestions alanlarını da içerir. Bu veriler bir özetleyiciye, bağlantı denetleyicisine veya araştırma döngüsüne aktarım için yeterlidir.

Bu durum, aracı niteliğindeki tüm kullanımlar için önemlidir. Bir dil modelinin eğitim verisi 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ırlamaları uygular. Yerel bir örnek, zaten ücretini ödediğiniz bir sunucudaki tek bir container kadar maliyetlidir. Sorgular da sunucudan dışarı çıkmaz. Araçları bir modele bağlıyorsanız aynı yaklaşım VPS üzerinde MCP sunucularını çalıştırma için de geçerlidir. Arama aracı genellikle eklenen ilk araçtır.

API kullanımı için iki kural vardır. Örneği özel tutun. Bunun için API tarafını loopback adresine veya özel bir ağa bağlayın ve yalnızca kendi ana makinelerinizin erişmesine izin verin. Ardından sorguları düşük hızda gönderin. SearXNG isteğinizi gerçek arama motorlarına iletir. Bu nedenle saniyede yüz sorgu çalıştıran bir betik, Google'ın sunucunuzu engellemesini ister.

Sınırlayıcı ve genel kullanıma açık bir örnek için değişiklikler

Sınırlayıcı, SearXNG'nin bot savunmasıdır. İstek üst bilgilerini, adresleri ve istek hızlarını izler. Otomatik göründüğü için trafiği engeller. Durum bilgilerini tutmak için Valkey gerekir. Compose dosyasında bunun bulunma nedeni budur.

Özel bir örnekte limiter: false korunmalıdır. Kendi betikleriniz tanım gereği otomatik trafiktir. Bu nedenle sınırlayıcı, örneği kullanma amacınıza uygun olarak oluşturduğunuz JSON çağrılarını engeller. Erişim denetimi bunun yerine ters proxy'nin görevidir: nginx location dosyasındaki bir allow ve deny çifti, HTTP temel kimlik doğrulaması veya yalnızca diğer sunucularınızdan gelen bağlantılara izin veren bir güvenlik duvarı kullanılabilir.

Örneği başka kişilerin kullanımına açarsanız her iki anahtar da etkinleştirilmelidir.

server:
  limiter: true
  public_instance: true

Daha ayrıntılı denetim core-config/limiter.toml içinde yapılır. Container bu dosyayı /etc/searxng/limiter.toml konumundan okur. Yalnızca değiştirmek istediğiniz anahtarları yazın. Bir proxy arkasında çalışıyorsanız proxy bildirilmelidir. Aksi halde sınırlayıcı, nginx adresinizi kötüye kullanan tek istemci olarak değerlendirir.

[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 vermesini sağlar. Böylece basit scraper'ların çoğu durdurulur. Genel kullanıma açık bir örneğin birkaç gün içinde bu tür istemcilerin ilgisini çekmesi beklenmelidir. Motor hataları da beklenmelidir. İletilen trafik arttıkça, upstream motorların sunucu adresinize CAPTCHA döndürmeye başlaması daha erken gerçekleşir. Genel kullanıma açık bir SearXNG örneğini işletmek sürekli çalışma gerektirir. Özel bir örnek için bu geçerli değildir. Bu nedenle özel örnekler, 2026 yılında kendi sunucunuzda barındırmaya değer şeyler listelerinin çoğunda yer alır.

Aramalar neden sonuç döndürmüyor

Örneği kendi instance'ınızda açın: /stats. Bu sayfa, her motoru hata oranı ve yanıt süresiyle birlikte listeler. Sonuçlar yetersiz göründüğünde bakılması gereken ilk yer burasıdır.

"Access denied" veya "CAPTCHA" hataları gösteren bir motor, sunucunuzun adresini engellemiştir. Bu durum, veri merkezi aralıklarındaki adreslerde yaygındır. Arama motorları bu adreslerin tarayıcılara ait olduğunu varsayar. SearXNG, başarısız olan motoru yeniden denemek yerine belirli bir süre askıya alır. Böylece engellenen bir motor sonuçlardan sessizce çıkar. Motoru settings.yml içinde devre dışı bırakın veya bu kaybı kabul edin. Kalan motorlar yanıt vermeye devam eder.

Tüm motorlar aynı anda başarısız oluyorsa container içinde çalışan bir dış ad çözümlemesi veya internete giden bir rota yoktur. Testi container içinden gerçekleştirin.

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

FAQ

SearXNG aramalarımı anonim hale getirir mi?

Sorgu gönderdiği arama motorlarından kim olduğunuz gizlenir. Çünkü bu motorlar isteği tarayıcınız yerine sunucunuzun gönderdiğini görür. Ancak sorgu sunucunuzdan gizlenmez. Sunucunuz da bu motorlardan gizlenmez. Tek kullanıcılı bir örnekte, bu adresten gelen tüm trafik size aittir. Bu nedenle adresin kendisi tanımlayıcı haline gelir. Tarayıcınız ile örneğiniz arasındaki trafik TLS sertifikasıyla korunur.

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

İki neden olabilir ve ikisi de yapılandırmayla ilgilidir. Ya json, settings.yml içindeki search: altında yer alan formats listesinde eksiktir; varsayılan durum budur. Ya da sınırlayıcı etkindir ve betiğinizi bot olarak sınıflandırmıştır. Önce biçimi ekleyin. docker compose restart core ile yeniden başlatın. Ardından tekrar deneyin. Sorun devam ederse limiter: false değerini ayarlayın ve erişimi bunun yerine reverse proxy üzerinden denetleyin.

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ı, Valkey olmadan daha sonra etkinleştirilemez. Ayrıca diğer kısa ömürlü durumu da burada tutar. Container küçüktür ve yalnızca önbelleğe alınmış verileri depolar. Bu nedenle kaldırılması çok az alan kazandırır ve bu seçeneği kaybetmenize neden olur.

SearXNG nasıl güncellenir?

/opt/searxng içinde önce docker compose pull, ardından docker compose up -d komutunu çalıştırın. Compose, imajı değişen tüm container'ları yeniden oluşturur ve core-config/ dizininize dokunmaz. Bu nedenle settings.yml korunur. use_default_settings: true anahtarlarınızı yayımlanan varsayılanların üzerine birleştirdiğinden, upstream tarafından eklenen seçenekler dosyayı bozmak yerine uygun değerlerle gelir.

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

Evet. Bu durumda sınırlayıcıyı etkinleştirin ve public_instance: true değerini ayarlayın. Tercihler her ziyaretçinin kendi tarayıcısında depolanır. Bu nedenle yönetilecek hesap bulunmaz. Örneği kullanıma açtıktan sonra bir hafta boyunca /stats dosyasını izleyin. Çünkü upstream arama motorları, eksik sonuçları fark etmenizden çok önce sunucunuzu reddetmeye başlar.

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