Takip et

Docker Uygulamalarını DigitalOcean Droplet’e GitHub Actions ile Otomatik Dağıtma Rehberi

Önemli: SSH özel anahtarınızı kopyalarken, anahtarın tamamını (—–BEGIN OPENSSH PRIVATE KEY—– ile başlayıp —–END OPENSSH PRIVATE KEY—– i…

Docker Uygulamalarını DigitalOcean Droplet’e GitHub Actions ile Otomatik Dağıtma Rehberi

Modern yazılım geliştirme süreçlerinde hız, güvenilirlik ve otomasyon olmazsa olmazlardandır. Uygulamalarınızı konteynerize etmek ve bulut ortamlarına hızlıca dağıtmak, rekabetçi kalmak için kritik öneme sahiptir. Bu makalede, Docker konteynerlerinizi DigitalOcean Droplet’e GitHub Actions kullanarak nasıl otomatik olarak dağıtacağınızı adım adım inceleyeceğiz. Bu sayede, kodunuzu her push ettiğinizde uygulamanızın canlıya alınmasını sağlayarak geliştirme süreçlerinizi büyük ölçüde hızlandıracak ve insan hatasını minimize edeceksiniz.

1. Giriş: Modern Dağıtımın Önemi ve Araçlar

Günümüzün hızlı tempolu yazılım dünyasında, uygulamaların sürekli entegrasyon (CI) ve sürekli dağıtım (CD) prensipleriyle yönetilmesi, geliştiricilere büyük avantajlar sunar. Bu bölümde, bu prensiplerin temelini oluşturan kavramları ve kullanacağımız araçları tanıyacağız.

1.1. CI/CD Nedir ve Neden Önemlidir?

CI/CD (Continuous Integration/Continuous Delivery veya Continuous Deployment), yazılım geliştirme süreçlerini otomatikleştirmeyi amaçlayan bir dizi uygulamadır. Sürekli Entegrasyon (CI), geliştiricilerin kod değişikliklerini sık sık merkezi bir depoya birleştirmesini ve bu değişikliklerin otomatik olarak test edilmesini sağlar. Sürekli Dağıtım (CD) ise, testlerden geçen kodun otomatik olarak üretim ortamına dağıtılması sürecidir. Bu yaklaşım, hata oranını düşürür, dağıtım hızını artırır ve ekiplerin daha verimli çalışmasına olanak tanır.

1.2. Docker ve Konteynerleşmenin Avantajları

Docker, uygulamaları ve bağımlılıklarını “konteyner” adı verilen izole edilmiş birimler içinde paketlemeye yarayan açık kaynaklı bir platformdur. Konteynerleşme, uygulamaların farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını sağlar. “Bir kere yaz, her yerde çalıştır” felsefesiyle, bağımlılık sorunlarını ortadan kaldırır, dağıtımı basitleştirir ve ölçeklenebilirliği artırır.

1.3. GitHub Actions ve Otomasyon

GitHub Actions, GitHub depolarında doğrudan entegre edilmiş bir CI/CD platformudur. Kod değişiklikleri, pull request’ler veya manuel tetikleyiciler gibi belirli olaylara yanıt olarak otomatik iş akışları (workflows) oluşturmanıza olanak tanır. Bu iş akışları, kodunuzu derleyebilir, test edebilir, Docker imajları oluşturabilir ve uygulamalarınızı sunuculara dağıtabilir. GitHub Actions’ın esnekliği ve geniş topluluk desteği, onu modern CI/CD çözümleri için ideal bir seçenek haline getirir.

2. Gerekli Ön Hazırlıklar ve Ortam Kurulumu

Dağıtım sürecine başlamadan önce, hem DigitalOcean Droplet’inizde hem de GitHub deponuzda bazı temel ayarlamaları yapmamız gerekiyor. Bu adımlar, sorunsuz bir entegrasyon için zemin hazırlayacaktır.

2.1. DigitalOcean Droplet Oluşturma ve Yapılandırma

İlk adım, uygulamanızı barındıracak bir DigitalOcean Droplet oluşturmaktır.

  1. DigitalOcean hesabınıza giriş yapın.
  2. “Create” menüsünden “Droplets” seçeneğini tıklayın.
  3. Bir Ubuntu işletim sistemi imajı seçin (örneğin, Ubuntu 22.04 LTS).
  4. Uygulamanızın ihtiyaçlarına uygun bir plan seçin (CPU, RAM).
  5. SSH anahtarı ekleyin veya oluşturun. Bu anahtar, GitHub Actions’ın Droplet’inize güvenli bir şekilde bağlanması için kritik öneme sahiptir.
  6. Bir bölge seçin ve Droplet’inizi oluşturun.

Droplet oluşturulduktan sonra, SSH ile bağlanarak gerekli güncellemeleri yapın:

ssh root@your_droplet_ip
sudo apt update && sudo apt upgrade -y

2.2. Docker ve Docker Compose Kurulumu

Uygulamanız Docker konteynerleri içinde çalışacağı için, Droplet'inize Docker ve Docker Compose'u kurmanız gerekmektedir.

# Docker kurulumu
sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker

# Kullanıcıyı docker grubuna ekleme (isteğe bağlı ama pratik)
sudo usermod -aG docker $USER
newgrp docker # veya SSH oturumunu yeniden başlatın

# Docker Compose kurulumu (genellikle daha yeni versiyonlar için önerilir)
sudo apt install docker-compose -y
# Eğer eski bir versiyon ise veya daha yeni versiyon isterseniz:
# sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose


Kurulumu doğrulamak için:

docker --version
docker compose version

2.3. GitHub Repository ve Uygulama Hazırlığı

Uygulama kodunuzun bulunduğu bir GitHub deposuna sahip olmanız gerekmektedir. Deponuzda en azından bir Dockerfile ve bir docker-compose.yml dosyası bulunmalıdır.

* Dockerfile Örneği:

# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
    

* docker-compose.yml Örneği:

# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "80:3000"
    restart: always
    environment:
      NODE_ENV: production
    # İsteğe bağlı olarak, veritabanı gibi başka servisler de eklenebilir
    # db:
    #   image: postgres:13
    #   volumes:
    #     - db_data:/var/lib/postgresql/data
    #   environment:
    #     POSTGRES_DB: myapp
    #     POSTGRES_USER: user
    #     POSTGRES_PASSWORD: password
# volumes:
#   db_data:
    


Bu dosyaların deponuzun kök dizininde olduğundan emin olun.

3. DigitalOcean Droplet'in Güvenli Yapılandırması

Droplet'iniz hazır olduğunda, güvenlik ve erişim ayarlarını doğru bir şekilde yapılandırmak çok önemlidir. Bu, uygulamanızın güvenliğini sağlarken, GitHub Actions'ın sorunsuz bir şekilde dağıtım yapmasına olanak tanır.

3.1. Güvenlik Duvarı Ayarları (UFW)

DigitalOcean'ın kendi güvenlik duvarı seçeneklerini kullanabilir veya Droplet içinde UFW (Uncomplicated Firewall) yapılandırabilirsiniz. UFW, sunucunuza gelen ve giden trafiği kontrol etmenizi sağlar.

# UFW'yi etkinleştirme
sudo ufw enable

# SSH bağlantısına izin verme
sudo ufw allow ssh

# Web trafiğine izin verme (HTTP ve HTTPS)
sudo ufw allow http
sudo ufw allow https

# Docker'ın kullandığı portlara izin verme (docker-compose.yml'deki port eşleşmelerine göre)
# Eğer 80:3000 kullanıyorsanız, 80'e izin vermelisiniz.
sudo ufw allow 80/tcp

# Güvenlik duvarı durumunu kontrol etme
sudo ufw status verbose


Bu adımlar, yalnızca gerekli portların dışarıdan erişilebilir olmasını sağlayarak sunucunuzun saldırı yüzeyini azaltır.

3.2. Dağıtım İçin Uygulama Dizini Oluşturma

GitHub Actions, Droplet'inize bağlanıp kodunuzu belirli bir dizine kopyalayacaktır. Bu dizini önceden oluşturmak ve gerekli izinleri vermek iyi bir pratiktir.

# Uygulama dizini oluşturma
sudo mkdir -p /var/www/my-docker-app
sudo chown -R $USER:$USER /var/www/my-docker-app # Kendi kullanıcınıza yetki verin


Bu dizin, uygulamanızın kodunu ve Docker dosyalarını barındıracak yer olacaktır. GitHub Actions, SSH üzerinden bu dizine erişerek dağıtım işlemlerini gerçekleştirecektir.

4. GitHub Actions Ortamının Hazırlanması

GitHub Actions'ın Droplet'inize güvenli bir şekilde bağlanabilmesi ve dağıtım işlemlerini gerçekleştirebilmesi için bazı gizli anahtarlar (secrets) tanımlamamız gerekiyor.

4.1. GitHub Secrets Tanımlama

GitHub Actions, hassas bilgileri (SSH anahtarları, şifreler vb.) doğrudan workflow dosyasına yazmak yerine, "Secrets" adı verilen güvenli bir mekanizma aracılığıyla yönetir.

  1. GitHub deponuza gidin.
  2. "Settings" sekmesine tıklayın.
  3. Sol menüden "Secrets and variables" altında "Actions" seçeneğini seçin.
  4. "New repository secret" butonuna tıklayarak aşağıdaki sırları ekleyin:
Secret Adı Değer Açıklama
SSH_PRIVATE_KEY Droplet oluştururken kullandığınız SSH özel anahtarınızın içeriği. (~/.ssh/id_rsa veya benzeri dosyanın içeriği) GitHub Actions'ın Droplet'e SSH ile bağlanması için kullanılır.
DROPLET_IP DigitalOcean Droplet'inizin genel IP adresi. Hedef sunucunun IP adresini belirtir.
SSH_USERNAME Droplet'e bağlanmak için kullanacağınız kullanıcı adı (genellikle root veya oluşturduğunuz kullanıcı). SSH bağlantısı için kullanıcı adı.

Önemli: SSH özel anahtarınızı kopyalarken, anahtarın tamamını (-----BEGIN OPENSSH PRIVATE KEY----- ile başlayıp -----END OPENSSH PRIVATE KEY----- ile biten kısım dahil) kopyaladığınızdan emin olun.

4.2. Workflow Dosyası Oluşturma (.github/workflows)

GitHub Actions iş akışları, .github/workflows dizini altında YAML dosyaları olarak tanımlanır. Bu dizini deponuzun kök dizininde oluşturun.

.
├── .github/
│   └── workflows/
│       └── deploy.yml  # Bu dosyayı oluşturacağız
├── Dockerfile
├── docker-compose.yml
├── package.json
└── ...


deploy.yml adında bir dosya oluşturup içine workflow tanımını yazacağız.

5. GitHub Actions Workflow Dosyasının Oluşturulması

Şimdi en kritik adıma geldik: GitHub Actions workflow dosyasını yazmak. Bu dosya, kodunuz her push edildiğinde otomatik olarak çalışacak ve uygulamanızı Droplet'e dağıtacaktır.

5.1. Workflow Yapısı ve Tetikleyiciler

Bir GitHub Actions workflow dosyası, tetikleyiciler (triggers), işler (jobs) ve adımlar (steps) içerir. Aşağıdaki örnek, main branch'ine yapılan her push'ta çalışacak bir workflow tanımlar.

# .github/workflows/deploy.yml
name: Deploy Docker App to DigitalOcean

on:
  push:
    branches:
      - main # main branch'ine yapılan push'larda çalışır

jobs:
  deploy:
    runs-on: ubuntu-latest # İşin çalışacağı işletim sistemi

    steps:
      - name: Checkout code
        uses: actions/checkout@v4 # Depodaki kodu çek

      - name: Set up SSH
        uses: webfactory/ssh-agent@v0.9.0
        with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # GitHub Secret'tan SSH özel anahtarını kullan

      - name: Deploy to DigitalOcean Droplet
        env:
          DROPLET_IP: ${{ secrets.DROPLET_IP }}
          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
        run: |
          echo "Connecting to Droplet at $DROPLET_IP..."
          # SSH üzerinden Droplet'e bağlan ve komutları çalıştır
          ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$DROPLET_IP "
            # Uygulama dizinine git
            mkdir -p /var/www/my-docker-app
            cd /var/www/my-docker-app

            # Eski konteynerleri durdur ve kaldır
            docker compose down --remove-orphans || true
            
            # GitHub'dan yeni kodu çek (eğer git repo olarak kullanıyorsanız)
            # Eğer sadece dosyaları kopyalayacaksanız bu adımı atlayın
            # git pull origin main || git clone https://github.com/your-username/your-repo.git .

            # Mevcut dizini temizle ve yeni dosyaları kopyala
            # Bu kısım genellikle rsync ile yapılır, ancak bu örnekte dosyaları doğrudan aktarmak için
            # GitHub Actions'ın scp veya rsync aksiyonları kullanılabilir.
            # Basitlik adına, burada manuel olarak kopyalama adımı yerine, 
            # SSH üzerinden doğrudan Docker Compose çalıştırmayı hedefliyoruz.
            # Eğer kodunuzu Droplet'e aktarmanız gerekiyorsa, 'appleboy/scp-action' gibi bir action kullanabilirsiniz.

            # Bu örnekte, kodu GitHub Actions'tan Droplet'e kopyalamak yerine,
            # Docker imajını doğrudan Droplet üzerinde build edeceğiz.
            # Alternatif olarak, imajı bir Docker Registry'ye (Docker Hub) push edip,
            # Droplet'ten çekmek daha ölçeklenebilir bir yaklaşımdır.

            # Docker Compose ile uygulamayı yeniden başlat
            docker compose up -d --build
            echo 'Deployment complete!'
          "

5.2. Kodun Çekilmesi ve Dağıtım Mantığı

Yukarıdaki deploy.yml dosyasında, webfactory/ssh-agent@v0.9.0 aksiyonu ile SSH bağlantısı kurulur. Ardından, Deploy to DigitalOcean Droplet adımı, SSH üzerinden Droplet'e bağlanır ve aşağıdaki komutları çalıştırır:

  1. docker compose down --remove-orphans: Çalışan konteynerleri durdurur ve eski imajları temizler. Bu, yeni dağıtım için temiz bir ortam sağlar.
  2. docker compose up -d --build: docker-compose.yml dosyasını kullanarak yeni Docker imajlarını oluşturur (--build) ve konteynerleri arka planda (-d) başlatır. Bu komut, deponuzdaki Dockerfile ve docker-compose.yml dosyalarını kullanır.

Not: Bu örnekte, uygulama kodunuzun GitHub Actions tarafından çekilip doğrudan Droplet'e kopyalanması yerine, Droplet üzerinde docker compose up --build komutu ile imajın yeniden oluşturulduğu varsayılmıştır. Daha gelişmiş senaryolarda, Docker imajınızı bir Docker Registry'ye (Docker Hub, GitHub Container Registry vb.) push edip, Droplet'ten bu imajı çekmek daha yaygın ve verimli bir yaklaşımdır. Bu, docker compose pull komutunu kullanmayı gerektirir.

6. Dağıtım Stratejileri ve En İyi Uygulamalar

Otomatik dağıtım yaparken, uygulamanızın kesintisiz çalışmasını sağlamak ve olası sorunlara karşı hazırlıklı olmak için bazı stratejileri ve en iyi uygulamaları göz önünde bulundurmak önemlidir.

6.1. Sıfır Kesintiyle Dağıtım (Zero-Downtime Deployment)

Yukarıdaki docker compose down komutu, kısa bir kesintiye neden olabilir. Sıfır kesintiyle dağıtım için, yeni versiyonu eski versiyon çalışırken başlatıp, yeni versiyon hazır olduğunda trafiği ona yönlendiren stratejiler (mavi/yeşil dağıtım, rolling update) kullanılabilir. Bu genellikle bir yük dengeleyici (load balancer) veya ters proxy (nginx, traefik) gerektirir. Örneğin, Nginx'i ters proxy olarak kullanıp, yeni konteyner ayağa kalktığında Nginx konfigürasyonunu dinamik olarak güncelleyebilirsiniz.

6.2. Rollback Mekanizmaları

Her dağıtım başarılı olmayabilir. Bir sorun durumunda, uygulamanın önceki, çalışan versiyonuna hızlıca geri dönebilmek kritik öneme sahiptir. Docker ve Docker Compose ile bu, önceki bir Docker imajına veya Git commit'ine geri dönüp yeniden dağıtım yaparak nispeten kolayca yapılabilir. GitHub Actions workflow'unuza manuel bir rollback tetikleyicisi ekleyebilirsiniz.

6.3. Ortam Değişkenlerinin Yönetimi

Hassas bilgiler (API anahtarları, veritabanı şifreleri) doğrudan kod içinde tutulmamalıdır. Bunları GitHub Secrets olarak tanımlayıp, workflow dosyasında env bloğu aracılığıyla Docker konteynerlerine aktarmak en güvenli yoldur.

# docker-compose.yml içinde
services:
  web:
    environment:
      - DATABASE_URL=${DATABASE_URL} # Bu değişkeni GitHub Secret olarak tanımlayıp aktarın

6.4. Güvenlik İpuçları

  • SSH Özel Anahtarınızı asla herkese açık bir depoda saklamayın. Daima GitHub Secrets kullanın.
  • Droplet'inizdeki güvenlik duvarını (UFW) doğru yapılandırarak sadece gerekli portlara izin verin.
  • Root kullanıcısı yerine, SSH bağlantısı için ayrı, daha az yetkili bir kullanıcı oluşturmayı düşünebilirsiniz.
  • Docker imajlarınızı düzenli olarak güncelleyin ve bilinen güvenlik açıklarını tarayın.

7. Sorun Giderme ve İpuçları

Her ne kadar otomasyon süreçleri kolaylaştırsa da, zaman zaman sorunlarla karşılaşmak mümkündür. İşte yaygın sorunlar ve çözüm önerileri.

7.1. Yaygın Hatalar ve Çözümleri

  • SSH Bağlantı Hatası:
    • SSH_PRIVATE_KEY secret'ının doğru ve eksiksiz olduğundan emin olun.
    • DROPLET_IP ve SSH_USERNAME secret'larının doğru olduğunu kontrol edin.
    • Droplet'in güvenlik duvarının SSH (port 22) trafiğine izin verdiğinden emin olun.
  • Docker Komutları Çalışmıyor:
    • Droplet'te Docker ve Docker Compose'un doğru kurulduğundan ve çalıştığından emin olun (docker ps, docker compose version).
    • SSH kullanıcısının Docker komutlarını çalıştırma yetkisine sahip olduğundan emin olun (kullanıcıyı docker grubuna ekleyin).
  • Uygulama Başlamıyor:
    • Dockerfile ve docker-compose.yml dosyalarını kontrol edin. Sözdizimi hataları veya yanlış yapılandırmalar olabilir.
    • Uygulama loglarını kontrol edin (docker compose logs web).
    • Port çakışmaları olup olmadığını kontrol edin.

7.2. Logları İzleme

GitHub Actions workflow'unuzun çıktısı, her adımın loglarını içerir. Herhangi bir hata durumunda, bu logları dikkatlice incelemek sorunun kökenini anlamak için hayati öneme sahiptir. Droplet üzerinde de Docker konteyner loglarını (docker compose logs -f web) takip ederek uygulamanızın davranışını gözlemleyebilirsiniz.

7.3. Performans Optimizasyonu

Büyük Docker imajları veya çok sayıda bağımlılığı olan projelerde docker compose up --build adımı uzun sürebilir. Bu süreyi kısaltmak için:

  • Docker imajlarını katmanlı (layered) yapıda optimize edin (değişmeyen bağımlılıkları üst katmanlara koyun).
  • Gereksiz dosyaları .dockerignore ile imaja dahil etmeyin.
  • Daha hızlı build süreleri için Docker Hub gibi bir registry kullanıp imajı Droplet'e çekmek, build işlemini her seferinde tekrarlamaktan daha hızlı olabilir.

Sonuç

Bu makalede, Docker konteyner uygulamalarınızı DigitalOcean Droplet'e GitHub Actions kullanarak nasıl otomatik olarak dağıtacağınızı adım adım öğrendik. CI/CD prensiplerini benimseyerek, geliştirme süreçlerinizi hızlandırabilir, hata oranını düşürebilir ve ekiplerinizin daha verimli çalışmasını sağlayabilirsiniz. GitHub Actions'ın gücü ve Docker'ın esnekliği sayesinde, modern ve güvenilir bir dağıtım hattı kurmak artık çok daha erişilebilir. Unutmayın, otomasyon bir kere kurulduğunda size uzun vadede büyük zaman ve çaba kazandıracaktır.

SSS (Sık Sorulan Sorular)

1. Neden GitHub Actions kullanmalıyız?

GitHub Actions, GitHub depolarıyla derinlemesine entegre olması, zengin bir aksiyon kütüphanesine sahip olması, ücretsiz kullanım limitleri sunması ve YAML tabanlı kolay yapılandırması sayesinde modern CI/CD süreçleri için güçlü ve erişilebilir bir çözümdür.

2. Hangi DigitalOcean planını seçmeliyim?

Seçtiğiniz DigitalOcean Droplet planı, uygulamanızın ihtiyaç duyduğu CPU, RAM ve depolama kaynaklarına bağlıdır. Küçük bir demo uygulaması için en temel planlar yeterli olabilirken, yüksek trafikli veya kaynak yoğun uygulamalar için daha güçlü planlar tercih edilmelidir. Uygulamanızın performansını izleyerek gerektiğinde planınızı yükseltebilirsiniz.

3. Veritabanı gibi servisleri nasıl yönetmeliyim?

Veritabanları gibi durum bilgisi olan (stateful) servisleri genellikle Docker konteynerleri içinde değil, ayrı bir yönetilen veritabanı servisi olarak (örneğin DigitalOcean Managed Databases) kullanmak daha güvenlidir ve önerilir. Eğer veritabanını Droplet üzerinde Docker ile çalıştırmak istiyorsanız, veri kalıcılığı için Docker volume'larını doğru şekilde yapılandırdığınızdan emin olun.

4. Güvenlik konusunda nelere dikkat etmeliyim?

SSH özel anahtarınızı asla herkese açık tutmayın ve sadece GitHub Secrets üzerinden kullanın. Droplet'inizdeki güvenlik duvarını doğru yapılandırın ve sadece gerekli portlara izin verin. Mümkünse, SSH bağlantıları için root yerine daha az yetkili bir kullanıcı kullanın. Docker imajlarınızı düzenli olarak güncelleyin ve güvenlik taramalarından geçirin.

5. Birden fazla Droplet'e dağıtım yapabilir miyim?

Evet, GitHub Actions workflow'unuzu birden fazla Droplet'e dağıtım yapacak şekilde genişletebilirsiniz. Bu genellikle her Droplet için ayrı bir SSH bağlantısı ve dağıtım adımı gerektirir veya bir orkestrasyon aracı (Kubernetes, Docker Swarm) kullanmayı düşünebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version