← Back to list

Docker Compose ile Çalışan Harbor Registry’yi Sunucu Restart Sonrası Otomatik Ayağa Kaldırma…

Alt başlık: systemd, restart policy ve cron health check ile üç katmanlı koruma

Dururustem · 2026-05-22 13:16 · 0 claps · 4.4 min read
#harbor #harbor-restart #harbor-service
Open on Medium ↗
Wiki topics: ☁️ · DevOps & Cloud

Docker Compose ile Çalışan Harbor Registry’yi Sunucu Restart Sonrası Otomatik Ayağa Kaldırma

Alt başlık: systemd, restart policy ve cron health check ile üç katmanlı koruma

Giriş — — -

Harbor, kurumsal ortamlarda yaygın olarak kullanılan bir container registry çözümü. Docker Compose ile kurulduğunda genellikle sorunsuz çalışır, ancak sunucu güncellemeleri, kernel patch’leri veya beklenmedik restart durumlarında Harbor container’ları otomatik olarak ayağa kalkmayabilir. Özellikle production ortamlarında bu durum, CI/CD pipeline’larının veya image pull işlemlerinin kesintiye uğramasına yol açar.

Bu yazıda Harbor’ın (veya benzer Docker Compose tabanlı servislerin) sunucu restart sonrası otomatik olarak ve güvenilir şekilde ayağa kalkması için üç katmanlı bir çözüm yaklaşımını paylaşacağım:

  1. Docker Compose restart policy
  2. systemd service
  3. Cron tabanlı health check (yedek katman)

Her birinin neden gerekli olduğunu ve birlikte nasıl çalıştıklarını anlatacağım.

Problem — — — -

Harbor’ı standart install.sh ile kurduğunda, docker-compose.yml dosyasındaki container’ların restart policy’si genellikle always olarak gelir. Bu policy şu anlama gelir: container hangi sebeple durursa dursun (manuel stop dahil), Docker daemon onu tekrar başlatır.

Ancak always policy’sinin bir sorunu var: bakım amaçlı manuel olarak docker compose down çektiğinde bile Docker bir sonraki restart’ta container’ları geri açmaya çalışır. Daha da önemlisi, eğer Docker servisi düzgün şekilde restart edilmediyse veya docker compose down ile servisler kapatıldıysa, sunucu yeniden başladığında container’lar ayağa kalkmayabilir.

İdeal davranış şudur:

  • Manuel docker compose down yapıldıysa container’lar kapalı kalmalı
  • Sunucu restart olduysa container’lar otomatik açılmalı
  • Container crash olduysa otomatik restart edilmeli
  • Bir şekilde hepsi başarısız olursa, bir güvenlik ağı devreye girmeli

Adım 1: Restart Policy’yi unless-stopped Yapmak — — — — — — — — — — — — — — — — — — — — — — — — —

İlk adım, restart policy’sini always yerine unless-stopped olarak değiştirmek. Bu policy daha doğru semantiğe sahip: manuel olarak durdurulmadıkça container’lar her zaman çalışsın.

Harbor compose dosyasındaki tüm restart: always satırlarını tek bir sed komutuyla değiştirebilirsin:

Yedek alarak değiştir

sed -i.bak ‘s/restart: always/restart: unless-stopped/g’ /opt/harbor/docker-compose.yml

Değişiklikleri kontrol et

grep -n “restart:” /opt/harbor/docker-compose.yml

Değişiklik sonrası policy’nin çalışan container’larda da uygulanması için iki seçenek var:

Seçenek 1: Container’ları yeniden oluştur (kısa kesinti)

cd /opt/harbor docker compose up -d — force-recreate

Seçenek 2: Çalışan container’ları hiç durdurmadan policy’yi güncelle (kesintisiz)

docker update — restart=unless-stopped $(docker ps -q — filter “name=harbor-”)

Production ortamlarında ikinci yöntemi tercih etmek mantıklı çünkü hizmet kesintisine yol açmaz.

Adım 2: systemd Service Oluşturmak — — — — — — — — — — — — — — — — — -

Restart policy tek başına yeterli değildir çünkü docker compose down ile servisler kapatıldıysa veya Docker daemon’un başlangıç sırası bozulduysa Harbor ayağa kalkmaz. Bu yüzden systemd service kullanarak Harbor’ı sistemin bir parçası haline getirmek gerekir.

/etc/systemd/system/harbor.service dosyasını oluştur:

[Unit]
 Description=Harbor Container Registry
 After=docker.service network-online.target
 Requires=docker.service
 Wants=network-online.target

 [Service]
 Type=oneshot
 RemainAfterExit=yes
 WorkingDirectory=/opt/harbor
 ExecStart=/usr/bin/docker compose up -d
 ExecStop=/usr/bin/docker compose down
 TimeoutStartSec=300
 Restart=on-failure
 RestartSec=30

 [Install]
 WantedBy=multi-user.target

Önemli noktalar:

  • After=docker.service network-online.target: Harbor, Docker ve network tamamen hazır olduktan sonra başlar
  • Requires=docker.service: Docker olmadan Harbor başlayamaz
  • Type=oneshot + RemainAfterExit=yes: docker compose up -d komutu tamamlandıktan sonra servis “active” kalır
  • TimeoutStartSec=300: Harbor’ın tüm servislerinin ayağa kalkması için 5 dakika tolerans
  • Restart=on-failure: Başlatma başarısız olursa 30 saniye sonra tekrar dene

Servisi etkinleştir:

 systemctl daemon-reload
 systemctl enable harbor.service
 systemctl start harbor.service
 systemctl status harbor.service

Artık systemctl stop harbor ile Harbor’ı düzgün şekilde durdurabilir, systemctl start harbor ile başlatabilirsin. Sunucu restart olduğunda systemd otomatik olarak Harbor’ı ayağa kaldırır.

