blog
Tek masaüstünden birkaç Hetzner sunucusu yönetmek
Yayın tarihi
Tek bir sunucu kafanda durur. İş akışı ikincisinde sessizce bozulur — zor bir şey olduğu için değil, birbirine benzeyen iki makine artık tek bir yanlış pencere uzaklıkta olduğu için.
Bozulduğu an
Nadiren dramatiktir. Staging sandığın bir terminalde docker compose down çalıştırırsın. Bir .env’i doğru yola ama yanlış makineye kopyalarsın. İki sunucunun da istemi, dizinleri ve konteyner adları aynıdır, çünkü ikisini de aynı notlardan kurmuşsundur.
Aşağıdaki çözümler ucuz ve çoğu, makineleri birbirinden kolay ayırt edilir kılmakla ilgili.
Her sunucu adını söylesin
Her sunucuya ne olduğunu söyleyen bir host adı ver; kabuk istemi de bunu söylesin. Konsolun oluştururken önerdiği ubuntu-4gb-fsn1-1 gibi bir ad, rolü değil boyutu ve konumu anlatır.
sudo hostnamectl set-hostname prod-fsn1
Bazıları üretim istemini kırmızıya da boyar. İlk kez seni durdurana kadar kulağa saçma gelir.
Her sunucu için bir SSH config takma adı
~/.ssh/config, adresleri ve seçenekleri kısa adlara çevirir. Sistem SSH’ını kullanan her araç — ssh, scp, rsync, Docker context’leri — bu takma adları kullanır.
~/.ssh/config
Host prod
HostName 203.0.113.10
User deploy
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Host staging
HostName 203.0.113.20
User deploy
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesIdentitiesOnly yes, SSH’ın yalnızca adını verdiğin anahtarı sunmasını sağlar. Bu olmadan birkaç anahtar tutan bir agent her birini sırayla sunar ve sunucu doğru anahtar gelmeden “Too many authentication failures” ile bağlantıyı kesebilir.
Başında oturduğun her makineye bir anahtar
Cazip olan kurulum her sunucuya bir anahtar. Daha iyisi, çalıştığın her bilgisayara — dizüstün, masaüstün — bir anahtar ve o bilgisayarın ulaşması gereken her sunucuya o anahtarın eklenmesi.
Fark kötü bir günde ortaya çıkar. Bir dizüstü kaybolduğunda her sunucudan tek bir açık anahtarı silersin ve geri kalan her şey çalışmaya devam eder. Her sunucuya ayrı anahtar üretip hepsini her dizüstüne kopyaladıysan, kaybolan bir dizüstü sahip olduğun her anahtarı döndürmek demektir.
Hetzner Cloud açık anahtarları projede saklayıp sunucu oluşturulurken ekleyebilir; böylece yeni bir makine ilk açılışından itibaren doğru anahtarlara sahip olur.
Her yerde aynı komutlar için Docker context’leri
Her sunucu için bir Docker context, aynı komutu kendi kabuğundan, giriş yapmadan herhangi birine karşı çalıştırmanı sağlar. Bağlantı işini SSH takma adı yapar.
docker context create prod --docker host=ssh://prod docker context create staging --docker host=ssh://staging docker --context staging ps docker --context prod logs -f --tail 100 shop-web-1
docker context use yerine her komutta --context kullan. Bir saat önce geçtiğin bir context, göremediğin bir ayara taşınmış yanlış pencere sorununun ta kendisi.
Aynı stack’i eşit tutmak
Aynı stack’i çalıştıran iki sunucu, her elle düzeltmeyle biraz daha ayrışır. Compose dosyasını Git’te tut ve her makinede dosya düzenlemek yerine her sunucuya aynı şekilde uygula.
Context’lerle, imajlardan ve adlandırılmış volume’lardan oluşan stack’ler için bir döngü yeterli. Önce staging gider ve bir hata, döngüyü üretime gelmeden durdurur. Bind mount yolları uzak makineye göre çözülür ve .env senin tarafında okunur; buna güvenmeden önce bunları kontrol et.
for host in staging prod; do
docker --context "$host" compose -f compose.yml -p shop pull &&
docker --context "$host" compose -f compose.yml -p shop up -d --remove-orphans ||
break
doneBeş sunucu civarında ya da ikisinin ilk kez farklı ayarlara ihtiyaç duyduğu anda, bir yapılandırma yönetimi aracı öğrenme eğrisini hak etmeye başlar.
Yeniden kurulan bir sunucu saldırı gibi göründüğünde
Bir Hetzner sunucusunu konsoldan yeniden kurarsan (Rebuild) yeni SSH host anahtarlarıyla geri gelir. Bir sonraki bağlantın “REMOTE HOST IDENTIFICATION HAS CHANGED” ile durur. Ortadaki adam saldırısı tam olarak böyle görünür — yeniden kurulum da tam olarak böyle.
Yeniden kuran sensen eski kaydı sil ve yeni parmak izini kabul etmeden önce, SSH üzerinden geçmeyen Hetzner panelindeki web konsolundan kontrol et:
# kendi bilgisayarında ssh-keygen -R 203.0.113.10 # Hetzner web konsolunda, sunucuda ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Bu çıktıyı SSH’ın bir sonraki bağlantıda gösterdiği parmak iziyle karşılaştır. Sunucuyu sen yeniden kurmadıysan hiçbir şeyi silme — anahtarın neden değiştiğini bul.
Tek ekran gerçekte neye değer
Dürüstçe ölçülürse: takma adlar, context’ler ve ayırt edilebilir host adlarıyla bir terminal birkaç sunucuyu iyi idare eder. Tek bir görünümün kattığı şey çoğunlukla hız değil. Her sunucunun durumunu aynı anda görmek — hangisinde disk azaldı, hangi konteyner yeniden başlayıp duruyor — ve üzerinde işlem yaptığın sunucuyu karıştırılamaz kılmak.
Böyle bir sorunun yoksa yukarıdaki kurulum yeterli ve ücretsiz.
MihraOps’ta birden fazla sunucu
MihraOps her makinenin konteynerlerini ve canlı CPU, bellek ve disk kullanımını kendi adı altında gösteren bir sunucu listesi tutar ve her bağlantıda her sunucunun host parmak izini kontrol eder. Değişmiş bir parmak izi, tıklayıp geçilecek bir uyarı olarak sunulmaz; reddedilir.
Free plan 1 sunucu içerir. Pro sınırı kaldırır — ki bu yazının anlattığı sorun da aşağı yukarı orada başlar.