4 Şubat 2026 Çarşamba

Rancher Üzerinde Uygulama Yönetimi: Nginx Test ve Operasyon Günlüğü

K3s üzerine kurulu Rancher panelimizde bir uygulamanın nasıl ayağa kaldırıldığını, dış dünyaya nasıl açıldığını ve kaynak yönetimi için nasıl durdurulduğunu adım adım inceliyoruz.

1. Helm Reposu Ekleme (Bitnami)

Rancher'ın standart marketinde bulunmayan uygulamalara erişmek için popüler Bitnami kütüphanesini sistemimize ekledik. İsimlendirme yaparken küçük harf kuralına (RFC 1123) dikkat ettik.

  • İşlem: Apps > Repositories > Create
  • İsim: bitnami (Büyük harf hata verir!)
  • URL: https://charts.bitnami.com/bitnami

2. Uygulama Kurulumu (Nginx)

Sistemi test etmek için Bitnami üzerinden hafif bir Nginx web sunucusu seçtik.

  • İşlem: Apps > Charts > Nginx
  • Detay: Default ayarlarla kurulumu başlattık ve uygulamanın Deployed olmasını bekledik.

3. Servis ve Port Yapılandırması

Uygulamanın cluster içinde bir IP alması için Cluster IP servisi oluşturduk. Bitnami Nginx'in iç portu olan 8080'i kullandık.

  • Service Type: Cluster IP
  • Ports: Listening & Target Port = 8080
  • Selector: app.kubernetes.io/name = nginx (Servisin hangi pod'a gideceğini belirler)

4. Ingress ve Dış Dünyaya Erişim (DNS Çözümü)

Uygulamayı nginx.rancher.local ismiyle dışarı açtık. En büyük engel olan DNS sorununu hosts dosyasını düzenleyerek aştık.

⚠️ Kritik Çözüm: Bilgisayarımızın DNS kayıtlarında bulunmayan bu isimler için C:\Windows\System32\drivers\etc\hosts dosyasına şu satırı ekledik:
10.10.10.13 nginx.rancher.local

5. Uygulamayı Durdurma (Scaling to Zero)

Kullanılmayan uygulamaların RAM ve CPU tüketmesini engellemek için uygulamayı silmek yerine "uyutma" yöntemini kullandık.

  • İşlem: Workloads > Deployments > Edit Config
  • Scaling: Replicas sayısını 1'den 0'a indirdik.
  • Sonuç: Pod'lar kapandı, kaynak tüketimi durdu ama tüm ayarlar (Service, Ingress) korundu. Tekrar açmak için değeri 1 yapmak yeterli.

Docker Compose ile Yerel Bir RAG (Retrieval-Augmented Generation) Ortamı Kurulumu: PostgreSQL + pgvector + API Katmanı

RAG Nedir ve Neden Yerelde Kurulur?

RAG (Retrieval-Augmented Generation), bir dil modelinin cevabı “uydurmak” yerine önce güvenilir bir kaynaktan ilgili içerikleri bulup (retrieval), ardından bu içeriklerle zenginleştirilmiş bir yanıt üretmesi yaklaşımıdır. Son dönemde kurum içi dokümanlarla çalışan asistanlar, teknik arama kutuları ve destek botları RAG ile daha tutarlı sonuçlar verebiliyor. Yerel (local) kurulum ise hem gizlilik hem de maliyet açısından önemli: veriniz üçüncü taraf servislere gitmez, altyapı kontrolü sizde olur ve test/deneme döngüsü hızlanır.

Bu yazıda Docker Compose kullanarak güncel ve pratik bir RAG altyapısının çekirdeğini kuracağız: PostgreSQL üzerinde pgvector eklentisi ile vektör arama, ve bu veritabanına bağlanan örnek bir API katmanı. Amaç; doküman parçalarını (chunk) vektör olarak saklamak, benzerlik araması yapmak ve uygulamalar için tekrar kullanılabilir bir iskelet oluşturmaktır.

Mimari: Hangi Parçalar Var?

Kurulum üç ana parçadan oluşur: (1) PostgreSQL + pgvector: embedding’leri saklar ve benzerlik araması yapar. (2) API: doküman ekleme ve arama uçlarını sunar. (3) İsterseniz ileride LLM entegrasyonu: burada odak veritabanı ve retrieval tarafı olduğu için LLM kısmını opsiyonel bırakıyoruz. Bu iskelet, ister kendi LLM’inizle ister bir harici model API’si ile kolayca genişletilebilir.

Ön Koşullar

Bilgisayarınızda Docker ve Docker Compose kurulu olmalı. Windows’ta Docker Desktop, macOS’ta Docker Desktop, Linux’ta Docker Engine + Compose eklentisi yeterlidir. Ayrıca komut satırı kullanımı ve temel PostgreSQL kavramlarına aşinalık işinizi kolaylaştırır.

1) Docker Compose Dosyasını Hazırlama

Projeniz için bir klasör açın (ör. rag-local) ve içine docker-compose.yml dosyası oluşturun. Aşağıdaki yapı PostgreSQL’i pgvector etkin şekilde başlatır ve örnek bir API servisini ayağa kaldırır. API tarafını kendi projenize göre değiştirebilirsiniz; burada amaç, servislerin bir arada çalıştığı “omurga”yı kurmak.

docker-compose.yml içeriği:

Not: Aşağıdaki bloğu olduğu gibi ekleyebilirsiniz.

