infrastructure
AWS'de bir host açan, sıkılaştıran, servisleri kesintisiz deploy eden, yük testini koşan ve hostu yeniden kaldıran Terraform ve Ansible. Tek makineden SSH ile çalışır; oturumlar arasında hiçbir şey açık kalmaz.
Bir cloud hesabıyla çalışan bir servis arasındaki her şey: cloud kaynakları Terraform’da, host ayarları Ansible’da, deployment, kontroller, yük testleri ve yedekler; her biri operatör makinesinden SSH üzerinden koşan bir make komutu. Bir host bir çalışma oturumu boyunca var. make down onu kaldırır; unutulursa bir süre sınırı onu kapatır.
İstek üzerine host
make up ağı, firewall kurallarını, instance’ı, DNS kaydını ve Cloudflare origin sertifikasını oluşturur, ardından hostu ayarlar ve servisleri deploy eder. Sıfırdan yeniden kurulum elle tek adım istemez. Hangi servisin nerede, hangi ad ve port ile çalışacağını bir katalog söyler; katalog, hosta dokunulmadan önce bütün olarak kontrol edilir.
Varsayılan olarak kapalı
- SSH yalnız operatörün adresinden, HTTPS yalnız Cloudflare’in adres aralıklarından: AWS security group’ta ve hostta bir kez daha nftables’ta.
- nftables kuralları her paketi Docker’ın kendi kurallarından önce değerlendirir; bir container’ın yanlışlıkla yayınladığı port kapalı kalır. 0.0.0.0’a yayınlanmış bir container ile denendi.
- Dışarıya yalnız HTTPS ve NTP. IPv6 kapalı.
- Cloudflare origin sertifikası ve Authenticated Origin Pulls ile TLS; bilinmeyen bir ad için handshake reddedilir.
- Hiçbir şey public değilken nginx yalnız operatörün adresine cevap verir.
- Otomatik güncelleme yok:
make updatesbekleyenleri gösterir,make upgradeuygular.
Kesintisiz release
Her servisin iki rengi var, blue ve green. Bir release yeni sürümü çalışanın yanında başlatır, health check’ini bekler, nginx -t’den sonra nginx’i ona çevirir ve eskisini bağlantıları bitince durdurur. İstemciler bir saniyenin altında yeniden bağlandı. nginx identity-service’e yayınlanmış bir port olmadan, Unix socket üzerinden bağlanır.
Varsayılmaz, kontrol edilir
make verify çalışan makineleri kontrol eder; iki makineyle son çalıştırmada 69 kontrol: kapalı portlar, sertifika, HSTS, query string’siz istek logları, kapalı otomatik güncellemeler, servislerin sağlığı. Reboot testinde iki makine de geri geldi, bütün container’lar 29 saniye içinde sağlıklıydı ve elle hiçbir şey başlatılmadan 69 kontrolün hepsi geçti.
Repodaki bir kontrol listesi, bir hostun dışarı açılmadan önce ve günlerce çalışırken neye ihtiyacı olduğunu madde madde, kanıtıyla ya da planıyla yazar. Uzun süre açık kalacak bir hosttan önce kalanlar: kendi client sertifikamızla origin pull, hostun dışından alarm ve her container’a bellek sınırı.
Yük testleri
make bench hostun yanına bir yük üreteci ekler ve ilk çalıştırmadan önce yazılmış bir plana göre k6 senaryolarını adım adım koşar. Her çalıştırma iki makinenin tanımıyla kaydedilir, kapasite kayıtlardan hesaplanır, oturum boyunca Prometheus ve Grafana iki makineyi izler. identity-service sonuçları kendi sayfasında.
Yedekler ve managed servisler
make backup bir pg_dump’ı SSH üzerinden aktarır ve operatör makinesinde age ile şifreler; host hiçbir zaman bir kopya tutmaz. make restore yedeği yeni bir veritabanına yükler ve yalnız her tablonun satır sayısı yedeğin manifest’iyle eşleşirse yerine koyar. İkisi de AWS’de koştu; hostun kendi PostgreSQL’inden RDS’e ve geri de.
Ayrı bir stack bir KMS anahtarı, düz HTTP’yi ve başka anahtarı reddeden bir S3 bucket’ı ve sertifikası ve adı doğrulanan TLS ile bağlanılan RDS PostgreSQL ekler.
Sırlar
SOPS ve age, bütün repoların dışında. Bir pre-commit hook ve CI sır dosyalarını adından reddeder, gitleaks bütün geçmişi tarar.