← notlar

2026-03-10

Docker + Nginx ile 8 proje kurunca

Aynı yapıyı farklı müşteriler için tekrar tekrar kuruyorum: PostGIS, MongoDB, Redis container'ları, önünde Nginx, arkasında Jenkins. Her seferinde bir şey ters gidiyor.

Nginx host'ta, container'lar Docker'da

Nginx sunucunun üzerinde çalışıyor, container'ların içinde değil. Upstream'e Docker internal IP yazınca 502 alıyorsun:

# yanlış
upstream backend {
    server 172.26.0.2:8094;
}

# doğru
upstream backend {
    server 127.0.0.1:45431;
}

İlk seferde 20 dakika debug ettim. Container logları temiz, curl localhost:45431 çalışıyor, ama site 502. Upstream'i düzeltince düzeldi.

Port çakışması sessiz

Bir sunucuda 8 proje. Her projede 4 container, her birinin host port'u var. 30+ port. İkinci projeyi kurarken ilkinin port'unu verdim — ilk proje patladı, ikincisi çalıştı. Fark etmek zaman alıyor.

Veritabanında port registry tutuyorum artık. Hangi port kime ait kayıtlı. Yeni proje gelince sıradaki boş port otomatik atanıyor.

nginx.conf include'u

/etc/nginx/conf.d/proje-adi/ altına 5 tane config yazıyorsun. nginx -t geçiyor, reload ediyorsun — hala 404.

Ana nginx.conf'a include satırını eklememişsin. Config dosyaları var ama Nginx onları görmüyor. 2 kez unuttum.

include /etc/nginx/conf.d/proje-adi/*.conf;

Docker subnet çakışması

docker network create dediğinde Docker otomatik subnet veriyor. İki projenin subnet'i aynı aralığa düşebiliyor, ya da sunucunun kendi ağıyla çakışıyor.

Manuel vermek daha güvenli:

docker network create --subnet=172.26.0.0/24 proje-network

Her projeye ayrı /24 blok: 172.20, 172.21, 172.22...

Certbot sırası önemli

SSL almak için Certbot çalıştırıyorsun ama Nginx config'inde henüz SSL yok. Certbot challenge yapıyor, sertifika alıyor, sonra config'i güncelliyorsun.

Sırayı karıştırıp önce SSL config yazarsan Nginx reload'da patlar — sertifika dosyası yok çünkü.