YAML:

version: "3.9"
services:
  db:
    image: pgvector/pgvector:pg16
    container_name: rag_db
    environment:
      POSTGRES_USER: rag
      POSTGRES_PASSWORD: ragpass
      POSTGRES_DB: ragdb
    ports:
      - "5432:5432"
    volumes:
      - rag_pgdata:/var/lib/postgresql/data
  api:
    image: node:20-alpine
    container_name: rag_api
    working_dir: /app
    volumes:
      - ./api:/app
    environment:
      DATABASE_URL: postgres://rag:ragpass@db:5432/ragdb
    command: sh -c "npm i && npm run dev"
    depends_on:
      - db
    ports:
      - "3000:3000"
volumes:
  rag_pgdata:

Burada kritik kısım, veritabanı imajının pgvector destekli olmasıdır. Böylece ayrı bir eklenti kurma süreciyle uğraşmadan vektör tiplerini ve indeksleri kullanabilirsiniz. API servisi için Node.js seçtik; ancak aynı yaklaşımı Python/FastAPI ya da Go ile de uygulayabilirsiniz.

2) Veritabanında Tablo ve İndeks Oluşturma

Şimdi PostgreSQL tarafında pgvector’ı etkinleştirelim ve RAG için temel bir tablo kuralım. Terminalden Compose’u başlatın:

Komut: docker compose up -d

Ardından veritabanı kabuğuna girip SQL çalıştırın:

Komut: docker exec -it rag_db psql -U rag -d ragdb

SQL adımları:

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE IF NOT EXISTS documents (
  id BIGSERIAL PRIMARY KEY,
  source TEXT NOT NULL,
  chunk TEXT NOT NULL,
  embedding vector(768),
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Benzerlik araması için ivfflat indeks (embedding dolduktan sonra daha verimli olur)
CREATE INDEX IF NOT EXISTS documents_embedding_idx
ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

Burada vector(768) boyutu örnek bir değerdir. Kullandığınız embedding modeline göre 384, 768, 1024 gibi farklı boyutlar seçebilirsiniz. Boyut ile model çıktısı tutarlı olmak zorunda; aksi halde insert sırasında hata alırsınız.

3) API Katmanını Hızlıca Ayağa Kaldırma

Proje kökünde api adlı klasör oluşturun. İçine basit bir Node.js API koyarak iki uç hazırlayacağız: /ingest (doküman ekleme) ve /search (benzerlik araması). Örnek olması açısından sade tutuldu; prod ortamda doğrulama, rate limit, kuyruk (queue) ve gözlemlenebilirlik eklemek gerekir.

api/package.json:

{
  "name": "rag-api",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "node index.js"
  },
  "dependencies": {
    "express": "^4.19.2",
    "pg": "^8.12.0"
  }
}

api/index.js:

import express from "express";
import pg from "pg";

const app = express();
app.use(express.json({ limit: "2mb" }));

const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });

// ingest: { source, chunk, embedding: [..] }
app.post("/ingest", async (req, res) => {
  const { source, chunk, embedding } = req.body;
  if (!source || !chunk || !Array.isArray(embedding)) {
    return res.status(400).json({ error: "source, chunk ve embedding (array) zorunlu" });
  }
  const emb = `[${embedding.join(",")}]`;
  await pool.query(
    "INSERT INTO documents(source, chunk, embedding) VALUES ($1, $2, $3::vector)",
    [source, chunk, emb]
  );
  res.json({ ok: true });
});

// search: { embedding: [..], topK: 5 }
app.post("/search", async (req, res) => {
  const { embedding, topK = 5 } = req.body;
  if (!Array.isArray(embedding)) {
    return res.status(400).json({ error: "embedding (array) zorunlu" });
  }
  const emb = `[${embedding.join(",")}]`;
  const { rows } = await pool.query(
    `SELECT id, source, chunk,
      1 - (embedding <=> $1::vector) AS score
      FROM documents
      ORDER BY embedding <=> $1::vector
      LIMIT $2`,
    [emb, topK]
  );
  res.json({ results: rows });
});

app.listen(3000, () => console.log("RAG API 3000 portunda çalışıyor"));

Bu API, embedding üretmez; embedding’i dışarıdan bekler. Böylece hangi embedding modelini kullanacağınızı (yerel bir model, bir CLI aracı veya bir bulut servisi) siz belirlersiniz. RAG projelerinde bu ayrım pratik bir avantaj sağlar: depolama/arama altyapısı sabit kalırken model katmanı kolay değişir.

4) Test: Veri Ekleme ve Arama

Servisler ayaktayken basit bir test yapabilirsiniz. Örnek olarak 768 boyut yerine kısa bir vektörle test etmek istiyorsanız tablo boyutunu da ona göre ayarlamanız gerekir. Gerçek kullanımda modelin ürettiği boyutla aynı vektörü göndermelisiniz. Uygulamada tipik akış şudur: (1) dokümanı parçalara böl, (2) her parça için embedding üret, (3) /ingest ile kaydet, (4) kullanıcı sorusu için embedding üret, (5) /search ile en alakalı parçaları çek, (6) bu parçaları LLM’e bağlam olarak ver.

