Docker ile Production Ortamına Deployment - Part 2

Docker ile Production Ortamına Deployment - Part 2
Photo by Bernd 📷 Dittrich / Unsplash

İç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

Read more

Docker ile Production Ortamına Deployment - Part 1

Docker ile Production Ortamına Deployment - Part 1

İçindekiler * Giriş * Web Sunucusu Seçimi: Caddy vs Nginx * Gereksinimler * Başlangıç Kurulumları * Proje Yapısı * Caddy Web Sunucusu Kurulumu * Network Oluşturma * Güvenlik Ayarları 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:

By Aykut Asil
Slack ve GitHub Actions ile Otomatik Dağıtım Bildirimleri

Slack ve GitHub Actions ile Otomatik Dağıtım Bildirimleri

Yazılım geliştirme süreçlerinde, dağıtım işlemleri sırasında ekibin bilgilendirilmesi, sorunsuz iş birliği ve hata takibi için kritik öneme sahiptir. GitHub Actions ile Slack’i entegre ederek, dağıtım sürecinin başlangıcı, başarılı bir şekilde tamamlanması veya hata durumları için ekibinize otomatik bildirimler gönderebilirsiniz. Bu makalede, bunu nasıl yapabileceğinizi adım adım anlatıyoruz. Neden Slack

By Aykut Asil