Bu rehberde gerçek Ubuntu 24.04.4 LTS VPS üzerinde Ollama'yı Docker ile yalnız localhost API'sinde çalıştırdık, qwen3:4b modelini indirip gerçek inference testi yaptık, Open WebUI'ı aynı private Docker ağına bağladık, openwebui.ekasunucu.com için Nginx + Let's Encrypt HTTPS kurduk ve 11434/3000 portlarını internete açmadan tarayıcıdan kullanılabilen tamamen self-hosted bir yerel AI ortamı oluşturduk.
Ubuntu 24.04.4 LTS
↓ Docker / eka-ai
Ollama 0.32.6 :11434
↓ qwen3:4b
Open WebUI :8080
↓ 127.0.0.1:3000
Nginx + Let's Encrypt :443
↓
openwebui.ekasunucu.comBu rehber, gerçek bir Ubuntu 24.04.4 LTS VPS üzerinde kurduğumuz yerel yapay zeka zincirini baştan sona belgeler. Ollama model çalışma katmanı, qwen3:4b yerel dil modeli ve Open WebUI tarayıcı arayüzü aynı Docker ağı içinde çalışır.
Final mimaride Ollama API'si 127.0.0.1:11434, Open WebUI ise 127.0.0.1:3000 üzerinde hosta bind edilir. Kullanıcıya açık tek web katmanı Nginx 443 + Let's Encrypt HTTPS'dir; Open WebUI containerı Ollama'ya ortak eka-ai Docker ağı üzerinden http://ollama:11434 adresiyle ulaşır.
Internet :443
↓
Nginx + Let's Encrypt
↓
127.0.0.1:3000 → Open WebUI :8080
↓ eka-ai Docker ağı
ollama:11434 → qwen3:4bTest VPS'imiz Ubuntu 24.04.4 LTS, 8 vCPU ve yaklaşık 31 GiB RAM ile çalışıyordu. Görünen işlemci AMD Ryzen 9 7950X tabanlıydı. NVIDIA sürücüsü ve ROCm compute aygıtı bulunmadığı için kurulumun ilk doğrulaması CPU modunda yapıldı.
Yerel modeller RAM ve disk tüketir. Model seçimini yalnız parametre sayısına göre değil, quantization, context, eşzamanlı kullanıcı ve işletim sistemi payını da hesaba katarak yapın.
cat /etc/os-release | grep -E 'PRETTY_NAME|VERSION_ID|VERSION_CODENAME'
uname -r
free -h
df -h /lscpu | grep -E 'Architecture|CPU\(s\)|Model name'
nvidia-smi 2>/dev/null || true
ls -la /dev/dri 2>/dev/null || trueOllama ve Open WebUI'ı Docker üzerinde çalıştırdığımız için önce Docker daemonını ve Compose eklentisini doğruladık. Gerçek testte Docker Engine 29.7.2 ve Docker Compose v5.4.0 aktifti.
Docker henüz kurulu değilse önce Ubuntu 24.04 Docker ve Portainer rehberindeki resmî Docker repository kurulumunu tamamlayabilirsiniz.
docker --version
docker compose version
systemctl is-active dockerOllama ile Open WebUI'ın birbirini container adıyla bulabilmesi için özel bridge ağı olarak eka-ai oluşturduk. Ollama modellerinin container yeniden oluşturulduğunda kaybolmaması için ollama_data named volume kullandık.
Bu ayrım önemlidir: container silinebilir veya image güncellenebilir; model dosyaları named volume içinde kalır. Volume silme işlemlerini yedek almadan uygulamayın.
docker network inspect eka-ai >/dev/null 2>&1 || docker network create eka-ai
docker volume create ollama_datadocker network inspect eka-ai --format 'Ag={{.Name}} Driver={{.Driver}} Scope={{.Scope}}'
docker volume inspect ollama_dataTestte GPU passthrough algılanmadığı için resmî Ollama Docker image'ını CPU modunda çalıştırdık. Host tarafındaki 11434 portunu 0.0.0.0 yerine 127.0.0.1'e bağladık; böylece Ollama API'si doğrudan internete yayınlanmadı.
Container aynı zamanda eka-ai ağına bağlandı. Bu sayede ileride Open WebUI, hostun private adresini bilmeden ollama:11434 üzerinden API'ye erişebilir.
docker pull ollama/ollama:latestdocker run -d --name ollama --restart unless-stopped --network eka-ai -p 127.0.0.1:11434:11434 -v ollama_data:/root/.ollama ollama/ollama:latestdocker ps --filter name='^/ollama$'
curl -sS http://127.0.0.1:11434/api/tagsOllama ayağa kalktıktan sonra qwen3:4b modelini container içine indirdik. Gerçek API çıktısında model yaklaşık 2.5 GB depolama kullanıyor, 4.0B parameter_size ve Q4_K_M quantization bilgisiyle listeleniyordu.
Model indirme süresi disk, hat ve Ollama registry erişimine göre değişir. Pull işlemi tamamlanmadan Open WebUI tarafında model seçimi yapmaya çalışmayın.
docker exec ollama ollama pull qwen3:4bdocker exec ollama ollama list
curl -sS http://127.0.0.1:11434/api/tagsModelin listede görünmesi tek başına inference'ın çalıştığını kanıtlamaz. Bu nedenle /api/chat endpointine gerçek bir mesaj gönderdik ve qwen3:4b'nin beklenen metni ürettiğini doğruladık.
CPU testinde model aktifken Ollama yaklaşık 3 GiB RAM kullanıyor ve çalışan model 100% CPU olarak görünüyordu. Bu değerler yalnız bizim test anımıza aittir; prompt ve context büyüdükçe tüketim değişir.
curl -sS http://127.0.0.1:11434/api/chat -d '{"model":"qwen3:4b","messages":[{"role":"user","content":"Sadece EKA-OLLAMA-TEST-BASARILI yaz."}],"stream":false}'docker exec ollama ollama ps
docker stats --no-stream ollamaFinal Ollama kontrolünde host API adresi http://127.0.0.1:11434, Docker ağı içindeki servis adresi ise http://ollama:11434 olarak belirlendi. 11434 yalnız loopback üzerinde dinliyordu.
Bu mimari Open WebUI'ın Ollama'ya private Docker ağı üzerinden ulaşmasını, internet kullanıcılarının ise Ollama API'sine doğrudan erişememesini sağlar.
ss -lntp | grep ':11434'docker network inspect eka-ai --format '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}'docker exec ollama ollama listOpen WebUI için openwebui.ekasunucu.com alan adını test VPS IP'sine yönlendirdik ve DNS çözümlemesini doğruladık. Open WebUI verileri için openwebui_data named volume oluşturuldu.
Ayrıca oturum ve uygulama güvenliği için WEBUI_SECRET_KEY üretildi. Üretim ortamında bu değeri güvenli bir dosyada veya secret manager içinde kalıcı tutun; containerı yeniden oluştururken rastgele farklı bir key ile değiştirmeyin.
dig +short openwebui.ekasunucu.com @1.1.1.1
dig +short openwebui.ekasunucu.com @8.8.8.8docker volume create openwebui_dataumask 077
[ -s /root/.openwebui_secret_key ] || openssl rand -hex 32 > /root/.openwebui_secret_key
WEBUI_SECRET_KEY="$(cat /root/.openwebui_secret_key)"Gerçek testte ghcr.io/open-webui/open-webui:main image'ı kullanıldı. Host portu 127.0.0.1:3000 ile sınırlandırıldı, container içi uygulama portu 8080 olarak kaldı ve openwebui_data /app/backend/data konumuna bağlandı.
Ollama aynı eka-ai ağında olduğu için OLLAMA_BASE_URL değerini http://ollama:11434 olarak verdik. Bu yaklaşım iki container arasında Docker DNS adını kullanır ve host üzerinde Ollama portunu public açmayı gerektirmez.
docker pull ghcr.io/open-webui/open-webui:mainWEBUI_SECRET_KEY="$(cat /root/.openwebui_secret_key)"
docker run -d --name open-webui --restart unless-stopped --network eka-ai -p 127.0.0.1:3000:8080 -e OLLAMA_BASE_URL=http://ollama:11434 -e WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" -v openwebui_data:/app/backend/data ghcr.io/open-webui/open-webui:maindocker ps --filter name='^/open-webui$'Open WebUI ilk başlatmada veritabanı migrationları ve bazı yerel yardımcı modelleri hazırlayabilir. Bizim testimizde ilk dakikalarda connection reset ve HTTP 000 sonuçları görüldü; container çalışıyor olsa da health henüz hazır değildi.
Loglarda migrationlar tamamlandıktan ve embedding modeli yüklendikten sonra /health endpointi 200 ve {"status":true} döndürdü. İlk boot sırasında containerı tekrar tekrar silip oluşturmak yerine logları izlemek daha doğru teşhis sağlar.
docker logs -f --tail 150 open-webuiuntil [ "$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:3000/health || true)" = "200" ]; do sleep 5; done
curl -sS http://127.0.0.1:3000/healthdocker inspect open-webui --format 'Durum={{.State.Status}} Health={{if .State.Health}}{{.State.Health.Status}}{{else}}yok{{end}}'Host üzerindeki Ollama testi başarılı olsa bile Open WebUI containerından erişim ayrıca doğrulanmalıdır. Aynı Docker ağı kullanıldığında hedef adres ollama:11434'tür.
Open WebUI arayüzü model listesini bu bağlantı üzerinden alır. Eğer qwen3:4b görünmüyorsa önce Ollama containerındaki /api/tags sonucunu, sonra Open WebUI connection ayarını ve Docker network üyeliğini kontrol edin.
docker exec open-webui python -c "import urllib.request; print(urllib.request.urlopen('http://ollama:11434/api/tags').read().decode())"docker network inspect eka-ai --format '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}'Open WebUI host portunu internete açmak yerine Nginx'i public giriş katmanı yaptık. Nginx 80/443 üzerinde dinler, istekleri 127.0.0.1:3000'e iletir ve WebSocket upgrade başlıklarını korur.
Sunucu adını doğru yazın, yapılandırmayı etkinleştirdikten sonra mutlaka nginx -t çalıştırın. Syntax testi başarılı olmadan reload yapmayın.
cat >/etc/nginx/sites-available/openwebui.ekasunucu.com <<'EOF'
server {
listen 80;
listen [::]:80;
server_name openwebui.ekasunucu.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
}
}
EOF
ln -sfn /etc/nginx/sites-available/openwebui.ekasunucu.com /etc/nginx/sites-enabled/openwebui.ekasunucu.com
nginx -t
systemctl reload nginxNginx reverse proxy hazırlandıktan sonra Certbot ile openwebui.ekasunucu.com için Let's Encrypt sertifikası aldık. Gerçek testte sertifika Nginx yapılandırmasına başarıyla deploy edildi.
Final kontrolde hem origin HTTPS hem domain HTTPS isteği 200 döndü. Böylece kullanıcılar artık localhost portunu veya Docker portunu değil doğrudan güvenli alan adını kullanır.
certbot --nginx -d openwebui.ekasunucu.comcurl -I https://openwebui.ekasunucu.comcertbot certificatesKurulumun final port kontrolünde Ollama 127.0.0.1:11434, Open WebUI 127.0.0.1:3000 üzerinde; Nginx ise public 80 ve 443 üzerinde dinliyordu. Bu ayrım özellikle Ollama API'sinin internete kimlik doğrulamasız açılmasını engeller.
Docker publish kuralları firewall davranışını etkileyebildiği için yalnız UFW çıktısına güvenmeyin. ss ile gerçek dinleyen socketleri ve docker ps ile publish edilen portları birlikte kontrol edin.
ss -lntp | grep -E ':80 |:443 |:3000 |:11434' || truedocker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'Let's Encrypt kurulduktan sonra otomatik yenileme mekanizmasını varsaymak yerine certbot renew --dry-run ile simülasyon yaptık. Open WebUI ve Portainer sertifikalarının test yenilemeleri başarılı tamamlandı.
Final durumda Open WebUI healthy, Ollama çalışıyor, domain HTTPS 200 ve systemctl --failed çıktısı boştu. Bu kontroller kurulumun yalnız açıldığını değil, temel servis zincirinin birlikte sağlıklı olduğunu gösterir.
certbot renew --dry-runcurl -sS -o /dev/null -w '%{http_code}\n' https://openwebui.ekasunucu.comdocker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
systemctl --failedAltyapı tamamlandıktan sonra tarayıcıdan https://openwebui.ekasunucu.com adresini açtık. İlk ekranda Open WebUI karşılama sayfası görüntülendi ve Başlayın düğmesiyle hesap kurulumuna geçildi.
Bu aşamada adres çubuğunda doğrudan domain kullanılması önemlidir. 3000 portuna public erişim gerekmemeli; Nginx ve TLS katmanı kullanıcı trafiğini karşılamalıdır.
Open WebUI ilk kullanıcı kayıt ekranında ad, e-posta ve güçlü parola ile yönetici hesabını oluşturduk. İlk oluşturulan hesap yönetim ayarlarına erişen ana hesaptır.
Üretimde kişisel veya ortak kullanılan zayıf parola tercih etmeyin. Yönetici hesabını oluşturduktan sonra yeni kullanıcı kayıt/approval politikasını ihtiyacınıza göre ayrıca kontrol edin.
Yönetici hesabı tamamlandığında Open WebUI model listesinden qwen3:4b seçilebilir hale geldi. Böylece tarayıcı arayüzü → Open WebUI → Ollama → qwen3:4b zinciri uçtan uca tamamlandı.
Bu mimaride model inference Ollama üzerinde sunucuda gerçekleşir. Open WebUI ise sohbet geçmişi, kullanıcı arayüzü ve bağlantı katmanını sağlar. Daha büyük model kullanacaksanız CPU/RAM/GPU kapasitesini yeniden planlayın.
Ollama model verisi ollama_data, Open WebUI uygulama verisi openwebui_data volume'unda tutulur. Güncelleme öncesi VPS snapshotı ve volume yedeği almak, rollback ihtiyacında işleri kolaylaştırır.
Gerçek test :main image'ıyla yapılmıştır. Üretimde önce yedek alın, image sürümünü bilinçli güncelleyin, containerı yeniden oluşturduktan sonra /health, Ollama /api/tags, domain HTTPS, port bindleri ve reboot sonrası otomatik başlangıcı tekrar doğrulayın.
docker run --rm -v ollama_data:/kaynak -v /root:/yedek alpine sh -c 'tar czf /yedek/ollama_data-$(date +%F).tar.gz -C /kaynak .'docker run --rm -v openwebui_data:/kaynak -v /root:/yedek alpine sh -c 'tar czf /yedek/openwebui_data-$(date +%F).tar.gz -C /kaynak .'docker restart ollama open-webui
curl -sS http://127.0.0.1:3000/health
curl -sS http://127.0.0.1:11434/api/tagsEvet. Bu gerçek testte Ollama 0.32.6 Ubuntu 24.04.4 LTS üzerinde Docker containerı olarak CPU modunda çalıştı.
Hayır. CPU ile çalışabilir ancak hız modele ve işlemciye göre değişir. Testimiz GPU passthrough olmadan qwen3:4b ile tamamlandı.
Ollama model listesinde yaklaşık 2.5 GB görünüyordu; API metadata'sı 4.0B ve Q4_K_M quantization bilgisi döndürdü.
Varsayılan Ollama API portu 11434'tür. Bu mimaride host tarafında yalnız 127.0.0.1:11434'e bind edildi.
Container içinde 8080, hostta ise yalnız 127.0.0.1:3000 kullanıldı. Public erişim Nginx 443 üzerinden sağlandı.
Aynı eka-ai Docker ağı içinde http://ollama:11434 kullanıldı. Ollama host üzerinde çalışıyorsa Open WebUI dokümantasyonu Docker için host.docker.internal:11434 seçeneğini de açıklar.
İlk başlatmada veritabanı migrationları ve embedding modeli hazırlığı yapılabilir. Testimizde birkaç dakika sonra /health 200 ve status true döndü.
Gerçek test :main ile yapıldı. Bu hareketli bir etikettir; kontrollü üretim güncellemeleri için test edilmiş sabit sürüm etiketi daha öngörülebilir olabilir.
Hayır. Bu rehberde ikisi de localhost ile sınırlandırıldı; yalnız Nginx 80/443 public dinledi.
Evet. Reverse proxy yapılandırmasında HTTP/1.1 ile Upgrade ve Connection başlıkları korunmalıdır.
Open WebUI'ın ilk oluşturulan hesabı yönetici ayrıcalıklarına sahip olur. Sonraki kullanıcı politikası yönetici ayarlarından kontrol edilmelidir.
openwebui_data named volume korunursa uygulama verisi containerdan bağımsız kalır. Volume'u silmek veri kaybına yol açabilir.
certbot renew --dry-run ile yenileme akışı gerçek sertifikayı değiştirmeden simüle edilebilir. Gerçek kurulumda test başarılı oldu.
Yeterli RAM, disk ve tercihen uygun GPU kaynağı varsa kullanılabilir. Model büyüdükçe inference süresi ve bellek gereksinimi artar; kapasiteyi modele göre seçin.
Ollama, Qwen3, Open WebUI, n8n ve diğer self-hosted AI servislerini kendi sunucunuzda çalıştırmak için EKA Sunucu Linux VPS paketlerini inceleyebilirsiniz.
Güncellendi: 10.08.2026