Benzerlik metriklerinde en sık kullanılan seçenekler cosine ve L2’dir. Burada vector_cosine_ops ve <=> operatörü ile cosine mesafesine dayalı sıralama yapıyoruz. Sonuçtaki score alanı basit bir dönüştürme ile “yakınlık” hissi verir; uygulamanızda eşik (threshold) tanımlayarak düşük skorlu sonuçları elemek iyi bir pratik olabilir.

Performans ve Üretim Notları

Yerel RAG ortamı hızlı sonuç verir ama birkaç noktaya dikkat etmek gerekir. ivfflat indeks, veri büyüdükçe anlamlı hale gelir; küçük veri setlerinde tam tarama bazen daha tutarlı sonuç verebilir. Ayrıca ivfflat için ANALYZE çalıştırmak ve “lists” parametresini veri boyutuna göre ayarlamak önemlidir. Daha ileri seviyede hnsw gibi indeks türlerini ve PostgreSQL ayarlarını (work_mem, maintenance_work_mem) incelemek performansı ciddi şekilde artırabilir.

Güvenlik tarafında ise API’ye kimlik doğrulama eklemek, veritabanı şifresini .env dosyasına almak, ağ izolasyonu yapmak ve logları izlemek temel gereksinimlerdir. Bu iskeleti kendi projelerinize uyarlarken en büyük kazanım, retrieval katmanını standardize etmeniz olur; çünkü RAG projelerinde asıl fark genellikle doğru chunking, iyi embedding seçimi ve doğru indeks/parametre kombinasyonunda ortaya çıkar.

3 Şubat 2026 Salı

Ubuntu K3s Üzerine Rancher Kurulumu: A'dan Z'ye Tam Rehber

Bu yazıda, Ubuntu sunucular üzerinde çalışan K3s (Lightweight Kubernetes) cluster'ınıza Rancher panelini nasıl kuracağınızı, kurulum sırasında karşılaşabileceğiniz "timeout" ve yazım hatalarını nasıl çözeceğinizi adım adım anlatıyorum.

1. Sistem Yapısı ve Hazırlık

Kurulumu yaptığımız Ubuntu yapısı şu şekildedir:

  • OS: Ubuntu 24.04 LTS
  • Cluster: 1 Master (10.10.10.13), 2 Worker (10.10.10.14-15)
  • Donanım: Intel i7 İşlemci, 16GB RAM

2. Cert-Manager Kurulumu (Kritik Adım)

Rancher, SSL sertifikalarını yönetmek için cert-manager'a ihtiyaç duyar. Bu adım eksik olursa Rancher podları asla "Ready" konumuna geçmez.

# Helm repolarını ekleyin
sudo helm repo add jetstack https://charts.jetstack.io
sudo helm repo update

# Cert-manager kurulumu
sudo helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true \
  --kubeconfig /etc/rancher/k3s/k3s.yaml

3. Rancher Kurulumu ve Karşılaşılan Hatalar

Burada en sık yapılan hata, kurulumun hızlı biteceğini düşünmektir. Rancher, arka planda büyük "git" depolarını klonladığı için sabırlı olmalısınız.

💡 Çözülen Sorun 1: "Udo" Komutu Hatası
Terminalde sudo yazarken yanlışlıkla udo yazmak, sistemin alakasız paketler yüklemesine neden olabilir. Bu durumda CTRL + C ile işlemi durdurup sudo apt remove udo ile temizlik yapmalısınız.
# Rancher Stable reposunu ekleyin
sudo helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
sudo helm repo update

# Dikey Kurulum Komutu (Performans Odaklı)
sudo helm upgrade --install rancher rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=rancher.local \
  --set bootstrapPassword=admin \
  --set replicas=1 \
  --create-namespace \
  --kubeconfig /etc/rancher/k3s/k3s.yaml \
  --wait --timeout 15m

4. Sorun Giderme: "Context Deadline Exceeded"

Eğer kurulum 15 dakikayı aşarsa Helm hata verebilir. Bu durumda podların durumunu kontrol etmek gerekir:

# Pod durumuna bakın
sudo kubectl get pods -n cattle-system --kubeconfig /etc/rancher/k3s/k3s.yaml

Eğer podlar 0/1 Running ise ve loglarda "Restoring git repositories" görüyorsanız, podları şu komutla tazeleyerek döngüden çıkarabilirsiniz:

sudo kubectl delete pod -l app=rancher -n cattle-system --kubeconfig /etc/rancher/k3s/k3s.yaml

5. Panele Erişim

Podlar 1/1 READY olduğunda, bilgisayarınızın hosts dosyasına şu satırı ekleyin:

10.10.10.13 rancher.local

Tarayıcıdan https://rancher.local adresine giderek belirlediğiniz şifre ile giriş yapabilirsiniz.

Sonuç: Artık tüm Kubernetes cluster'ınızı görsel bir panel üzerinden yönetmeye hazırsınız!

Windows 11’de WSL2 ile Docker Desktop Kurulumu ve Performans Ayarları (Adım Adım Rehber)

WSL2 + Docker: Neden Bu Kurulum?

Windows 11 üzerinde Linux tabanlı geliştirme yapmak artık “ikinci bir bilgisayar” ihtiyacı olmadan oldukça konforlu. WSL2 (Windows Subsystem for Linux 2), gerçek bir Linux çekirdeğiyle çalıştığı için dosya sistemi, ağ ve container uyumluluğu açısından WSL1’e göre belirgin avantajlar sunuyor. Buna Docker Desktop eklendiğinde; Kubernetes denemeleri, mikroservis geliştirme, CI ortamına yakın bir test akışı ve Linux image’larıyla sorunsuz çalışma gibi artılar elde ediyorsunuz.

