İçindekiler

Giriş

Part 1'de temel altyapımızı kurduk ve Caddy web sunucumuzu yapılandırdık. Bu bölümde uygulamalarımızı deploy edecek, CI/CD pipeline kuracak ve monitoring sistemini oluşturacağız.

Uygulama Deploymentları

API Uygulaması

API uygulamamız için docker-compose.yml:

services:
  api:
    build:
      context: ..
      dockerfile: docker/Dockerfile
    container_name: api
    networks:
      - frontrowai_network
    expose:
      - "3000"
    restart: always
    env_file:
      - .env
    volumes:
      - api_data:/app/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  frontrowai_network:
    external: true

volumes:
  api_data:

n8n Uygulaması

n8n için docker-compose.yml:

version: '3'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    networks:
      - frontrowai_network
    expose:
      - "5678"
    restart: always
    environment:
      - N8N_HOST=n8n.frontrowai.com
      - N8N_PROTOCOL=https
      - N8N_PORT=443
      - NODE_ENV=production
      - N8N_ENCRYPTION_KEY=your-secret-key-here
      - WEBHOOK_URL=https://n8n.frontrowai.com/
    volumes:
      - n8n_data:/home/node/.n8n

networks:
  frontrowai_network:
    external: true

volumes:
  n8n_data:

CI/CD Pipeline Kurulumu

GitHub Actions Workflow

.github/workflows/deploy.yml:

name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Deploy to Droplet
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.DROPLET_IP }}
          username: root
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /opt/docker/api
            git pull
            docker compose down
            docker compose up -d --build

GitHub Secrets Ayarları

Repository > Settings > Secrets:

  • DROPLET_IP: Droplet'ın IP adresi
  • SSH_PRIVATE_KEY: SSH private key

SSH Key Oluşturma

# Local makinede
ssh-keygen -t ed25519 -C "deployment-key"
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

# Public key'i GitHub'a ekle
cat ~/.ssh/id_ed25519.pub

Monitoring ve Logging

Prometheus ve Grafana Kurulumu

/opt/docker/monitoring/docker-compose.yml:

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    networks:
      - frontrowai_network

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - frontrowai_network
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your-secure-password

networks:
  frontrowai_network:
    external: true

volumes:
  prometheus_data:
  grafana_data:

Prometheus Yapılandırması

prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'api'
    static_configs:
      - targets: ['api:3000']

  - job_name: 'caddy'
    static_configs:
      - targets: ['caddy:2019']

Log Yönetimi

Log rotasyonu için logrotate yapılandırması:

# /etc/logrotate.d/docker-logs
/var/log/caddy/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}

Otomatik Backup

Backup Script

#!/bin/bash
# /opt/docker/backup/backup.sh

DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup"

# Volume verileri
tar -czf $BACKUP_DIR/volumes_$DATE.tar.gz \
    /var/lib/docker/volumes/

# Environment dosyaları
tar -czf $BACKUP_DIR/env_$DATE.tar.gz \
    /opt/docker/*/.env

# Konfigürasyon dosyaları
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
    /opt/docker/*/docker-compose.yml \
    /opt/docker/caddy/Caddyfile

# 14 günden eski backupları sil
find $BACKUP_DIR -type f -mtime +14 -delete

Cron Job Oluşturma

# Backup script'i çalıştırılabilir yap
chmod +x /opt/docker/backup/backup.sh

# Cron job ekle
echo "0 3 * * * /opt/docker/backup/backup.sh" | crontab -

Güvenlik Önlemleri

Fail2ban Kurulumu

# Fail2ban kur
apt install fail2ban

# Konfigürasyon
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
EOF

# Servisi başlat
systemctl restart fail2ban

Rate Limiting

Caddy konfigürasyonuna rate limiting ekleyelim:

(rate_limit) {
    rate_limit {
        zone dynamic_zone {
            key {remote_host}
            events 100
            window 10s
        }
    }
}

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

Monitoring Kontrolü

Temel Kontroller

# Container durumları
docker ps

# Resource kullanımı
docker stats

# Disk kullanımı
df -h

# Log kontrolü
tail -f /var/log/caddy/access.log

Sağlık Kontrolleri

# API sağlık kontrolü
curl https://api.frontrowai.com/health

# SSL sertifika kontrolü
curl -vI https://api.frontrowai.com

Sonuç

Bu makalede:

  • Uygulama deploymentlarını gerçekleştirdik
  • CI/CD pipeline kurduk
  • Monitoring ve logging sistemini yapılandırdık
  • Otomatik backup sistemi oluşturduk
  • Güvenlik önlemlerini aldık

Artık production ortamınız:

  • Otomatik deployment yapabilir
  • SSL sertifikalarını otomatik yönetir
  • Düzenli backup alır
  • Monitoring ve alerting sunar
  • Temel güvenlik önlemlerine sahiptir