Yeni kiraladığınız GPU sunucusuna SSH ile bağlandınız, nvidia-smi çıktısında 24 GB'lık kartı görüyorsunuz ve ilk sorunuz şu: hangi modeli indirirsem bu karta sığar? İnternetteki rehberlerin çoğu masaüstünüzde bir pencere açtırıp "hazır" diyor. Sunucu tarafında iş orada bitmiyor — model indikten sonra servisin yeniden başlatmalarda ayakta kalması, ekibin tarayıcıdan erişebilmesi, arayüzün internete açılırken parola arkasına alınması ve en kritiği, 11434 portunun yanlışlıkla dünyaya açılmaması gerekiyor.
Bu rehber tam olarak o boşluğu dolduruyor. Ollama'yı bir Linux sunucusuna systemd servisi olarak kuracak, hangi model boyutunun hangi VRAM'e sığdığını rakamlarla hesaplayacak, CPU ile GPU arasındaki hız farkının nereden geldiğini anlayacak, Open WebUI'yi Docker ile ayağa kaldırıp Nginx ve Let's Encrypt arkasında yayınlayacağız. Sonunda elinizde, verinin sunucunuzdan hiç çıkmadığı, kullanıcı hesaplarıyla yönetilen bir sohbet arayüzü olacak.
Modelleri kendi donanımınızda çalıştırmanın en somut faydası maliyet değil, veri sınırıdır. Müşteri sözleşmelerini, hasta kayıtlarını veya kaynak kodunuzu bir API'ye gönderdiğinizde KVKK açısından bir yurt dışı aktarımını savunmak zorunda kalırsınız. Aynı metin kendi sunucunuzdaki modele gittiğinde ortada aktarım yoktur; veriyi işleyen yine sizsiniz.
Ollama Nedir, Sunucuda Ne İşe Yarar?#
Ollama, açık ağırlıklı dil modellerini indirip çalıştıran bir çalışma zamanıdır. Arka planda llama.cpp tabanlı bir çıkarım motoru, önünde ise bir HTTP API'si vardır. Bir modeli ollama pull ile indirir, ollama run ile terminalden konuşur veya 11434 portundaki API üzerinden kendi uygulamanızdan çağırırsınız.
Sunucu tarafında Ollama'yı iki katmanlı düşünmek işinizi kolaylaştırır: Ollama motordur, kullanıcı arayüzü değildir. Ekibinizdeki kişilerin tarayıcıdan girip sohbet edebilmesi için önüne bir arayüz koymanız gerekir; bu rehberde Open WebUI'yi kullanacağız. İkisi ayrı süreçlerdir, ayrı portlarda dinler ve ayrı güvenlik modellerine sahiptir. Bu ayrımı kaçırmak, birazdan anlatacağımız en tehlikeli yapılandırma hatasının kaynağıdır.
Ollama'nın en büyük pratik avantajı kuantize edilmiş modelleri varsayılan olarak sunmasıdır. Bir modelin orijinal ağırlıkları 16 bit kayan noktalı sayılarla saklanır; kuantizasyon bunları 4 bite indirerek dosya boyutunu ve VRAM ihtiyacını yaklaşık dörtte bire düşürür. Kalite kaybı çoğu iş için fark edilmeyecek düzeydedir ama sığmayan model ile sığan model arasındaki farkı yaratır.
Model Boyutu ve VRAM Eşleştirme Tablosu#
Sunucu boyutlandırmasının tamamı tek bir soruya iner: ağırlıklar VRAM'e sığıyor mu? Sığıyorsa model tamamen GPU'da çalışır ve hızlıdır. Sığmıyorsa Ollama modelin bir kısmını sistem RAM'ine taşır ve hız katman katman düşer.
4 bit kuantizasyonda (Ollama'nın çoğu modelde varsayılanı olan Q4_K_M) kaba hesap şudur: her bir milyar parametre yaklaşık 0,55–0,60 GB yer kaplar. Bunun üstüne bağlam penceresinin KV önbelleğini ve motor payını eklemeniz gerekir.
| Model sınıfı | Parametre | Q4 ağırlık boyutu | Rahat çalışan VRAM | Tipik kart |
|---|---|---|---|---|
| Küçük | 3B | ~2,0 GB | 6 GB | RTX 3050, T4 |
| Standart | 8B | ~4,7 GB | 8–12 GB | RTX 3060 12G, T4 |
| Orta | 14B | ~8,5 GB | 16 GB | RTX 4060 Ti 16G, A4000 |
| Büyük | 32B | ~19 GB | 24 GB | RTX 3090/4090, A5000 |
| Çok büyük | 70B | ~40 GB | 48 GB | A6000 veya 2× 24 GB |
Tablodaki "rahat çalışan VRAM" sütunu ağırlık boyutunun üzerine kasıtlı olarak pay bırakır. O payın gittiği yer bağlam penceresidir: modele ne kadar uzun metin verirseniz KV önbelleği o kadar büyür. 8B bir modelde 4K bağlam birkaç yüz megabayt tutarken, 32K bağlam birkaç gigabayta çıkabilir. Uzun doküman özetleyecekseniz bir üst kart sınıfını hedefleyin.
İkinci tuzak çok modelli kullanımdır. Open WebUI'de üç farklı model tanımlayıp ekibe sunarsanız ve üçü aynı anda bellekte kalırsa VRAM'i üç kez ödersiniz. Ollama varsayılan olarak modelleri bir süre bellekte tutar; bunu birazdan OLLAMA_KEEP_ALIVE ile yöneteceğiz.
Doğru kart seçimi için bütçe ve iş yükü karşılaştırmasını GPU sunucu kiralama rehberi yazımızda ayrıntılı bulabilirsiniz.
CPU ile GPU Arasındaki Gerçek Hız Farkı Nereden Gelir?#
"CPU ile de çalışır" cümlesi teknik olarak doğru, pratikte yanıltıcıdır. Farkın kaynağı işlemci gücü değil, bellek bant genişliğidir.
Bir dil modeli her yeni token üretirken tüm ağırlıkları bellekten okumak zorundadır. Yani üretim hızının teorik tavanı şudur:
saniyedeki token ≈ bellek bant genişliği (GB/s) ÷ model boyutu (GB)
Rakamları yerine koyalım. Sunucu sınıfı bir DDR5 sistemde çift kanal bellek bant genişliği kabaca 70–90 GB/s'tir. Bir RTX 4090'ın GDDR6X belleği yaklaşık 1000 GB/s, A100'ün HBM belleği 2000 GB/s bandına çıkar. 4,7 GB'lık 8B bir modelde tablo şöyle oluşur:
| Donanım | Bant genişliği | Teorik tavan | Gerçekte beklenen |
|---|---|---|---|
| CPU (DDR5 çift kanal) | ~80 GB/s | ~17 token/s | 6–12 token/s |
| RTX 3060 12G | ~360 GB/s | ~76 token/s | 40–55 token/s |
| RTX 4090 | ~1000 GB/s | ~210 token/s | 90–130 token/s |
Gerçek değerler teorik tavanın altında kalır çünkü örnekleme, bağlam işleme ve çerçeve yükü de zaman yer. Ama oran korunur: GPU, CPU'dan tipik olarak 8–15 kat hızlıdır ve bu fark model büyüdükçe açılır, kapanmaz.
Buradan çıkan pratik kural şu: tek kullanıcının arada bir soru sorduğu bir iç araç için CPU çalıştırma katlanılabilir. Beş kişilik bir ekip aynı anda uzun metin özetletecekse GPU zorunludur, çünkü CPU'da istekler sıraya girer ve bekleme süreleri çarpılır.
Bir ayrım daha var: ilk token gecikmesi ile üretim hızı farklı şeylerdir. Uzun bir dokümanı modele verdiğinizde önce tüm girdinin işlenmesi gerekir; bu aşama paralelleşebildiği için GPU'da çok daha büyük bir avantaj sağlar. 20 sayfalık bir sözleşmeyi özetletirken CPU'da 40 saniye cevap beklerken GPU'da 3 saniyede ilk kelimeyi görmenizin sebebi budur.
Ollama'yı Sunucuya Kurma ve Servis Olarak Çalıştırma#
Ubuntu 22.04/24.04 veya Debian 12 üzerinde resmi kurulum betiği hem Ollama'yı hem systemd servisini oluşturur. NVIDIA sürücüsünün önceden kurulu olması gerekir; nvidia-smi çalışmıyorsa önce sürücüyü halledin.
# Sürücü kontrolü — kart ve VRAM burada görünmeli
nvidia-smi
# Ollama kurulumu
curl -fsSL https://ollama.com/install.sh | sh
# Servis durumu
systemctl status ollama
Betik ollama adında bir sistem kullanıcısı oluşturur, modelleri /usr/share/ollama/.ollama/models altına koyar ve servisi 127.0.0.1:11434 üzerinde dinleyecek şekilde başlatır. Bu varsayılan bağlama adresi bir güvenlik özelliğidir, eksiklik değil.
Ortam değişkenlerini doğru yerde ayarlamak#
Kabuğunuzda export OLLAMA_HOST=... yazmanın servise hiçbir etkisi yoktur; servis kendi ortamıyla çalışır. Doğru yer bir systemd drop-in dosyasıdır:
sudo systemctl edit ollama.service
Açılan editöre şu bloğu yazın:
[Service]
Environment="OLLAMA_MODELS=/srv/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=10m"
Environment="OLLAMA_NUM_PARALLEL=2"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_FLASH_ATTENTION=1"
Kaydettikten sonra değişiklikleri uygulayın ve gerçekten geçtiğini doğrulayın:
sudo systemctl daemon-reload
sudo systemctl restart ollama
systemctl show ollama --property=Environment
Bu dosya /etc/systemd/system/ollama.service.d/override.conf altına yazılır ve Ollama güncellendiğinde ezilmez — asıl servis dosyasını elle düzenlemenin aksine. systemd birim yönetiminin ayrıntıları için systemd servis yönetimi yazısına bakabilirsiniz.
Değişkenlerin ne işe yaradığı:
| Değişken | Etkisi | Ne zaman değiştirilir |
|---|---|---|
OLLAMA_MODELS | Model dosyalarının dizini | Kök disk küçük, ayrı veri diski var |
OLLAMA_KEEP_ALIVE | Modelin bellekte kalma süresi | VRAM dar ise 2m, sürekli kullanımda -1 |
OLLAMA_NUM_PARALLEL | Aynı anda işlenen istek sayısı | Çok kullanıcı var ve VRAM bol |
OLLAMA_MAX_LOADED_MODELS | Bellekte tutulan model sayısı | VRAM taşmasını engellemek için 1 |
OLLAMA_HOST | Dinlenecek adres | Yalnızca güvendiğiniz özel ağda değiştirin |
OLLAMA_MODELS dizinini değiştirirseniz sahipliği vermeyi unutmayın, yoksa servis modeli indiremez:
sudo mkdir -p /srv/ollama/models
sudo chown -R ollama:ollama /srv/ollama
İlk modeli indirme ve doğrulama#
# Modeli indir — indirme sunucuda olur, sizin bağlantınızı kullanmaz
ollama pull llama3.1:8b
# Terminalden hızlı test
ollama run llama3.1:8b "Tek cümleyle DNS nedir?"
# İndirilen modeller ve boyutları
ollama list
# Şu an bellekte olan modeller ve GPU/CPU dağılımı
ollama ps
ollama ps çıktısındaki PROCESSOR sütunu bu rehberdeki en önemli teşhis aracıdır. 100% GPU yazıyorsa her şey yolundadır. 47%/53% CPU/GPU gibi bir değer görüyorsanız model VRAM'e sığmamış ve yarısı sistem RAM'ine düşmüştür; hız beklediğinizin çeyreğine iner. Çözüm daha küçük bir model, daha agresif kuantizasyon veya daha kısa bağlam penceresidir.
API'yi de doğrulayın, çünkü kendi uygulamalarınız bu uçtan konuşacak:
curl http://127.0.0.1:11434/api/generate -d '{
"model": "llama3.1:8b",
"prompt": "Merhaba",
"stream": false
}'
# Yüklü modelleri listeleyen uç
curl -s http://127.0.0.1:11434/api/tags
Ollama ayrıca OpenAI uyumlu bir uç sunar (/v1/chat/completions). Mevcut bir uygulamayı kendi sunucunuza taşımak çoğu zaman sadece taban URL'yi değiştirmek demektir.
Open WebUI ile Arayüzü Ekibe Açma#
Ollama tek başına arayüzsüzdür. Open WebUI; çoklu kullanıcı hesapları, sohbet geçmişi, doküman yükleme ve model seçimi sunan bir web arayüzüdür. En temiz kurulum Docker iledir.
docker run -d \
--name open-webui \
--restart always \
--network host \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-e WEBUI_AUTH=true \
-v open-webui:/app/backend/data \
ghcr.io/open-webui/open-webui:main
--network host kullanmamızın sebebi konteynerin ana makinedeki 127.0.0.1:11434 adresine doğrudan ulaşabilmesidir. Bu modda Open WebUI 8080 portunda dinler. Köprü ağı tercih ederseniz -p 3000:8080 ile port eşlemesi yapıp OLLAMA_BASE_URL değerini sunucunun özel ağ adresine çevirmeniz gerekir.
Compose tercih edenler için aynı kurulum:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always
network_mode: host
environment:
- OLLAMA_BASE_URL=http://127.0.0.1:11434
- WEBUI_AUTH=true
- ENABLE_SIGNUP=false
volumes:
- open-webui:/app/backend/data
volumes:
open-webui:
Compose dosyalarının yapısı ve yaşam döngüsü komutları için Docker Compose kullanımı yazısına göz atın.
Kritik ilk adım: Open WebUI'de kaydolan ilk hesap otomatik olarak yönetici olur. Servisi ayağa kaldırdıktan sonra ilk işiniz kendi hesabınızı oluşturmak olmalıdır. Bunu yapmadan arayüzü internete açarsanız, adresi bulan ilk kişi sisteminizin yöneticisi olur. Hesabınızı açtıktan sonra ENABLE_SIGNUP=false ile kayıtları kapatın ve kullanıcıları yönetici panelinden elle ekleyin.
Ters Vekil ve HTTPS ile Dışarı Güvenli Yayınlama#
Open WebUI'yi doğrudan 8080 portundan yayınlamayın: şifresiz HTTP üzerinden oturum çerezleri ve sohbet içerikleri açık gider. Önüne Nginx koyup Let's Encrypt sertifikası bağlayın.
server {
listen 443 ssl;
http2 on;
server_name ai.ornek.com;
ssl_certificate /etc/letsencrypt/live/ai.ornek.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.ornek.com/privkey.pem;
# Model cevapları uzun sürebilir, varsayılan 60 saniye yetmez
proxy_read_timeout 600s;
proxy_send_timeout 600s;
# Doküman yükleme için gövde sınırını yükseltin
client_max_body_size 100M;
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;
# WebSocket olmadan cevaplar akmaz, ekran boş kalır
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Akışlı cevabın kelime kelime gelmesi için tamponlamayı kapatın
proxy_buffering off;
}
}
Buradaki üç ayar sık atlanır ve her biri belirgin bir arızaya yol açar. Upgrade ve Connection başlıkları olmadan sohbet WebSocket'i kurulamaz ve cevap hiç görünmez. proxy_buffering off olmadan cevap tek parça hâlinde en sonda düşer, yani akış hissi kaybolur. proxy_read_timeout düşük kalırsa uzun üretimler yarıda 504 alır.
Sertifikayı almak tek komutluk iştir:
sudo certbot --nginx -d ai.ornek.com
Ters vekil yapılandırmasının tamamı ve alternatif senaryolar için Nginx reverse proxy yapılandırma, sertifika tarafı için Let's Encrypt ücretsiz SSL yazılarına bakabilirsiniz.
Ollama Portunu Asla Dışarı Açmayın#
Bu bölüm rehberin en önemli uyarısıdır. Ollama API'sinde kimlik doğrulama yoktur. OLLAMA_HOST=0.0.0.0 yapıp 11434 portunu güvenlik duvarında açarsanız, adresinizi bulan herkes modellerinizi listeleyebilir, sınırsız istek atabilir, GPU'nuzu kendi işleri için çalıştırabilir ve /api/pull ile diskinize onlarca gigabaytlık model indirtebilir.
Doğru mimari şudur: Ollama sadece 127.0.0.1 dinler, Open WebUI aynı makineden ona ulaşır, dışarıya açılan tek şey 443 portundaki Nginx'tir.
sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numbered
Ollama'ya başka bir sunucudan erişmeniz gerekiyorsa iki güvenli yol var. Birincisi özel ağ arayüzüne bağlamak (OLLAMA_HOST=10.0.0.5:11434) ve o arayüzü güvenlik duvarıyla tek kaynak adrese kısıtlamak. İkincisi ve daha temizi SSH tüneli kurmaktır:
# İstemci makineden: yerel 11434'ü sunucudaki 11434'e tünelle
ssh -N -L 11434:127.0.0.1:11434 [email protected]
Tünel yaklaşımında port hiç açılmadığı için saldırı yüzeyi büyümez; ayrıntısı SSH tüneli ve port yönlendirme yazısındadır. Güvenlik duvarı kurallarının mantığı için UFW güvenlik duvarı rehberi işinizi görür.
Sık Karşılaşılan Sorunlar ve Teşhisi#
Belirti: Cevaplar çok yavaş, GPU aldığınıza pişmansınız.
Sebep: Model VRAM'e sığmamış, katmanların bir kısmı CPU'da çalışıyor.
Çözüm: ollama ps ile PROCESSOR sütununu okuyun. 100% GPU değilse bir alt model boyutuna inin veya OLLAMA_MAX_LOADED_MODELS=1 ile ikinci modelin belleği işgal etmesini engelleyin.
Belirti: ollama run sırasında bellek yetersizliği hatası.
Sebep: Kartta başka bir süreç yer kaplıyor ya da bağlam penceresi çok geniş.
Çözüm: nvidia-smi ile kartta kimin oturduğuna bakın. Sıklıkla eski bir konteyner veya çakılmış bir süreç kalmıştır. Bağlam tarafında modeli daha kısa pencereyle çağırın.
Belirti: Open WebUI açılıyor ama model listesi boş.
Sebep: Konteyner OLLAMA_BASE_URL adresine ulaşamıyor.
Çözüm: Konteynerin içinden test edin: docker exec -it open-webui curl -s http://127.0.0.1:11434/api/tags. Köprü ağındaysanız 127.0.0.1 konteynerin kendisini işaret eder; bu klasik hatadır, ana makinenin adresini yazın.
Belirti: Cevap yazılmaya başlıyor, ortasında kesiliyor.
Sebep: Nginx proxy_read_timeout süresi doldu.
Çözüm: Yukarıdaki yapılandırmadaki 600 saniyelik değerleri uygulayın ve Nginx'i yeniden yükleyin.
Belirti: Disk doldu, sunucu tuhaf davranmaya başladı.
Sebep: Denenip bırakılmış model dosyaları birikti; her biri 5–40 GB.
Çözüm: ollama list ile döküm alın, ollama rm model:etiket ile temizleyin. Model dizinini ayrı bir diske almak kök diski korur.
Bakım, Güncelleme ve İzleme#
Ollama'yı güncellemek kurulum betiğini yeniden çalıştırmak kadar basittir ve drop-in dosyanız korunur:
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl restart ollama
journalctl -u ollama -n 50 --no-pager
Open WebUI için imajı çekip konteyneri yeniden oluşturmanız yeterlidir; veriler adlandırılmış birimde durduğu için kaybolmaz:
docker pull ghcr.io/open-webui/open-webui:main
docker stop open-webui && docker rm open-webui
# yukarıdaki docker run komutunu aynen tekrar çalıştırın
İzleme tarafında iki metriği takip edin: GPU doluluğu ve model dizininin disk kullanımı.
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv -l 5
df -h /srv/ollama
GPU belleği sürekli tepede duruyorsa OLLAMA_KEEP_ALIVE süresini kısaltın. Sürekli boş görünüyorsa modeliniz aslında CPU'da çalışıyor olabilir; ollama ps çıktısıyla teyit edin.
Son bir hatırlatma: yedekleme planınıza Open WebUI'nin veri birimini eklemeyi unutmayın. Modelleri her zaman yeniden indirebilirsiniz ama kullanıcı hesapları, sohbet geçmişi ve özel istem şablonları o birimde durur ve yeniden üretilemez.
Sıkça Sorulan Sorular#
Ollama'yı GPU'suz bir VDS'te çalıştırabilir miyim?#
Evet, çalışır ama beklentinizi doğru kurun. 8B boyutunda bir model sunucu sınıfı bir CPU'da saniyede 6–12 token üretir; bu, bir paragrafın yaklaşık 15–20 saniyede yazılması demektir. Tek kişilik, arada bir kullanılan bir iç araç için katlanılabilir. Birden fazla kişi aynı anda kullanacaksa istekler sıraya gireceği için bekleme süreleri hızla kabul edilemez hâle gelir.
Hangi model boyutunu seçmeliyim?#
Kartınızın VRAM'inin yaklaşık yarısını ağırlıklara ayıracak şekilde seçin, kalanı bağlam penceresine ve motora kalsın. 12 GB kartta 8B, 24 GB kartta 14B veya rahat bir 32B, 48 GB'da 70B mantıklıdır. Daha büyük model her zaman daha iyi cevap vermez; özetleme ve sınıflandırma gibi işlerde 8B sınıfı modeller çoğu kurumsal ihtiyacı fazlasıyla karşılar.
Verilerim gerçekten sunucumdan çıkmıyor mu?#
Ollama modeli indirdikten sonra çıkarım tamamen yereldir; istemleriniz ve cevaplar dışarı gitmez. Dikkat etmeniz gereken nokta çevre bileşenleridir. Open WebUI'de bir web arama eklentisi veya harici bir API anahtarı tanımlarsanız o özellik üzerinden veri dışarı çıkabilir. Kapalı devre kalmak istiyorsanız bu entegrasyonları hiç etkinleştirmeyin.
Ollama API'sini internete açmak neden bu kadar tehlikeli?#
Çünkü API'de hiçbir kimlik doğrulama katmanı yoktur. Portu açtığınız anda herkes model çalıştırabilir, GPU'nuzu tüketebilir ve /api/pull ile diskinize istediği modeli indirtebilir. İnternete açılması gereken tek bileşen, kullanıcı hesaplarına sahip olan Open WebUI'dir ve o da HTTPS sonlandıran bir ters vekilin arkasında durmalıdır.
Aynı sunucuda birden fazla model bulundurabilir miyim?#
Diskte istediğiniz kadar model tutabilirsiniz; sınır sadece disk alanıdır. Asıl kısıt bellektedir: aynı anda yüklü model sayısını OLLAMA_MAX_LOADED_MODELS belirler ve her yüklü model kendi VRAM payını tüketir. Dar VRAM'de bu değeri 1 tutun. Ollama modeller arasında geçiş yaparken birkaç saniyelik bir yükleme gecikmesi yaşarsınız ama taşma yaşamazsınız.
Open WebUI'de kullanıcıları nasıl yönetirim?#
İlk kaydolan hesap yönetici olur. Yönetici panelinden yeni kullanıcı ekleyebilir, rollerini belirleyebilir ve hangi modellere erişebileceklerini kısıtlayabilirsiniz. Kendi hesabınızı oluşturduktan hemen sonra açık kaydı kapatın; aksi hâlde adresi bulan herkes hesap açabilir. Kullanıcı sayınız arttıkça hesapları elle eklemek yerine kurumsal kimlik sağlayıcınızla entegrasyonu değerlendirin.