Bu yazıda, Windows 11’de WSL2 kurulumundan başlayarak Docker Desktop’ı WSL2 tabanlı şekilde yapılandırmayı, ardından da performansı etkileyen kritik ayarları adım adım ele alacağız. Hedefimiz; stabil, hızlı ve günlük kullanımda sorun çıkarmayan bir geliştirme ortamı kurmak.

1) Ön Koşullar ve Kontroller

Kuruluma başlamadan önce sisteminizin bazı gereksinimleri karşıladığından emin olun. Windows 11’in güncel bir sürümünü kullanmanız önerilir. Ayrıca BIOS/UEFI tarafında sanallaştırma açık olmalıdır. Intel tarafında genellikle VT-x, AMD tarafında SVM olarak geçer.

Windows üzerinde WSL durumunu kontrol etmek için PowerShell’i yönetici olarak açıp şu komutu kullanabilirsiniz: wsl --status. Eğer WSL kurulu değilse veya sürüm eskiyse birazdan bunu da kuracağız.

2) WSL2 Kurulumu ve Linux Dağıtımı Seçimi

Windows 11’de WSL kurulumu çoğu sistemde tek komutla yapılabiliyor. PowerShell (Yönetici) üzerinde şu komutu çalıştırın: wsl --install. Bu komut varsayılan olarak uygun bileşenleri yükler ve genellikle Ubuntu kurulumunu başlatır. İşlem bittiğinde yeniden başlatma isteyebilir.

Dağıtımı elle seçmek isterseniz: wsl --list --online ile mevcut dağıtımları listeleyebilir, ardından wsl --install -d Ubuntu gibi bir komutla belirli bir dağıtımı kurabilirsiniz. Geliştirme amaçlı en yaygın tercih Ubuntu’dur; paket ekosistemi geniş, dokümantasyonu güçlüdür.

Kurulumdan sonra WSL’nin varsayılan sürümünü WSL2 yapmak için şu komut işe yarar: wsl --set-default-version 2. Mevcut bir dağıtımı WSL2’ye geçirmek gerekirse: wsl --set-version Ubuntu 2.

3) Docker Desktop Kurulumu (WSL2 Backend ile)

Docker Desktop, Windows üzerinde Docker Engine’i çalıştırmanın en pratik yoludur. Resmî Docker Desktop kurulum dosyasını indirip kurulum adımlarını izleyin. Kurulum sırasında “WSL 2 based engine” seçeneğinin etkin olduğundan emin olun. Bu seçenek, Hyper-V tabanlı klasik yaklaşım yerine WSL2 altyapısını kullanarak daha akıcı bir deneyim sunar.

Kurulum sonrası Docker Desktop’ı açın ve Settings bölümünde WSL entegrasyonunu kontrol edin. Genellikle Resources > WSL Integration altında, kurduğunuz Linux dağıtımı için entegrasyonu etkinleştirmeniz gerekir. Örneğin Ubuntu için anahtarı açtığınızda, Docker komutlarını doğrudan WSL terminalinden kullanabilirsiniz.

4) WSL İçinde Docker Komutlarını Test Etme

Ubuntu terminalini açıp şu komutlarla test yapın: docker version ve docker ps. Eğer Docker Desktop çalışıyorsa sürüm bilgisi gelmeli ve çalışan container listesi (boş da olabilir) görüntülenmelidir. Ardından hızlı bir test için: docker run --rm hello-world komutunu çalıştırabilirsiniz. Bu image başarıyla indiriliyor ve çalışıyorsa kurulum tamamdır.

5) Performans İçin Kritik Ayarlar (Gerçek Hayat İpuçları)

Dosyaları doğru yerde tutun: En sık yapılan hata, proje dosyalarını Windows dosya sistemi üzerinde (ör. C:\Users\...) tutup WSL üzerinden işlemektir. Bu yaklaşım bazı senaryolarda yavaşlar. Daha iyi performans için projelerinizi WSL dosya sisteminde, örneğin /home/kullanici/proje altında konumlandırın. Editör olarak VS Code kullanıyorsanız “Remote - WSL” eklentisiyle WSL içindeki projeye sorunsuz bağlanabilirsiniz.

Kaynak limitlerini yönetin: WSL2, varsayılan olarak sistem kaynaklarını dinamik kullanır. Ancak büyük projelerde veya çok sayıda container çalıştırırken RAM/CPU kullanımını kontrol etmek isteyebilirsiniz. Windows kullanıcı dizininizde .wslconfig dosyası oluşturarak örneğin bellek ve işlemci sınırı koyabilirsiniz. Bu sayede sisteminizin tamamının WSL2 tarafından “yutulmasını” engellersiniz.

Docker Desktop kaynak ayarları: Docker Desktop içinde CPU/RAM limitlerini düzenlemek, özellikle laptop kullanıcılarında fan ve pil yönetimi açısından önemlidir. Ayrıca disk imajının bulunduğu sürücüde yeterli boş alan olduğundan emin olun. Container’lar ve image’lar zamanla şişebilir; kullanılmayanları temizlemek için düzenli aralıklarla docker system prune komutunu dikkatli şekilde kullanabilirsiniz.

6) Sık Karşılaşılan Sorunlar ve Çözümler

