Docker Compose Rehberi: Çok Konteynerli Uygulama Yönetimi
Docker Compose ile çok konteynerli uygulama tanımlama, servis bağımlılıkları, environment variables, health check, scaling ve production deployment. Kapsamlı rehber.
GitHub Actions ile CI/CD pipeline oluşturma, Docker build ve push, SSH ile sunucuya deployment, test otomasyonu, secrets yönetimi ve workflow optimizasyonu.
GitHub Actions, kod değişikliklerini otomatik olarak test eden, derleyen ve sunucuya deploy eden güçlü bir CI/CD platformudur. Bu rehberde sıfırdan production-ready bir pipeline kuracağız.
GitHub Actions, GitHub deposuna entegre bir otomasyon platformudur:
GitHub Actions workflow dosyaları .github/workflows/ dizininde YAML formatında saklanır.
# .github/workflows/deploy.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Node.js kurulumu
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Bağımlılıkları yükle
run: npm ci
- name: Testleri çalıştır
run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Deploy et
run: echo "Deploy adımları burada"
on:
# Branch'e push
push:
branches: [main, develop]
paths:
- 'src/**'
- 'package.json'
# Pull request
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
# Zamanlanmış çalışma (cron)
schedule:
- cron: '0 2 * * *' # Her gece 02:00
# Manuel tetikleme
workflow_dispatch:
inputs:
environment:
description: 'Deploy ortamı'
required: true
default: 'staging'
type: choice
options: [staging, production]
# Başka workflow tamamlandığında
workflow_run:
workflows: ["Build"]
types: [completed]
jobs:
build:
runs-on: ubuntu-latest
# Ortam değişkenleri
env:
NODE_ENV: test
# Zaman aşımı (dakika)
timeout-minutes: 30
# Strateji matrisi
strategy:
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Docker meta bilgileri
id: meta
uses: docker/metadata-action@v5
with:
images: kullanici/uygulamam
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=sha,prefix=sha-
- name: Docker Buildx kurulumu
uses: docker/setup-buildx-action@v3
- name: Docker Hub girişi
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build ve Push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: GHCR girişi
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build ve Push (GHCR)
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:latest
deploy:
needs: docker
runs-on: ubuntu-latest
environment: production
steps:
- name: SSH ile deploy
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
cd /root/uygulamam
git pull origin main
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
echo "Deploy tamamlandı: $(date)"
- name: Docker Compose deploy
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# Yeni image'ı çek
docker pull ghcr.io/${{ github.repository }}:latest
# Zero-downtime deploy
docker compose -f /root/app/docker-compose.yml up -d \
--no-deps \
--build \
--remove-orphans
# Eski image'ları temizle
docker image prune -af --filter "until=24h"
# Health check
sleep 10
curl -f http://localhost:3000/health || exit 1
GitHub Secrets, hassas bilgileri güvenle saklar:
# Secrets kullanımı
steps:
- name: Uygulama yapılandırması
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
API_KEY: ${{ secrets.API_KEY }}
run: |
echo "Yapılandırma yüklendi"
# Secrets log'a yazdırılmaz, otomatik maskelenir
Gerekli secrets:
SERVER_HOST: Sunucu IP adresiSERVER_USER: SSH kullanıcı adıSSH_PRIVATE_KEY: SSH özel anahtarıDOCKERHUB_USERNAME: Docker Hub kullanıcı adıDOCKERHUB_TOKEN: Docker Hub erişim token'ı - name: Node.js bağımlılıklarını önbelleğe al
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: npm ci (cache'li)
run: npm ci
# Docker layer cache
- name: Build ve Push
uses: docker/build-push-action@v5
with:
cache-from: type=gha
cache-to: type=gha,mode=max
jobs:
test:
strategy:
fail-fast: false
matrix:
node: [18, 20]
os: [ubuntu-latest, macos-latest]
include:
- node: 20
os: ubuntu-latest
coverage: true
exclude:
- node: 18
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: npm ci
- run: npm test
- name: Coverage raporu
if: matrix.coverage
run: npm run coverage
jobs:
deploy-production:
runs-on: ubuntu-latest
environment:
name: production
url: https://example.com
steps:
- name: Production deploy
run: echo "Production'a deploy ediliyor"
GitHub'da Settings > Environments > production altında:
name: Full CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm test -- --coverage
- name: Coverage yükle
uses: codecov/codecov-action@v4
build:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
image-tag: ${{ steps.meta.outputs.version }}
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- uses: docker/build-push-action@v5
with:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
environment:
name: production
url: https://example.com
steps:
- uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:main
docker compose -f /root/app/docker-compose.yml up -d
docker image prune -f
GitHub Actions ile tam otomatik CI/CD pipeline kurarak kod kalitesini artırabilir, deployment hatalarını azaltabilir ve geliştirme sürecinizi hızlandırabilirsiniz. Secrets yönetimi, cache optimizasyonu ve environment protection rules ile production-grade bir pipeline elde edersiniz.
Public repository'ler için tamamen ücretsiz ve sınırsızdır. Private repository'ler için aylık 2.000 dakika ücretsiz süre verilir. GitHub Free planında bu limit aşılırsa workflow'lar duraklar. GitHub Pro ve Team planlarında daha fazla dakika bulunur.
Yerel makinede 'ssh-keygen -t ed25519 -C "github-actions"' komutuyla anahtar çifti oluşturun. Public key'i (~/.ssh/id_ed25519.pub) sunucunuzdaki ~/.ssh/authorized_keys dosyasına ekleyin. Private key'i (~/.ssh/id_ed25519) GitHub repo'nuzda Settings > Secrets > SSH_PRIVATE_KEY olarak kaydedin.
'needs: test' ifadesi, bu job'ın 'test' job'ı başarıyla tamamlanmadan çalışmayacağını belirtir. Birden fazla bağımlılık için 'needs: [test, build]' kullanılır. Bir job başarısız olursa bağımlı job'lar otomatik olarak iptal edilir.
Evet, 'on.push.paths' ile belirli dosya veya dizinleri izleyebilirsiniz. Örneğin 'paths: ["src/**", "package.json"]' sadece bu dosyalar değiştiğinde workflow'u tetikler. 'paths-ignore' ile belirli dosyaları hariç tutabilirsiniz.
Docker build cache, değişmeyen katmanları yeniden oluşturmayı önler. 'cache-from: type=gha' ile GitHub Actions cache'i kullanılır. Bu sayede build süresi %50-80 oranında azalabilir. Özellikle bağımlılık kurulum adımları (npm install, pip install) için büyük fark yaratır.
Production gibi kritik ortamlar için onay mekanizması ekler. 'Required reviewers' ile belirli kişilerin onayı olmadan deploy yapılamaz. 'Wait timer' ile deploy öncesi bekleme süresi ayarlanabilir. Bu sayede yanlışlıkla production'a deploy yapılması önlenir.
Docker Compose ile çok konteynerli uygulama tanımlama, servis bağımlılıkları, environment variables, health check, scaling ve production deployment. Kapsamlı rehber.
Ansible kurulumu, inventory dosyası, playbook yazımı, rol yapısı, değişkenler, şifreli vault, ad-hoc komutlar ve sunucu yapılandırma otomasyonu. Adım adım rehber.
Caddy web server kurulumu, Caddyfile yapılandırması, otomatik Let's Encrypt SSL, reverse proxy, static site hosting, PHP-FPM entegrasyonu ve performans ayarları.