İçindekiler

Giriş

Bu makalede, bir web uygulamasını Docker kullanarak DigitalOcean Droplet üzerinde nasıl deploy edeceğimizi öğreneceğiz. İlk bölümde temel kurulumları ve Caddy web sunucusu yapılandırmasını ele alacağız.

Web Sunucusu Seçimi: Caddy vs Nginx

Nginx Nedir?

Nginx, yüksek performanslı, açık kaynaklı bir web sunucusudur. Özellikle yüksek trafik alan sitelerde tercih edilir. Yapılandırılması karmaşık olabilir ancak geniş bir topluluk desteği ve dokümantasyona sahiptir.

Caddy Nedir?

Caddy, Go dilinde yazılmış modern bir web sunucusudur. En önemli özelliği otomatik SSL sertifika yönetimidir. Let's Encrypt entegrasyonu sayesinde manuel müdahale gerektirmeden HTTPS güvenliğini sağlar.

Karşılaştırma

Konfigürasyon

Nginx:

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    location / {
        proxy_pass http://backend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Caddy:

example.com {
    reverse_proxy backend:3000
}

Öne Çıkan Özellikler

Nginx:

  • Yüksek performans
  • Geniş modül ekosistemi
  • Load balancing özellikleri
  • Detaylı konfigürasyon imkanı
  • Olgun ve test edilmiş

Caddy:

  • Otomatik HTTPS
  • HTTP/3 desteği
  • Basit konfigürasyon
  • Modern varsayılan ayarlar
  • API Gateway özellikleri
  • On-demand TLS

Neden Caddy Seçtik?

  1. Kolay Kurulum: Tek bir binary ile çalışır, ek paketlere ihtiyaç duymaz.
  2. Otomatik SSL: Let's Encrypt entegrasyonu ile SSL sertifikalarını otomatik yönetir.
  3. Modern Defaults: Güvenlik ayarları varsayılan olarak en iyi pratiklere uygun.
  4. Docker Uyumluluğu: Container ortamında sorunsuz çalışır.
  5. Basit Konfigürasyon: Okunması ve yazılması kolay yapılandırma dosyası.

Gereksinimler

  • DigitalOcean hesabı
  • Bir domain adı
  • Temel Linux ve Docker bilgisi

Başlangıç Kurulumları

Droplet Oluşturma

DigitalOcean'da yeni bir Droplet oluşturalım:

- Image: Ubuntu 22.04 LTS
- Size: Basic Plan (2GB/1CPU)
- Region: Frankfurt (ya da size en yakın datacenter)
- Authentication: SSH key (güvenlik için önerilen)

DNS Ayarları

Domain sağlayıcınızda şu A kayıtlarını ekleyin:

api.frontrowai.com    -> Droplet IP
n8n.frontrowai.com    -> Droplet IP
frontrowai.com        -> Droplet IP

Temel Kurulumlar

Droplet'a SSH ile bağlanıp gerekli kurulumları yapalım:

# Sistem güncellemesi
apt update && apt upgrade -y

# Docker kurulumu
apt install -y docker.io docker-compose

# Docker'ı başlatma ve otomatik başlatma ayarı
systemctl start docker
systemctl enable docker

Proje Yapısı

Projemiz için temel dizin yapısını oluşturalım:

mkdir -p /opt/docker
cd /opt/docker

# Alt dizinler
mkdir caddy api n8n
mkdir -p /var/log/caddy

Caddy Web Sunucusu Kurulumu

docker-compose.yml

version: '3'

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - /var/log/caddy:/var/log/caddy
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - frontrowai_network
    restart: always

networks:
  frontrowai_network:
    external: true

volumes:
  caddy_data:
  caddy_config:

Volume Yapılandırması Açıklaması

  1. Caddyfile Mount:

    • ./Caddyfile:/etc/caddy/Caddyfile
    • Host makinedeki Caddyfile'ı container içine bağlar
    • Konfigürasyon değişikliklerini kolaylaştırır
  2. Log Dizini:

    • /var/log/caddy:/var/log/caddy
    • Access ve error loglarını host makinede saklar
    • Log rotasyonu ve analizi için erişilebilir
  3. Caddy Data:

    • caddy_data:/data
    • SSL sertifikalarını ve diğer kalıcı verileri saklar
    • Container silinse bile veriler korunur
  4. Caddy Config:

    • caddy_config:/config
    • Runtime konfigürasyon verilerini saklar
    • Caddy'nin iç yapılandırma dosyaları

Caddyfile

{
    email your-email@example.com
}

(common) {
    header {
        # CORS ayarları
        Access-Control-Allow-Origin *
        Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
        Access-Control-Allow-Headers *
        # Security headers
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options "nosniff"
    }
    # SSL
    tls {
        protocols tls1.2 tls1.3
    }
}

api.frontrowai.com {
    import common
    reverse_proxy api:3000
}

n8n.frontrowai.com {
    import common
    reverse_proxy n8n:5678
}

Header Yapılandırması Açıklaması

  1. CORS Headers:

    • Access-Control-Allow-Origin: Hangi domainlerin erişebileceğini belirler
    • Access-Control-Allow-Methods: İzin verilen HTTP metodları
    • Access-Control-Allow-Headers: İzin verilen HTTP başlıkları
  2. Security Headers:

    • Strict-Transport-Security: HTTPS kullanımını zorunlu kılar
    • X-Content-Type-Options: MIME type sniffing'i engeller
    • X-Frame-Options: Clickjacking saldırılarına karşı koruma

Network Oluşturma

Docker container'ları arasındaki iletişim için bir network oluşturalım:

docker network create frontrowai_network

Servisleri Başlatma

# Caddy'yi başlat
cd /opt/docker/caddy
docker compose up -d

# Logları kontrol et
docker compose logs -f

Güvenlik Ayarları

Firewall Yapılandırması

# UFW Firewall kurulumu
apt install ufw

# Gerekli portları aç
ufw allow 22/tcp    # SSH
ufw allow 80/tcp    # HTTP
ufw allow 443/tcp   # HTTPS

# Firewall'u etkinleştir
ufw enable

SSL/TLS Güvenliği

Caddy otomatik olarak:

  • Let's Encrypt sertifikaları alır
  • Sertifikaları yeniler
  • Modern TLS protokollerini kullanır
  • HTTPS yönlendirmelerini yönetir

Hata Ayıklama ve Log İnceleme

Caddy Logları

# Canlı log takibi
docker compose logs -f caddy

# Son 100 log satırı
docker compose logs --tail 100 caddy

SSL Sertifika Kontrolü

# Sertifika durumunu kontrol et
curl -vI https://api.frontrowai.com

Sonuç

Bu noktada:

  • Temel sunucu kurulumlarını tamamladık
  • Caddy web sunucusunu kurduk ve yapılandırdık
  • SSL sertifikalarını otomatik olarak alacak şekilde ayarladık
  • Temel güvenlik önlemlerini aldık

Part 2'de uygulamaların deployment sürecini, CI/CD pipeline kurulumunu ve monitoring ayarlarını ele alacağız.