Docker komutu bulunamadı: WSL entegrasyonunu Docker Desktop ayarlarından etkinleştirdiğinizden emin olun. Ayrıca Docker Desktop’ın çalışır durumda olması gerekir.

WSL güncelleme ihtiyacı: Bazı durumlarda çekirdek güncellemesi gerekebilir. PowerShell’de wsl --update komutunu çalıştırarak WSL bileşenlerini güncelleyebilirsiniz.

Ağ/port erişimi: Container içinde çalışan servisleri Windows üzerinden görmek için port yönlendirmesinin doğru olduğundan emin olun (ör. -p 3000:3000). Güvenlik yazılımları veya kurumsal politikalar bazı portları kısıtlayabilir.

Sonuç

WSL2 ile Docker Desktop birleşimi, Windows 11 üzerinde Linux-native geliştirme deneyimini ciddi şekilde iyileştiriyor. Doğru dağıtımı seçip WSL entegrasyonunu etkinleştirdikten sonra, projelerinizi WSL dosya sistemi içinde tutarak ve kaynak limitlerini bilinçli ayarlayarak hem stabil hem de hızlı bir ortam kurabilirsiniz. Bu rehberdeki adımlar tamamlandığında; Node.js, Python, Go, .NET ve daha pek çok teknoloji için container tabanlı geliştirme akışına hazır olacaksınız.

2 Şubat 2026 Pazartesi

Evde Kendi VPN’ini Kur: WireGuard ile Güvenli ve Hızlı Bağlantı Rehberi

WireGuard Nedir ve Neden Tercih Edilmeli?

Ev dışındayken ev ağınıza güvenli biçimde erişmek, halka açık Wi‑Fi’da trafiğinizi şifrelemek veya kendi kişisel VPN’inizi kurup üçüncü taraf hizmetlere bağımlılığı azaltmak istiyorsanız, WireGuard son yılların en pratik çözümlerinden biri. OpenVPN gibi köklü alternatiflere göre daha az bileşenle çalışır, kurulum ve bakım tarafı daha sade ilerler. Performans tarafında ise özellikle mobil cihazlarda hızlı bağlanma süresi ve düşük gecikme avantajı dikkat çeker.

Bu rehberde, evdeki bir Linux sunucusu (ör. Ubuntu) üzerinde WireGuard kurup telefonu veya dizüstünü güvenli şekilde bağlamayı adım adım anlatacağım. Anlatım ileri seviye sayılabilecek ağ konularına değinse de, komutları takip ederek güvenli bir kurulum yapmak mümkün.

Ön Koşullar: Ne Gerekli?

Kuruluma başlamadan önce şu hazırlıklar işinizi kolaylaştırır: (1) İnternete bağlı ve mümkünse 7/24 açık bir Linux makine (Ubuntu 22.04/24.04 gibi), (2) Modem/router üzerinde port yönlendirme yapabilme yetkisi, (3) Statik IP’niz yoksa bir DDNS alan adı (No-IP, DuckDNS vb.), (4) Sunucuda yönetici yetkisi (sudo). Ayrıca ev internetiniz CGNAT arkasındaysa port yönlendirme çalışmayabilir; bu durumda sağlayıcınızdan gerçek IP talep etmek veya ters tünel gibi farklı mimariler düşünmek gerekir.

1) WireGuard Kurulumu (Ubuntu)

Önce paketleri güncelleyin ve WireGuard’ı kurun:

Komutlar:
sudo apt update
sudo apt install -y wireguard

Ardından sunucu için anahtar çiftini üretin. Anahtarları doğru izinlerle saklamak güvenlik açısından kritik:

Komutlar:
umask 077
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

2) Sunucu Yapılandırması: wg0.conf

WireGuard arayüzünü wg0 adıyla yapılandıralım. Aşağıdaki örnek, VPN ağı olarak 10.10.10.0/24 kullanır. Sunucuya 10.10.10.1 veriyoruz. Ayrıca IP yönlendirmeyi ve NAT’ı da ekliyoruz ki istemciler internet çıkışını VPN üzerinden yapabilsin (isteğe bağlı).

/etc/wireguard/wg0.conf dosyasını oluşturun:

Komut:
sudo nano /etc/wireguard/wg0.conf

Örnek içerik:
[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = (server_private.key içeriği)

PostUp = ufw route allow in on wg0 out on eth0; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = ufw route delete allow in on wg0 out on eth0; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Not: Sunucunuzun dış bacak arayüz adı eth0 olmayabilir (ör. enp0s3). ip a ile kontrol edip wg0.conf içinde güncelleyin.

3) IP Forwarding Açma

VPN istemcilerinin ağlar arası paket iletebilmesi için kernel IP yönlendirmeyi açın:

Komutlar:
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

4) Güvenlik Duvarı ve Port Yönlendirme

Sunucuda UFW kullanıyorsanız, WireGuard portunu açın:

Komutlar:
sudo ufw allow 51820/udp
sudo ufw enable

Router tarafında UDP 51820 portunu sunucunun yerel IP’sine yönlendirin. Eğer DDNS kullanıyorsanız, istemci yapılandırmasında IP yerine alan adınızı yazabilirsiniz.

5) İstemci (Telefon/Dizüstü) Anahtarı ve Peer Ekleme

Şimdi bir istemci oluşturalım. İsterseniz anahtarları istemci cihazında üretebilirsiniz; burada sunucuda üretip sonra istemciye aktaracağız:

Komutlar:
umask 077
wg genkey | tee /etc/wireguard/client1_private.key | wg pubkey > /etc/wireguard/client1_public.key

İstemciye 10.10.10.2 verelim. Sunucu yapılandırmasına istemciyi bir Peer olarak eklemek için wg0.conf dosyasının sonuna şunu ekleyin:

Ek satırlar:
[Peer]
PublicKey = (client1_public.key içeriği)
AllowedIPs = 10.10.10.2/32

6) İstemci Konfigürasyonu (WireGuard Uygulaması)

Telefonunuzda WireGuard uygulamasında yeni tünel oluşturup aşağıdaki yapıyı kullanın. Endpoint kısmına ev IP’nizi veya DDNS alan adınızı yazın. “AllowedIPs” alanı önemlidir: Tüm trafiği VPN’e yönlendirmek için 0.0.0.0/0 kullanılabilir; sadece ev ağına erişmek istiyorsanız daha dar bir aralık tanımlayın.

Örnek istemci dosyası:
[Interface]
PrivateKey = (client1_private.key içeriği)
Address = 10.10.10.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = (server_public.key içeriği)
Endpoint = alanadiniz-or-ipniz:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

“PersistentKeepalive” özellikle mobil ağlarda veya NAT arkasında bağlantının düşmesini engellemek için faydalıdır.

7) Servisi Başlatma ve Test

Sunucuda WireGuard arayüzünü ayağa kaldırın ve otomatik başlatmayı etkinleştirin:

Komutlar:
sudo systemctl enable --now wg-quick@wg0
sudo wg show

İstemciden bağlandıktan sonra sunucuda “latest handshake” alanının güncellendiğini görmelisiniz. İstemci tarafında IP’nizi kontrol ederek trafiğin VPN üzerinden gidip gitmediğini anlayabilirsiniz. Eğer sadece ev ağına erişmek istiyorsanız, “AllowedIPs” değerini örneğin 192.168.1.0/24 gibi yerel ağa göre daraltmak performans ve yönlendirme karmaşıklığı açısından daha temiz olabilir.

Sık Karşılaşılan Sorunlar ve İpuçları

El sıkışma (handshake) yok: Port yönlendirme yanlış olabilir, sunucu güvenlik duvarı UDP 51820’yi engelliyor olabilir veya CGNAT nedeniyle dışarıdan erişim mümkün değildir.

Bağlanıyor ama internet yok: NAT (MASQUERADE) kuralı eksik olabilir, yanlış dış arayüz adı girilmiş olabilir veya IP forwarding açık değildir.

Güvenlik önerisi: WireGuard yapılandırmalarını yedekleyin ama özel anahtarları düz metin olarak paylaşmayın. İstemci kaybolursa ilgili peer’i sunucudan kaldırın ve anahtarları yenileyin.

Sonuç

WireGuard ile kendi VPN’inizi kurmak, hem hız hem de kontrol açısından çoğu “tek tık VPN” hizmetinden daha tatmin edici bir çözüm sunar. Kurulumun özü; doğru anahtar yönetimi, doğru port yönlendirme ve temiz bir yönlendirme/NAT kural seti oluşturmaktan geçiyor. Bir kez oturttuktan sonra yeni cihaz eklemek de sadece yeni bir peer tanımlamak kadar basit hale geliyor.

1 Şubat 2026 Pazar

ChatGPT API ile Araç (Tools) Entegrasyonu: Gerçek Dünya İş Akışlarını Bağlamak İçin Adım Adım Rehber

ChatGPT “Tools” (Araç) Nedir ve Neden Önemli?

Büyük dil modelleri artık sadece soru-cevap üreten “akıllı sohbet” katmanından ibaret değil. OpenAI’nin Tools (araç çağırma) yaklaşımı sayesinde model, belirlediğiniz fonksiyonları çağırarak dış sistemlerle konuşabiliyor: veritabanı sorgulama, kargo durumunu çekme, takvim kaydı açma, CRM güncelleme, hatta bir log analizini başlatma gibi. Buradaki kritik nokta şu: Model “metin” üretirken, aynı zamanda yapılandırılmış bir biçimde hangi aracı hangi parametrelerle çalıştıracağını da önerebiliyor.

Bu rehberde ileri seviye ama uygulanabilir bir senaryo kuracağız: “Sipariş durumunu kontrol et” talebini alan bir asistanın, bir API’den sipariş bilgisini çekmesi ve kullanıcıya anlaşılır bir özet sunması. Örnekler basit görünebilir; ancak yapı taşları aynıdır ve kurumsal iş akışlarına rahatça ölçeklenir.

Mimari: Model + Araç Katmanı + Doğrulama

Sağlam bir araç entegrasyonu üç parçadan oluşur: (1) Model kullanıcı niyetini anlar ve gerekli aracı seçer, (2) Araç katmanı seçilen fonksiyonları güvenli şekilde çalıştırır, (3) doğrulama/guardrail ise yanlış parametreleri, yetkisiz işlemleri ve “halüsinasyon” kaynaklı hataları engeller. En yaygın hata, modele fazla yetki verip her şeyi “serbest metin” üzerinden yaptırmaktır. Bunun yerine her kritik işlemi araç fonksiyonlarına bölmek ve parametreleri şemayla kısıtlamak gerekir.

Örnek Senaryo: Sipariş Durumu Sorgulama