Adım 3: Cron ile Health Check Yedek Katmanı — — — — — — — — — — — — — — — — — — — — — —

systemd ve restart policy çoğu durumda yeterlidir ama bazen Harbor container’ları çalışıyor görünmesine rağmen API yanıt vermeyebilir. Disk dolması, network sorunları veya internal database problemleri buna yol açabilir. Bu tarz durumlar için bir cron tabanlı health check script’i ek bir güvenlik katmanı sağlar.

/usr/local/bin/harbor-healthcheck.sh dosyasını oluştur:

#!/bin/bash
HARBOR_DIR="/opt/harbor"
HARBOR_URL="https://harbor.eaglessoft.com/api/v2.0/health"
LOG_FILE="/var/log/harbor-healthcheck.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# HTTP health check
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$HARBOR_URL")

if [ "$HTTP_CODE" = "200" ]; then
    exit 0
fi

log "Harbor health check failed (HTTP: $HTTP_CODE). Containers kontrol ediliyor..."

# Container sayısını kontrol et
RUNNING=$(cd "$HARBOR_DIR" && docker compose ps --services --filter "status=running" | wc -l)
TOTAL=$(cd "$HARBOR_DIR" && docker compose config --services | wc -l)

if [ "$RUNNING" -lt "$TOTAL" ]; then
    log "Çalışan: $RUNNING / Toplam: $TOTAL. Harbor başlatılıyor..."
    cd "$HARBOR_DIR" && docker compose up -d >> "$LOG_FILE" 2>&1
    log "Harbor up komutu çalıştırıldı."
else
    log "Tüm container'lar çalışıyor ama health endpoint yanıt vermiyor. Manuel kontrol gerekli."
fi

script’i executable yap ve crontab’a ekle:

chmod +x /usr/local/bin/harbor-healthcheck.sh

crontab -e ile aç ve ekle:

*/5 * * * * /usr/local/bin/harbor-healthcheck.sh

Logların disk doldurmaması için logrotate yapılandırması (/etc/logrotate.d/harbor-healthcheck):

/var/log/harbor-healthcheck.log {
 weekly
 rotate 4
 compress
 missingok
 notifempty
 }

Bu script her 5 dakikada bir Harbor’ın health endpoint’ini kontrol eder. Eğer 200 dönmüyorsa ve container’ların bir kısmı down ise otomatik olarak docker compose up -d çalıştırır. Eğer tüm container’lar çalışıyor ama health bozuksa sadece log’a yazar (çünkü bu durumda restart işe yaramayabilir, manuel müdahale gerekir).

Üç Katmanın Birlikte Çalışması — — — — — — — — — — — — — — — -

Bu üç katmanın birlikte çalışması şu senaryoları kapsar:

| Senaryo | Hangi Katman Çözer | | — — — — — — — — — — — — — — — — — — — | — — — — — — — — — — -| | Container crash oldu | Restart policy | | Sunucu restart oldu | systemd | | docker compose down sonrası açılmadı | systemd | | Container çalışıyor ama API down | Cron health check | | Disk doldu, container exit oldu | Cron health check |

Tek başına hiçbir katman tüm senaryoları çözmez. Beraber kullanıldığında ise Harbor neredeyse hiç manuel müdahale gerektirmeden ayakta kalır.

Test Etmek — — — — —

Yapılandırmayı test etmek için:

  1. Container restart testi: docker kill harbor-core

    Birkaç saniye sonra container otomatik ayağa kalkmalı

    docker ps | grep harbor-core

  2. systemd testi: systemctl stop harbor systemctl start harbor systemctl status harbor

  3. Sunucu reboot testi (production’da dikkatli yap): reboot

    Sunucu açıldıktan sonra

    systemctl status harbor curl https://harbor.example.com/api/v2.0/health

  4. Health check testi: /usr/local/bin/harbor-healthcheck.sh tail -f /var/log/harbor-healthcheck.log

Sonuç — — -

Production ortamlarında Harbor gibi kritik servislerin otomatik olarak ayakta kalması, ekibin gece yarısı uyandırılmaması için şart. Tek bir mekanizmaya güvenmek yerine birden fazla katman kullanmak, edge case’leri yakalama şansını artırır.

Bu yaklaşım sadece Harbor için değil; GitLab, Nextcloud, Jenkins gibi Docker Compose ile çalışan diğer servisler için de aynı şekilde uygulanabilir. Sadece systemd servis adını, working directory’sini ve health check endpoint’ini ilgili servise göre uyarlamak yeterli.

Bir sonraki adım olarak, bu health check script’ini Prometheus exporter ile entegre edip Grafana üzerinden Harbor uptime’ını izlemeyi de değerlendirebilirsin. Ama o ayrı bir yazının konusu.

Etiketler: docker, harbor, devops, systemd, container-registry, linux, sysadmin


메타데이터
post_id
c44e09446e32
slug
docker-compose-ile-çalışan-harbor-registryyi-sunucu-restart-sonrası-otomatik-ayağa-kaldırma-c44e09446e32
url
https://medium.com/@dururustem68/docker-compose-ile-%C3%A7al%C4%B1%C5%9Fan-harbor-registryyi-sunucu-restart-sonras%C4%B1-otomatik-aya%C4%9Fa-kald%C4%B1rma-c44e09446e32
canonical_url
https://medium.com/@dururustem68/docker-compose-ile-%C3%A7al%C4%B1%C5%9Fan-harbor-registryyi-sunucu-restart-sonras%C4%B1-otomatik-aya%C4%9Fa-kald%C4%B1rma-c44e09446e32
author_url
https://medium.com/@dururustem68
status
ok
fetched_at
2026-07-10 12:09:34