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
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:
- Docker Compose restart policy
- systemd service
- 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 downyapı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şlarRequires=docker.service: Docker olmadan Harbor başlayamazType=oneshot+RemainAfterExit=yes: docker compose up -d komutu tamamlandıktan sonra servis “active” kalırTimeoutStartSec=300: Harbor’ın tüm servislerinin ayağa kalkması için 5 dakika toleransRestart=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:
-
Container restart testi: docker kill harbor-core
Birkaç saniye sonra container otomatik ayağa kalkmalı
docker ps | grep harbor-core
-
systemd testi: systemctl stop harbor systemctl start harbor systemctl status harbor
-
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
-
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