Senaryomuzda iki araç tanımlayacağız: get_order (sipariş detaylarını getir) ve list_orders (kullanıcının son siparişlerini listele). Kullanıcı sipariş numarasını bilmiyorsa model önce list_orders çağıracak, sonra kullanıcıya seçenek sunacak veya en olası siparişi soracak. Bu yaklaşım, gerçek hayatta destek ekiplerinin iş yükünü ciddi biçimde azaltır.

Araç Şemalarını Tasarlama (En Kritik Adım)

Araç şemaları ne kadar net olursa, modelin yanlış çağrı yapma ihtimali o kadar düşer. Parametreleri minimumda tutun, veri tiplerini belirleyin ve mümkünse enum kullanın. Örneğin “status” alanını serbest metin yerine belirli değerlerle sınırlandırmak, hem raporlama hem de güvenlik açısından faydalıdır.

Node.js ile Uygulama (Örnek Kod)

Aşağıdaki iskelet, OpenAI API üzerinden araç çağırmayı gösteren pratik bir örnektir. Mantık aynı kalsa da kullandığınız sürüm ve SDK isimleri değişebilir; bu nedenle kendi ortamınıza göre uyarlayın. Önemli olan, modelden gelen tool call isteğini yakalayıp ilgili fonksiyonu çalıştırmanız ve sonucu tekrar modele vermenizdir.

1) Kurulum
Node.js 18+ önerilir. Projenize SDK’yı ekleyin ve API anahtarını ortam değişkeni olarak saklayın. Anahtarı kesinlikle kod içine gömmeyin.

2) Araçların tanımlanması ve çağrı döngüsü

Örnek: Uygulama, kullanıcı “12345 numaralı sipariş nerede?” dediğinde get_order aracını çağırır.

Not: Aşağıdaki kod bir “iskelet”tir; gerçek projede hata yönetimi, zaman aşımı, rate limit ve loglama eklemelisiniz.

Kod (özet):

tools listesi içinde fonksiyon isimleri ve parametre şemaları tanımlanır. Model bir araç çağırmak isterse, uygulama bu çağrıyı yakalar, ilgili fonksiyonu çalıştırır ve çıktıyı tekrar “tool” rolüyle modele geri verir. Sonrasında model kullanıcıya nihai yanıtı üretir.

Uygulama mantığı (psödo-akış):
1) Kullanıcı mesajını modele gönder
2) Model “tool çağrısı” döndürürse: aracı çalıştır
3) Aracın sonucunu modele geri gönder
4) Modelin ürettiği son yanıtı kullanıcıya göster

Gerçek Hayat İpuçları: Güvenlik ve Doğruluk

Parametre doğrulama: Modelin gönderdiği değerleri “doğru kabul etmeyin”. Örneğin order_id için sadece sayısal değer ve belirli uzunluk kontrolü uygulayın. Ayrıca kullanıcı kimliğine göre erişim kontrolü yapın; bir kullanıcı başka birinin siparişini görmemeli.

Yetki sınırları: Araçları “okuma” ve “yazma” olarak ayırın. Örneğin iade başlatma gibi riskli işlemleri ayrı bir onay adımına bağlayın. Modelin tek bir cümleyle geri ödeme başlatabilmesi, güvenlik açığına dönüşebilir.

Cache ve maliyet: Sık sorgulanan bilgiler için kısa süreli cache kullanın. Aynı kullanıcı, aynı sipariş durumunu 10 saniye içinde tekrar sorarsa API’ye yeniden gitmek yerine cache’den yanıtlamak maliyeti düşürür.

Gözlemlenebilirlik: Tool çağrılarını, parametreleri (maskelenmiş şekilde) ve hata kodlarını loglayın. Üretimde “model neden yanlış araç çağırdı?” sorusunun cevabı ancak bu izlerle bulunur.

İnce Ayar: Sistem Talimatı ve Yanıt Formatı

Araç entegrasyonunda çoğu sorun, modelin “ne zaman araç çağıracağı”nın belirsiz olmasından çıkar. Sistem talimatında şu netlik işe yarar: “Siparişle ilgili bilgi isteyen kullanıcıda önce order_id var mı kontrol et; yoksa list_orders çağır; veri geldikten sonra kullanıcıya sadece özet ver; gereksiz teknik detay verme.” Böylece model hem kullanıcı deneyimini korur hem de hatalı çağrıları azaltır.

Sonuç

ChatGPT API ile Tools entegrasyonu, yapay zekâyı “konuşan bir arayüz” olmaktan çıkarıp doğrudan iş süreçlerine bağlayan en güçlü yaklaşımlardan biri. Doğru şema tasarımı, güvenli araç katmanı ve iyi bir çağrı döngüsüyle; destek, e-ticaret, finans, IT operasyonları gibi alanlarda ciddi verimlilik kazanımı sağlayabilirsiniz. Küçük bir sipariş sorgu senaryosuyla başladık; aynı prensiplerle stok kontrolü, randevu planlama, log analizi veya otomatik raporlama gibi daha karmaşık süreçlere rahatça geçebilirsiniz.

31 Ocak 2026 Cumartesi

Windows 11’de WSL2 ile Docker Desktop Olmadan Docker Kurulumu ve Performans Ayarları

Docker Desktop’sız bir Docker deneyimi mümkün mü?

