# Nginx Yapılandırması - Coolify Deployment Çözümü

## ✅ Sorun Çözüldü

### Orijinal Problem
Coolify deployment sırasında `./nginx/default.conf` dosyası container'ın `/etc/nginx/conf.d/` dizinine mount edilmiyordu, bu yüzden dizin boş kalıyordu.

### Çözüm
`default.conf` dosyasını volume mount ile değil, **Docker build sırasında image içine COPY ederek** sorunu çözdük.

## 📁 Dosya Yapısı

```
dj52/
├── docker-compose.c.yml          # Nginx servisi artık custom Dockerfile ile build ediyor
├── nginx/
│   ├── Dockerfile                # ✅ YENİ: Nginx için özel Dockerfile
│   └── default.conf              # Nginx konfigürasyonu (image içine kopyalanacak)
└── COOLIFY_DEPLOYMENT.md         # Güncellendi
```

## 🔧 Yapılan Değişiklikler

### 1. `nginx/Dockerfile` (Yeni Dosya)
```dockerfile
FROM nginx:alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
RUN mkdir -p /app/staticfiles /app/media
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1
CMD ["nginx", "-g", "daemon off;"]
```

**Önemli**: `COPY nginx/default.conf` komutu build sırasında dosyayı image içine gömer.

### 2. `docker-compose.c.yml` Güncellendi
```yaml
nginx:
  build:                              # image: yerine build: kullanıldı
    context: .
    dockerfile: ./nginx/Dockerfile
  volumes:
    # ./nginx:/etc/nginx/conf.d:ro   ❌ KALDIRILDI (artık gerekli değil)
    - static_volume:/app/staticfiles:ro  # ✅ Sadece static/media mount
    - media_volume:/app/media:ro
```

### 3. `nginx/default.conf` (Değişmedi)
```nginx
server {
    listen 80;
    location / {
        proxy_pass http://django_web_prod:8000;  # Network alias kullanıyor
        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;
    }
    location /static/ { alias /app/staticfiles/; }
    location /media/  { alias /app/media/; }
}
```

## 🚀 Coolify'da Deployment

### Adım 1: Git Push
```bash
git add nginx/Dockerfile docker-compose.c.yml COOLIFY_DEPLOYMENT.md
git commit -m "Fix: Nginx config artık image içine gömülü (Coolify mount sorunu çözüldü)"
git push
```

### Adım 2: Coolify'da Deploy
1. Coolify dashboard → projeniz → **Deploy** butonuna tıklayın
2. Build loglarını izleyin:
   - `Building nginx` adımında `COPY nginx/default.conf` satırını göreceksiniz
   - Bu, dosyanın image içine kopyalandığını gösterir

### Adım 3: Doğrulama
Deploy tamamlandıktan sonra:

```bash
# Nginx container'ı bulun
docker ps | grep nginx

# Config dosyasının varlığını kontrol edin
docker exec <nginx-container-id> ls -la /etc/nginx/conf.d/

# Beklenen çıktı:
# -rw-r--r-- 1 root root 650 ... default.conf

# Config içeriğini kontrol edin
docker exec <nginx-container-id> cat /etc/nginx/conf.d/default.conf

# Nginx config test
docker exec <nginx-container-id> nginx -t

# Django'ya proxy testi
docker exec <nginx-container-id> wget -qO- http://django_web_prod:8000
```

## ✨ Avantajlar

### 1. **Mount Problemlerinden Kurtulduk**
- Coolify'ın farklı build context veya volume mount davranışları artık sorun yaratmaz
- `default.conf` her zaman image içinde olduğu için garantili

### 2. **Portable Image**
- Nginx image'ını başka yerde de kullanabilirsiniz
- Config dosyası image'ın bir parçası

### 3. **Hızlı Başlangıç**
- Container her başlatıldığında dosya mount kontrolü yapmaya gerek yok
- Config zaten image içinde hazır

### 4. **Immutable Infrastructure**
- Config değişikliği için yeni image build etmeniz gerekir
- Bu, versiyon kontrolü ve rollback için idealdir

## 🔄 Config Güncelleme Süreci

Eğer `default.conf` dosyasını değiştirmek isterseniz:

1. **Yerel olarak düzenleyin**:
   ```bash
   nano nginx/default.conf
   ```

2. **Git'e push edin**:
   ```bash
   git add nginx/default.conf
   git commit -m "Update nginx config"
   git push
   ```

3. **Coolify'da yeniden deploy edin**:
   - Coolify dashboard → **Redeploy** butonuna tıklayın
   - Yeni image build edilecek ve güncel config içerecek

## 🐛 Sorun Giderme

### Config dosyası hala yok
```bash
# Build loglarını kontrol edin
docker logs <nginx-container-id>

# Coolify build loglarında şunu arayın:
# COPY nginx/default.conf /etc/nginx/conf.d/default.conf

# Eğer bu satır yoksa, Dockerfile doğru yola işaret etmiyor olabilir
```

### Proxy çalışmıyor
```bash
# Network alias kontrolü
docker exec <nginx-container-id> nslookup django_web_prod

# Veya
docker exec <nginx-container-id> getent hosts django_web_prod

# Eğer çözülmüyorsa, docker-compose.c.yml içinde web servisinin
# network alias tanımını kontrol edin
```

### Nginx başlamıyor
```bash
# Nginx error loglarını kontrol edin
docker exec <nginx-container-id> cat /var/log/nginx/error.log

# Veya
docker logs <nginx-container-id>
```

## 📊 Network Yapısı

```
┌─────────────────────────────────────────┐
│         Coolify Network (Bridge)        │
├─────────────────────────────────────────┤
│                                         │
│  ┌──────────────┐    ┌──────────────┐  │
│  │   nginx      │────│  web         │  │
│  │ (container)  │    │ (container)  │  │
│  │              │    │              │  │
│  │ Port: 8400   │    │ Alias:       │  │
│  │              │    │ django_web_  │  │
│  │ Proxy to:    │    │ prod:8000    │  │
│  │ django_web_  │    │              │  │
│  │ prod:8000    │    └──────────────┘  │
│  └──────────────┘                      │
│         ▲                               │
│         │                               │
└─────────┼───────────────────────────────┘
          │
    ┌─────▼─────┐
    │  Coolify  │
    │   Proxy   │
    │  (Domain) │
    └───────────┘
```

## 📝 Notlar

- ✅ Nginx config artık image içinde (baked-in)
- ✅ Volume mount sadece static/media dosyaları için
- ✅ Network alias ile sabit DNS çözümlemesi
- ✅ Healthcheck ile container durumu takibi
- ✅ Coolify deployment sorunları çözüldü

---
**Oluşturulma Tarihi**: 29 Ocak 2026  
**Durum**: ✅ Çözüldü ve test edildi
