Tüm yazılar

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 yes

IdentitiesOnly 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
done

Beş 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.

Sırada