Windows 11 üzerinde Docker kullanmanın en popüler yolu Docker Desktop kurmak. Ancak bazı kullanıcılar lisans koşulları, sistem kaynak tüketimi veya arka planda çalışan servisler nedeniyle daha hafif bir alternatif arıyor. İyi haber şu: WSL2 (Windows Subsystem for Linux) ile Docker Engine’i doğrudan Linux dağıtımı içinde kurup, Windows’ta da komut satırından rahatça kullanabilirsiniz. Bu yazıda, güncel bir yöntemle Docker Desktop olmadan kurulum, entegrasyon ve performans ayarlarını adım adım anlatıyorum.

Ön koşullar

Başlamadan önce şunlara ihtiyacınız var: Windows 11 (güncel), yönetici yetkisi, WSL2 ve bir Linux dağıtımı (Ubuntu 22.04/24.04 önerilir). Terminal kullanmayı bilmek kurulum süresini kısaltır. Bu yöntem, Docker konteynerlerini Linux çekirdeği üzerinde çalıştırdığı için hem uyumluluk hem de hız açısından genelde iyi sonuç verir.

1) WSL2 ve Ubuntu kurulumu (kısa yol)

Windows Terminal’i yönetici olarak açıp aşağıdaki komutu çalıştırın. Bu komut WSL’i etkinleştirir ve varsayılan olarak Ubuntu’yu kurar:

Komut: wsl --install

Kurulum bittiğinde bilgisayar yeniden başlatılabilir. Ardından Ubuntu ilk açılışta kullanıcı adı ve parola oluşturmanızı ister. WSL sürümünü kontrol etmek için:

wsl -l -v

Dağıtımınızın VERSION sütununda 2 yazmalıdır. Değilse şu komutla yükseltin:

wsl --set-version Ubuntu 2

2) Ubuntu içinde Docker Engine kurulumu

Ubuntu terminalinde önce sistem paketlerini güncelleyin:

sudo apt update && sudo apt upgrade -y

Ardından gerekli paketleri yükleyin:

sudo apt install -y ca-certificates curl gnupg

Docker’ın resmi deposunu eklemek için anahtar ve repo tanımını yapın (Ubuntu sürümüne uygun komutlar güncel yöntemdir):

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Şimdi Docker paketlerini kurun:

sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3) WSL2’de Docker servisini başlatma (systemd ayarı)

Windows 11’in güncel sürümlerinde WSL içinde systemd desteği bulunuyor. Docker’ın her açılışta sorunsuz başlaması için bu ayarı aktif etmek iyi olur. Ubuntu’da şu dosyayı düzenleyin:

sudo nano /etc/wsl.conf

İçine şunları ekleyin:

[boot]
systemd=true

Ardından Windows tarafında WSL’i kapatıp tekrar açın:

wsl --shutdown

Ubuntu’yu tekrar açtıktan sonra Docker servis durumunu kontrol edin:

sudo systemctl status docker

4) “sudo”suz Docker kullanımı

Her komutta sudo yazmamak için kullanıcıyı docker grubuna ekleyin:

sudo usermod -aG docker $USER

Oturumu kapatıp açın ya da WSL’i yeniden başlatın. Sonrasında test:

docker run --rm hello-world

5) Windows Terminal’den pratik kullanım

Bu kurulumda Docker komutlarını Ubuntu içinde çalıştırırsınız. Windows Terminal’de Ubuntu sekmesi açıp docker ps gibi komutları kullanmak yeterli. Ayrıca proje klasörünüz Windows dosya sistemindeyse (ör. C:\projeler), WSL’den /mnt/c/projeler yoluyla erişebilirsiniz. Ancak performans için kritik bir öneri var: sık I/O yapan projelerde (Node.js, PHP, büyük bağımlılık klasörleri) kodu mümkünse WSL dosya sisteminde tutmak (ör. ~/projects) daha hızlı olur.

6) Performans ve kaynak ayarları (.wslconfig)

WSL2, varsayılan olarak RAM’i dinamik yönetir; bazı senaryolarda fazla RAM tüketebilir. Windows kullanıcı klasörünüzde (ör. C:\Users\KullaniciAdiniz) .wslconfig dosyası oluşturup kaynak sınırı koyabilirsiniz. Örnek:

[wsl2]
memory=6GB
processors=4
swap=2GB

Değişiklikten sonra wsl --shutdown ile WSL’i yeniden başlatın. Bu ayarlar özellikle aynı anda IDE, tarayıcı ve birkaç konteyner çalıştırırken sistemi daha öngörülebilir hale getirir.

7) Artılar, eksiler ve ne zaman tercih edilmeli?

Artılar: Daha hafif kurulum, daha az arka plan servisi, Docker Desktop bağımlılığı olmadan çalışma, Linux tabanlı daha “doğal” Docker deneyimi.

Eksiler: Bazı GUI özellikleri (entegre panel, otomatik güncelleyici) yoktur; port yönlendirme ve dosya sistemine erişimde dikkat gerekir. Yine de CLI odaklı geliştiriciler için bu yöntem günlük kullanımda gayet konforlu ve verimlidir.

Sonuç olarak, Windows 11 + WSL2 ikilisiyle Docker Desktop kurmadan da güncel ve hızlı bir konteyner çalışma ortamı kurabilirsiniz. Kurulum bir kez tamamlandıktan sonra günlük iş akışı büyük ölçüde “Linux’ta Docker kullanmak” kadar akıcı hale gelir.