Bu rehberde gerçek Ubuntu 24.04.4 LTS VPS üzerinde Open WebUI’ı Docker ile kurduk, kalıcı openwebui_data volume ve WEBUI_SECRET_KEY hazırladık, uygulamayı yalnız 127.0.0.1:3000 üzerinde yayınladık, aynı eka-ai Docker ağındaki Ollama’ya http://ollama:11434 üzerinden bağladık ve openwebui.ekasunucu.com alan adını Nginx + Let’s Encrypt HTTPS ile kullanıma açtık. İlk health beklemesinden yönetici hesabına ve qwen3:4b sohbet paneline kadar gerçek ekran görüntülerini kullandık.
Ubuntu 24.04.4 LTS
↓ Docker / eka-ai
Open WebUI :8080
↓ 127.0.0.1:3000
↓
Ollama :11434 → qwen3:4b
↓
Nginx + Let’s Encrypt :443
↓
openwebui.ekasunucu.comOpen 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 Open WebUI v0.11.0 Ubuntu 24.04.4 LTS üzerinde Docker containerı olarak çalıştı.
Container içinde 8080 kullanıldı; host tarafında yalnız 127.0.0.1:3000’e bind edildi.
Her iki container aynı eka-ai Docker ağında olduğu için http://ollama:11434 adresi kullanıldı.
Hayır. Bu mimaride 11434 yalnız localhost’ta kaldı ve Open WebUI Ollama’ya Docker ağı üzerinden ulaştı.
İlk başlangıçta migrationlar ve embedding modeli hazırlığı yapılabilir. Gerçek testte ilk dakikalarda HTTP 000/connection reset görülüp birkaç dakika sonra /health 200 döndü.
Gerçek loglarda sentence-transformers/all-MiniLM-L6-v2 dosyalarının Hugging Face üzerinden indirildiği görüldü.
Oturum ve uygulama güvenliği için kullanılan kalıcı secret değeridir. Container yeniden oluşturulurken aynı değerin korunması gerekir.
Bu kurulumda openwebui_data named volume /app/backend/data yoluna bağlandı.
Evet. Reverse proxy’de HTTP/1.1, Upgrade ve Connection başlıklarının iletilmesi gerekir.
openwebui.ekasunucu.com Nginx vhost’u hazırlandıktan sonra Certbot --nginx ile Let’s Encrypt sertifikası alındı.
certbot renew --dry-run ile sertifika yenileme mekanizması canlı sertifikayı değiştirmeden test edilebilir.
İlk oluşturulan kullanıcı yönetici hesabı olarak kullanılır; sonrasında kullanıcı kayıt ve approval politikaları panelden yönetilebilir.
Ollama bağlantısı başarılı olduğunda qwen3:4b model listesinde görünür ve sohbet panelinden seçilebilir.
Gerçek test :main etiketiyle yapıldı. Üretimde kontrollü güncelleme için test edilmiş sabit bir sürüm etiketi daha öngörülebilir olabilir.
Ollama, Qwen3, Open WebUI ve n8n gibi self-hosted AI servislerini kendi sunucunuzda çalıştırmak için EKA Sunucu Linux VPS paketlerini inceleyebilirsiniz.
Güncellendi: 10.08.2026