# iklim.co Altyapı ve Sunucu Yönetimi

Bu depo, `iklim.co` test ve production ortamlarını provision etmek, yapılandırmak, işletmek ve modernize etmek için kullanılan Infrastructure-as-Code varlıklarını, kurulum runbook'larını, operasyonel facts dokümanlarını ve planlama notlarını içerir.

Altyapı yönetimi Hetzner Cloud üzerinde Terraform ile kaynak provisioning, Ansible ile işletim sistemi ve Swarm bootstrap, Docker Swarm üzerinde altyapı ve uygulama servislerinin deploy edilmesi süreçlerini kapsar.

## Depo Yapısı

### Terraform (`terraform/`)

Terraform, uzak test ve production ortamları için Hetzner Cloud kaynaklarını tanımlar:

- `terraform/hetzner/test`: test sunucuları, network, firewall, Floating IP, placement ve outputs.
- `terraform/hetzner/prod`: production app/service node'ları, DB node'ları, private networking, firewall'lar, placement group'lar, Floating IP ve outputs.

Dev ortamı lokal ve Docker Compose tabanlıdır; bu Terraform stack'leri tarafından provision edilmez.

### Ansible (`ansible/`)

Ansible, Terraform provisioning sonrası uzak host'ları hazırlar:

- `ansible/test`: test bootstrap playbook'ları, inventory ve ortama özel değişkenler.
- `ansible/prod`: production bootstrap playbook'ları, inventory, değişkenler ve prod'a özel rol override'ları.
- `ansible/roles`: `base`, `hardening`, `docker`, `swarm`, `node_dirs`, `storagebox`, `storagebox_ssh_key`, `act_runner` ve ortak `db_stack` gibi paylaşılan roller.

Production, `ansible/prod/ansible.cfg` içinde `roles_path = roles:../roles` kullanır. Bu nedenle `ansible/prod/roles/db_stack` gibi prod-local roller mevcut olduğunda paylaşılan rollerden önce çalışır.

### Setup Runbook'ları (`setup/`)

Setup dokümanları, ortamları ayağa kaldırmak veya büyük altyapı değişikliklerini uygulamak için kullanılan kanonik uygulama runbook'larıdır. Güncel dosyalar:

- [setup/00-general-roadmap.md](./setup/00-general-roadmap.md)
- [setup/01-private-network-port-matrix.md](./setup/01-private-network-port-matrix.md)
- [setup/02-test-terraform-iac.md](./setup/02-test-terraform-iac.md)
- [setup/03-test-ansible-bootstrap.md](./setup/03-test-ansible-bootstrap.md)
- [setup/04-test-db-docker-setup.md](./setup/04-test-db-docker-setup.md)
- [setup/05-test-runner-and-deploy-prerequisites.md](./setup/05-test-runner-and-deploy-prerequisites.md)
- [setup/06-prod-terraform-iac.md](./setup/06-prod-terraform-iac.md)
- [setup/07-prod-ansible-bootstrap.md](./setup/07-prod-ansible-bootstrap.md)
- [setup/08-prod-db-cluster-setup.md](./setup/08-prod-db-cluster-setup.md)
- [setup/09-prod-runner-ha-and-swarm.md](./setup/09-prod-runner-ha-and-swarm.md)

Bu dokümanlar Terraform, Ansible, Swarm label'ları, StorageBox path'leri, runner ön koşulları, DB servisleri ve production Swarm deploy modelinin birlikte nasıl çalıştığını açıklar.

### Roadmap (`roadmap/`)

Roadmap dokümanları test ve production değişiklikleri için gereksinimleri, tasarım hedeflerini ve migration planlarını açıklar:

- [roadmap/test-env/](./roadmap/test-env/)
- [roadmap/prod-env/](./roadmap/prod-env/)

Roadmap dokümanlarını amaç ve tasarım bağlamı için kullanın. Güncel uygulama akışı için setup runbook'larını kullanın.

### Setup vs Roadmap Map

[setup-vs-roadmap-map.md](./setup-vs-roadmap-map.md), roadmap maddelerini bu maddeleri hayata geçiren setup dokümanları ve implementation alanları ile eşler.

### Facts (`facts/`)

Facts dokümanları güncel durum detaylarını ve operasyonel geçmişi korur:

- [facts/firewall.md](./facts/firewall.md): aktif firewall ve port bilgileri.
- [facts/node-recovery-failover.md](./facts/node-recovery-failover.md): node recovery ve failover prosedürleri.
- [facts/prod-kurulum-gecmisi.md](./facts/prod-kurulum-gecmisi.md): production kurulum geçmişi ve güncel production notları.

Facts dokümanlarını “sistem şu an nasıl çalışıyor?” sorusu, tarihsel bağlam ve setup sonrası doğrulama için kullanın.

### Hetzner Sizing Report

[hetzner-sizing-report.md](./hetzner-sizing-report.md), altyapı servisleri, veritabanları, broker'lar ve uygulama workload'ları için sunucu sizing, CPU/RAM seçimleri ve maliyet/performans değerlendirmelerini açıklar.

### Confluence Export (`confluence-wiki/`)

`confluence-wiki/`, altyapı notlarının repository dışına yayınlanması veya mirror edilmesi gerektiğinde kullanılan wiki odaklı/export edilmiş dokümantasyon materyallerini içerir.

## Güncel Production Modeli

Production şu anda ayrık altyapı modeli kullanır:

- Ana infra ve DB stack: root `docker-stack-infra_db-prod.yml`.
- Vault stack: root `docker-stack-vault.yml`.
- Vault bootstrap: root `init/vault/vault-bootstrap.sh`; production deploy akışında `init-infra-prod.sh` üzerinden çağrılır.
- Production pipeline source of truth: root `.gitea/workflows/deploy-prod.yml` ve root `prod_env-ci_dc-pipeline.md`.

`docker-stack-infra_db-prod.yml` bilinçli olarak karma bir stack'tir:

- Patroni/PostgreSQL, MongoDB ve etcd gibi DB/cluster servisleri `iklim-db-*` node'larında çalışır ve gerektiği yerde host-mode cluster portları kullanır.
- Redis, Redis Sentinel ve RabbitMQ gibi service-node altyapı servisleri `node.labels.type == service` app/service node'larında çalışır ve stack veya reverse proxy tarafından açıkça expose edilmedikçe Docker overlay network üzerinde kalır.

## Kanonik Kurulum Akışı

Yeni bir ortam veya büyük bir altyapı güncellemesi için:

1. [hetzner-sizing-report.md](./hetzner-sizing-report.md) dosyasını inceleyin.
2. Tasarım amacını anlamak için ilgili `roadmap/` dokümanlarını inceleyin.
3. Her roadmap maddesinin hangi setup runbook'u ile uygulandığını görmek için [setup-vs-roadmap-map.md](./setup-vs-roadmap-map.md) dosyasını kontrol edin.
4. Hedef ortam için numaralı `setup/` runbook'larını sırayla takip edin.
5. Güncel davranışı, recovery prosedürlerini, firewall durumunu ve production geçmişini doğrulamak için `facts/` dokümanlarını kullanın.

## Gerekli Araçlar

- Terraform `>= 1.6`
- Ansible
- Hedef ortam için Hetzner Cloud API token
- Sunucu erişimi için yetkili SSH key pair

## Notlar

- Dev ortamı lokal ve Docker Compose tabanlıdır; uzak Terraform/Ansible otomasyonu test ve production ortamlarını hedefler.
- Test daha küçük bir uzak ortamdır ve single-node DB/App varsayımlarına dayanır.
- Production üç app/service node ve üç DB node içeren high-availability uzak ortamdır.
