- Add `hetzner-sizing-report.md` defining data-driven server type recommendations for test and prod environments.
- Update Terraform configurations to align with the recommended `CPX` server types and refine firewall rules for Docker Swarm and database interactions.
- Introduce comprehensive documentation and stack files for:
- Single-node PostgreSQL/MongoDB deployment on a test DB worker node.
- High-availability 3-node MongoDB replica set and Patroni+etcd PostgreSQL cluster for production.
- Enhance Ansible bootstrap roles with SELinux disabling, fail2ban configuration, and StorageBox SSH key management for CI/CD.
- Reorganize and rename setup documentation files for improved structure and clarity.
271 lines
14 KiB
Markdown
271 lines
14 KiB
Markdown
# iklim.co Hetzner Yeni Test ve Prod Sunucu Raporu
|
||
|
||
Tarih: 2026-05-11
|
||
|
||
## Yönetici Özeti
|
||
|
||
Hetzner Cloud cost-optimized `CX` modellerinde "limited availability" problemi olduğu için yeni test ve prod kurulumlarında `CPX` regular performance modellerine geçilmesi önerilir.
|
||
|
||
Mevcut elle kurulmuş test ortamı verileri, test app sunucusunda RAM'in ana sınırlayıcı kaynak olduğunu gösteriyor. Test app node üzerinde 10 mikroservis ve altyapı servisleri birlikte çalıştığı için `CPX32` yani 8 GB RAM risklidir. Bu nedenle yeni test app sunucusu için `CPX42` önerilir.
|
||
|
||
Test DB sunucusunda disk ve network kullanımı düşük, disk doluluğu da çok düşüktür. Ancak CPU grafiğinde 8 vCPU seviyesine yaklaşan kısa süreli yükler görüldüğü için test DB için de `CPX42` ile başlamak daha doğru ve daha az riskli seçenektir.
|
||
|
||
Prod ortamında app ve DB katmanları 3'er node olarak kurulacağı için tek node başına en yüksek kaynakla başlamak gerekli değildir. Başlangıç için app node'larda `CPX42`, DB node'larda `CPX32` önerilir. Bu tercih, app tarafındaki Java mikroservis RAM baskısını azaltırken DB tarafında ekonomik bir cluster başlangıcı sağlar. Büyüme görüldüğünde DB node'lar `CPX42` veya daha yüksek modellere rescale edilebilir.
|
||
|
||
Önerilen nihai başlangıç:
|
||
|
||
| Ortam | Rol | Önerilen Tip | Adet | Aylık Toplam |
|
||
| --- | --- | --- | ---: | ---: |
|
||
| Test | App / Swarm / runner | `CPX42` | 1 | $29.99 |
|
||
| Test | DB | `CPX42` | 1 | $29.99 |
|
||
| Prod | App / Swarm | `CPX42` | 3 | $89.97 |
|
||
| Prod | DB cluster | `CPX32` | 3 | $49.47 |
|
||
|
||
Toplam başlangıç maliyeti:
|
||
|
||
| Kapsam | Aylık Maliyet |
|
||
| --- | ---: |
|
||
| Test | $59.98 / mo |
|
||
| Prod | $139.44 / mo |
|
||
| Test + Prod | $199.42 / mo |
|
||
|
||
## Kapsam ve Varsayımlar
|
||
|
||
Bu rapor şu veriler esas alınarak hazırlanmıştır:
|
||
|
||
- Mevcut elle kurulmuş test app ve test DB sunucularının CPU, disk, network, RAM ve disk doluluk verileri.
|
||
- Test app sunucusunda çalışan 10 mikroservis ve altyapı servisleri.
|
||
- Test DB sunucusunda çalışan PostgreSQL/PostGIS ve MongoDB container'ları.
|
||
- Hetzner tarafında cost-optimized `CX` modellerinin alınabilir olmaması.
|
||
- Kullanıcı tarafından paylaşılan `CPX` ve `CCX` model kaynak/fiyat bilgileri.
|
||
- Prod ortamında 3 app node ve 3 DB node olacak şekilde cluster topolojisi.
|
||
|
||
Fiyatlar kullanıcı tarafından paylaşılan Hetzner fiyat tablosuna göre hesaplanmıştır. Vergi, backup, snapshot, floating IP, volume ve trafik aşım maliyetleri dahil edilmemiştir.
|
||
|
||
## Kullanılabilir Hetzner Modelleri
|
||
|
||
### Regular Performance CPX Modelleri
|
||
|
||
| Tip | CPU | RAM | SSD | Trafik | Saatlik | Aylık |
|
||
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
||
| `CPX22` | 2 AMD | 4 GB | 80 GB | 20 TB | $0.015 / h | $9.49 / mo |
|
||
| `CPX32` | 4 AMD | 8 GB | 160 GB | 20 TB | $0.026 / h | $16.49 / mo |
|
||
| `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $0.048 / h | $29.99 / mo |
|
||
| `CPX52` | 12 AMD | 24 GB | 480 GB | 20 TB | $0.069 / h | $42.99 / mo |
|
||
| `CPX62` | 16 AMD | 32 GB | 640 GB | 20 TB | $0.095 / h | $59.49 / mo |
|
||
|
||
### General Purpose CCX Modelleri
|
||
|
||
| Tip | CPU | RAM | SSD | Trafik | Saatlik | Aylık |
|
||
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
||
| `CCX13` | 2 AMD | 8 GB | 80 GB | 20 TB | $0.030 / h | $18.49 / mo |
|
||
| `CCX23` | 4 AMD | 16 GB | 160 GB | 20 TB | $0.059 / h | $36.99 / mo |
|
||
| `CCX33` | 8 AMD | 32 GB | 240 GB | 30 TB | $0.119 / h | $73.99 / mo |
|
||
|
||
### CPX ve CCX Seçim Notu
|
||
|
||
`CCX` modelleri dedicated CPU davranışı nedeniyle CPU tutarlılığı gereken senaryolarda avantajlıdır. Ancak bu proje için başlangıç aşamasında belirleyici risk app tarafında RAM, DB tarafında ise ekonomik cluster başlangıcıdır. Bu nedenle ilk tercih `CPX` modelleridir.
|
||
|
||
DB tarafında `CCX33` 32 GB RAM sunsa da 8 vCPU ve 240 GB disk ile `CPX42` veya `CPX62` kadar dengeli değildir. Başlangıçta dedicated CPU gereksinimi net olmadığı için prod DB'de `CCX` ile başlamak önerilmez.
|
||
|
||
## Mevcut Test Ortamı Bulguları
|
||
|
||
### Test App Sunucusu
|
||
|
||
Mevcut test app sunucusu üzerinde 10 mikroservis ve altyapı servisleri aynı node üzerinde çalışmaktadır. Çalışan servisler:
|
||
|
||
| Grup | Servisler |
|
||
| --- | --- |
|
||
| Mikroservisler | auth, account, lightning, thunderstorm, precipitation, nowcast-point-alarm, nowcast-geo-alarm, forecast, forecast-point-alarm, enroute |
|
||
| Altyapı servisleri | RabbitMQ, Redis, Vault, Prometheus, Grafana, APISIX, APISIX Dashboard, etcd |
|
||
|
||
Kaynak özeti:
|
||
|
||
| Metrik | Mevcut Değer | Yorum |
|
||
| -------------- | --------------------: | ----------------------------------- |
|
||
| RAM toplam | 14 GiB | Yaklaşık 16 GB sınıfı sunucu |
|
||
| RAM used | 10 GiB | App node için yüksek ve belirleyici |
|
||
| RAM available | 4.0 GiB | Kalan alan sınırlı |
|
||
| Swap | 0 B | OOM riskini artırır |
|
||
| Root disk | 226 GB | Yaklaşık 240 GB sınıfı disk |
|
||
| Disk used | 81 GB | %38 kullanım |
|
||
| Disk available | 136 GB | Test için yeterli boşluk |
|
||
| CPU | Düşük baz, kısa spike | CPU kritik sınır değil |
|
||
| Disk I/O | Düşük | IOPS/throughput sınırlayıcı değil |
|
||
| Network | Düşük | Trafik sınırlayıcı değil |
|
||
![[test-app-graphs.png]]
|
||
Değerlendirme:
|
||
|
||
- App sunucusunda ana risk RAM'dir.
|
||
- `CPX32` 8 GB RAM sunduğu için mevcut 10 GiB used seviyesini karşılamaz.
|
||
- JVM/container memory limitleri uygulanmadan `CPX32` OOM veya yoğun GC riski taşır.
|
||
- Disk kullanımı 81 GB olduğu için 160 GB disk teorik olarak yeterli görünse de Docker image/layer birikimi, loglar ve deploy sırasındaki geçici alan ihtiyacı nedeniyle 320 GB daha güvenlidir.
|
||
|
||
Sonuç: yeni test app sunucusu için `CPX42` önerilir.
|
||
|
||
### Test DB Sunucusu
|
||
|
||
Mevcut test DB sunucusunda PostgreSQL/PostGIS ve MongoDB çalışmaktadır.
|
||
|
||
Kaynak özeti:
|
||
|
||
| Metrik | Mevcut Değer | Yorum |
|
||
| -------------- | -----------------------: | --------------------------------------------- |
|
||
| RAM toplam | 14 GiB | Yaklaşık 16 GB sınıfı sunucu |
|
||
| RAM used | 7.6 GiB | Linux cache nedeniyle tek başına riskli değil |
|
||
| RAM available | 7.4 GiB | RAM açısından rahat |
|
||
| Swap | 0 B | Ani bellek baskısında risk |
|
||
| Root disk | 226 GB | Yaklaşık 240 GB sınıfı disk |
|
||
| Disk used | 16 GB | %8 kullanım, çok düşük |
|
||
| Disk available | 201 GB | Fazlasıyla yeterli |
|
||
| CPU | Kısa süreli yüksek spike | DB için asıl izlenmesi gereken metrik |
|
||
| Disk I/O | Düşük | Disk throughput/IOPS sınırlayıcı görünmüyor |
|
||
| Network | Düşük | Trafik sınırlayıcı değil |
|
||
![[test-db-graphs.png]]
|
||
Değerlendirme:
|
||
|
||
- RAM ve disk açısından `CPX32` yeterli görünebilir.
|
||
- Ancak CPU grafiğinde 8 vCPU seviyesine yaklaşan kısa süreli yükler var.
|
||
- Bu yükler PostGIS query, Mongo indexleme, import veya batch işlemlerinden kaynaklanıyorsa `CPX32`'ye düşmek testte yavaşlamaya neden olabilir.
|
||
- Test DB tek node olduğu için prod DB cluster'ına göre daha az toleranslıdır.
|
||
|
||
Sonuç: yeni test DB sunucusu için de `CPX42` önerilir.
|
||
|
||
## Yeni Test Ortamı Gereksinimleri
|
||
|
||
Yeni test ortamında iki node hedeflenir:
|
||
|
||
| Sunucu | Rol | Önerilen Tip | CPU | RAM | SSD | Trafik | Aylık |
|
||
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
|
||
| `iklim-app-01` | Swarm manager, app, runner, altyapı servisleri | `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $29.99 |
|
||
| `iklim-db-01` | PostgreSQL/PostGIS, MongoDB | `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $29.99 |
|
||
| **Toplam** | 2 sunucu | | **16 vCPU** | **32 GB** | **640 GB** | **40 TB** | **$59.98** |
|
||
|
||
### Test İçin Reddedilen Daha Ekonomik Alternatif
|
||
|
||
| Sunucu | Alternatif Tip | Neden Reddedildi |
|
||
| --- | --- | --- |
|
||
| `iklim-app-01` | `CPX32` | Mevcut app node 10 GiB used RAM seviyesinde; 8 GB RAM riskli |
|
||
| `iklim-db-01` | `CPX32` | RAM/disk yeterli olabilir, ancak CPU spike'ları nedeniyle tek node DB'de riskli |
|
||
|
||
### Test Ortamı Operasyon Notları
|
||
|
||
- App node'da mikroservisler için JVM/container memory limitleri tanımlanmalıdır.
|
||
- Swap varsayılan olarak yoksa düşük öncelikli acil durum swap'i değerlendirilebilir; bu performans çözümünden çok OOM etkisini yumuşatma aracıdır.
|
||
- Docker image prune/log rotation politikası uygulanmalıdır.
|
||
- Prometheus retention test ortamında sınırlandırılmalıdır.
|
||
- DB ve app aynı node'a alınmamalıdır; mevcut veri ayrı DB node ihtiyacını desteklemektedir.
|
||
|
||
## Prod Ortamı Önerisi
|
||
|
||
Prod ortamında 3 app node ve 3 DB node olacak şekilde cluster topolojisi hedeflenir. Bu nedenle testteki tek node baskısı prod'da daha kontrollü dağıtılabilir.
|
||
|
||
### Önerilen Prod Başlangıç
|
||
|
||
| Sunucu | Rol | Önerilen Tip | CPU | RAM | SSD | Trafik | Aylık |
|
||
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
|
||
| `iklim-app-01` | Swarm app node | `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $29.99 |
|
||
| `iklim-app-02` | Swarm app node | `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $29.99 |
|
||
| `iklim-app-03` | Swarm app node | `CPX42` | 8 AMD | 16 GB | 320 GB | 20 TB | $29.99 |
|
||
| `iklim-db-01` | DB cluster node | `CPX32` | 4 AMD | 8 GB | 160 GB | 20 TB | $16.49 |
|
||
| `iklim-db-02` | DB cluster node | `CPX32` | 4 AMD | 8 GB | 160 GB | 20 TB | $16.49 |
|
||
| `iklim-db-03` | DB cluster node | `CPX32` | 4 AMD | 8 GB | 160 GB | 20 TB | $16.49 |
|
||
| **Toplam** | 6 sunucu | | **36 vCPU** | **72 GB** | **1,440 GB** | **120 TB** | **$139.44** |
|
||
|
||
### Prod Gerekçesi
|
||
|
||
App katmanı:
|
||
|
||
- Test app verisi 16 GB sınıfı node'da 10 GiB used RAM göstermektedir.
|
||
- Prod'da trafik ve deploy frekansı artacağı için app node'larda `CPX32` yerine `CPX42` ile başlamak daha güvenlidir.
|
||
- 3 node sayesinde servisler dağıtılabilir; ancak Java mikroservislerin bellek karakteristiği nedeniyle node başına 16 GB RAM daha doğru başlangıçtır.
|
||
|
||
DB katmanı:
|
||
|
||
- Prod DB 3 node cluster olacağı için test DB'deki tek node riskinin aynısı birebir geçerli değildir.
|
||
- Başlangıç veri hacmi ve trafik düşük/orta ise `CPX32` ekonomik ve savunulabilir başlangıçtır.
|
||
- Büyüme görüldüğünde DB node'lar sırasıyla `CPX42`, `CPX52` veya `CPX62` modellerine rescale edilebilir.
|
||
- Lokal NVMe disk DB ana veri dizini için varsayılan tercih olarak korunmalıdır.
|
||
|
||
### Prod Büyüme Yolu
|
||
|
||
| Tetikleyici | İlk Aksiyon | İkinci Aksiyon |
|
||
| --- | --- | --- |
|
||
| App RAM baskısı | Servis memory limitlerini düzenle | App node'ları `CPX52` veya yeni app node'a genişlet |
|
||
| App CPU baskısı | Replica dağılımını düzenle | App node ekle veya `CPX52`'ye rescale et |
|
||
| DB CPU baskısı | Query/index analizi yap | DB node'ları `CPX42` veya `CPX52`'ye rescale et |
|
||
| DB RAM baskısı | Cache/config optimizasyonu yap | DB node'ları `CPX42` veya `CPX52`'ye rescale et |
|
||
| DB disk kapasitesi | Retention/cleanup uygula | Önce rescale, sonra ölçümlü ek volume |
|
||
| Disk IOPS baskısı | Query ve storage analizi yap | Lokal NVMe üzerinde daha büyük modele geç |
|
||
|
||
## Ek Volume Değerlendirmesi
|
||
|
||
DB ana veri dizinini başlangıçta Hetzner Volume üzerine taşımak önerilmez. Başlangıç için lokal NVMe disk daha güvenli varsayımdır.
|
||
|
||
Ek volume şu işler için daha uygundur:
|
||
|
||
- Backup dump dosyaları.
|
||
- Arşiv verisi.
|
||
- Düşük IOPS isteyen cold data.
|
||
- Geçici export/import alanları.
|
||
- Uygulama tarafında object-like dosya depolama ihtiyaçları.
|
||
|
||
DB ana data dizini için ek volume ancak aşağıdaki koşullarda değerlendirilmelidir:
|
||
|
||
- Volume performansı hedef DB workload'u ile ölçülmüş olmalı.
|
||
- IOPS, latency ve throughput metrikleri lokal disk ile karşılaştırılmalı.
|
||
- Backup/restore ve failover senaryoları netleştirilmeli.
|
||
- DB engine tarafında tablespace/partition yaklaşımı bilinçli tasarlanmalı.
|
||
|
||
Kapasite yetmezliği durumunda ilk tercih genellikle ek volume değil, sunucuyu daha büyük `CPX` modele rescale etmek olmalıdır.
|
||
|
||
## Terraform Hedef Değerleri
|
||
|
||
Terraform'da Hetzner server type değerleri küçük harfle kullanılmalıdır.
|
||
|
||
### Test
|
||
|
||
| Terraform Değişkeni | Hedef Değer | Gerekçe |
|
||
| --- | --- | --- |
|
||
| `server_type_swarm` | `cpx42` | Test app node için 16 GB RAM gerekli |
|
||
| `server_type_db` | `cpx42` | Tek node DB'de CPU spike riskini azaltır |
|
||
|
||
### Prod
|
||
|
||
| Terraform Değişkeni | Hedef Değer | Gerekçe |
|
||
| --- | --- | --- |
|
||
| `server_type_swarm` | `cpx42` | Java mikroservis yoğun app node'ları için dengeli başlangıç |
|
||
| `server_type_db` | `cpx32` | 3 node DB cluster için ekonomik başlangıç |
|
||
|
||
## Maliyet Özeti
|
||
|
||
### Test Maliyeti
|
||
|
||
| Kalem | Tip | Adet | Birim Aylık | Aylık Toplam |
|
||
| --- | --- | ---: | ---: | ---: |
|
||
| App | `CPX42` | 1 | $29.99 | $29.99 |
|
||
| DB | `CPX42` | 1 | $29.99 | $29.99 |
|
||
| **Toplam** | | **2** | | **$59.98** |
|
||
|
||
### Prod Maliyeti
|
||
|
||
| Kalem | Tip | Adet | Birim Aylık | Aylık Toplam |
|
||
| --- | --- | ---: | ---: | ---: |
|
||
| App | `CPX42` | 3 | $29.99 | $89.97 |
|
||
| DB | `CPX32` | 3 | $16.49 | $49.47 |
|
||
| **Toplam** | | **6** | | **$139.44** |
|
||
|
||
### Genel Toplam
|
||
|
||
| Ortam | Sunucu Adedi | Aylık Toplam |
|
||
| --- | ---: | ---: |
|
||
| Test | 2 | $59.98 |
|
||
| Prod | 6 | $139.44 |
|
||
| **Genel Toplam** | **8** | **$199.42** |
|
||
|
||
## Sonuç
|
||
|
||
Yeni test ortamında `CPX42 + CPX42` seçimi mevcut test verileriyle uyumludur. App node için `CPX32` RAM nedeniyle risklidir; DB node için `CPX32` ise tek node CPU spike'ları nedeniyle gereksiz risk taşır.
|
||
|
||
Prod ortamında `3 x CPX42 app` ve `3 x CPX32 DB` ekonomik ama teknik olarak savunulabilir bir başlangıçtır. Bu seçim, app katmanındaki bellek baskısını azaltır ve DB katmanında cluster yapısının sağladığı yatay kapasiteyi kullanır. Büyüme görüldüğünde önce metriklerle doğrulama yapılmalı, ardından rescale veya node ekleme tercih edilmelidir.
|