diff --git a/README.md b/README.md index 712a8cd..58aa4c3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Infrastructure-as-code and operational runbook repository for `iklim.co` test an This repository defines: - 🧱 Terraform resources for Hetzner infrastructure (`test` and `prod`) -- 📦 Generated Ansible inventory output targets +- 🤖 Ansible bootstrap playbooks, shared roles, and inventory targets - 📚 End-to-end setup guides and roadmap documents (mostly Turkish) - 📊 Sizing/cost analysis and supporting reference assets @@ -13,7 +13,7 @@ This repository defines: The main goal is to standardize and document infrastructure provisioning with clear responsibility boundaries: - 🧱 **Terraform**: creates cloud infrastructure (servers, private networks, firewalls, placement groups, floating IPs, SSH key registration, inventory output) -- 🤖 **Ansible**: prepares OS, security hardening, Docker/Swarm, runner setup, StorageBox mount workflows (described in docs; role code is not currently in this repo) +- 🤖 **Ansible**: prepares OS, security hardening, Docker/Swarm, runner setup, and StorageBox mount workflows via in-repo playbooks and shared roles - 🚀 **Application/stack deployment**: handled in related deployment workflows and stack manifests referenced by roadmap docs ## 📌 Current Repository Status @@ -23,15 +23,23 @@ As of now, this repository primarily contains: - 🧱 Ready Terraform code for: - `terraform/hetzner/test` - `terraform/hetzner/prod` -- 📦 A generated sample inventory file: - - `ansible/inventory/generated/test.yml` +- 🤖 Ansible automation assets for both environments: + - `ansible/test/test-bootstrap.yml` + - `ansible/prod/prod-bootstrap.yml` + - `ansible/roles/*` + - `ansible/test/group_vars/*` and `ansible/prod/group_vars/*` +- 📦 Inventory artifacts and output targets: + - `ansible/test/inventory/generated/test.yml` (tracked sample) + - `ansible/prod/inventory/generated/prod.yml` (expected output path) - 📘 Detailed setup phases: - `setup/00-genel-yol-haritasi.md` through `setup/09-prod-runner-ha-ve-swarm.md` - 🛣️ Environment roadmap steps: - `roadmap/test-env/*` - `roadmap/prod-env/*` -- 📈 Capacity planning report: +- 📈 Capacity planning and reference charts: - `hetzner-sizing-report.md` + - `test-app-graphs.png` + - `test-db-graphs.png` ## 🧭 Target Environment Topology @@ -77,9 +85,26 @@ See: ```text Environment_Infrastructure/ ├── ansible/ -│ └── inventory/ -│ └── generated/ -│ └── test.yml +│ ├── prod/ +│ │ ├── ansible.cfg +│ │ ├── group_vars/ +│ │ └── prod-bootstrap.yml +│ ├── roles/ +│ │ ├── base/ +│ │ ├── docker/ +│ │ ├── hardening/ +│ │ ├── node_dirs/ +│ │ ├── storagebox/ +│ │ ├── storagebox_ssh_key/ +│ │ └── swarm/ +│ ├── test/ +│ │ ├── ansible.cfg +│ │ ├── group_vars/ +│ │ ├── inventory/ +│ │ │ └── generated/ +│ │ │ └── test.yml +│ │ └── test-bootstrap.yml +│ └── requirements.yml ├── roadmap/ │ ├── test-env/ │ └── prod-env/ @@ -99,7 +124,9 @@ Environment_Infrastructure/ │ ├── test/ │ └── prod/ ├── hetzner-sizing-report.md -└── setup-vs-roadmap-map.md +├── setup-vs-roadmap-map.md +├── test-app-graphs.png +└── test-db-graphs.png ``` ## ✅ Prerequisites @@ -130,7 +157,8 @@ Then run: terraform init terraform plan terraform apply -terraform output -raw ansible_inventory_yaml > ../../../ansible/inventory/generated/test.yml +mkdir -p ../../../ansible/test/inventory/generated +terraform output -raw ansible_inventory_yaml > ../../../ansible/test/inventory/generated/test.yml ``` ### 2) 🏭 Production Infrastructure @@ -151,7 +179,8 @@ Then run: terraform init terraform plan terraform apply -terraform output -raw ansible_inventory_yaml > ../../../ansible/inventory/generated/prod.yml +mkdir -p ../../../ansible/prod/inventory/generated +terraform output -raw ansible_inventory_yaml > ../../../ansible/prod/inventory/generated/prod.yml ``` ## 🧱 Setup Flow (Canonical Order) @@ -206,8 +235,7 @@ Recommended: ## ⚠️ Known Gaps / Notes -- Ansible role/playbook source code is described by docs but is not currently present in this repository. -- `ansible/inventory/generated/prod.yml` is expected output path but may not exist until generated. +- `ansible/prod/inventory/generated/prod.yml` is an expected output path but may not exist until generated. - Some roadmap steps target files under the broader `iklim.co` application repository, not this repository alone. ## ✅ Quick Validation Checklist @@ -218,7 +246,7 @@ After Terraform apply: - floating IP exists and is attached - firewalls expose only intended public ports - placement groups are assigned -- generated inventory YAML is exported to `ansible/inventory/generated/*.yml` +- generated inventory YAML is exported to `ansible/{test,prod}/inventory/generated/*.yml` After bootstrap/deploy phases: diff --git a/setup/03-test-ansible-bootstrap.md b/setup/03-test-ansible-bootstrap.md index a0be634..448cfb4 100644 --- a/setup/03-test-ansible-bootstrap.md +++ b/setup/03-test-ansible-bootstrap.md @@ -40,6 +40,16 @@ Ansible, kontrol makinesinde (kendi bilgisayarınızda) yüklü olmalıdır. Hed pipx install --include-deps ansible ``` +### Ek Python Bağımlılıkları + +`password_hash` filtresi için `passlib` kontrol makinesinde gereklidir: + +```bash +pipx inject ansible passlib +``` + +> `pip` ile kurduysanız: `pip install passlib` + ### Kurulumun Doğrulanması Hangi yöntemle kurarsanız kurun, kurulumun başarılı olduğunu doğrulamak için aşağıdaki komutları kullanın: @@ -99,8 +109,9 @@ ansible/ generated/ test.yml group_vars/ - all.yml - test.yml + all/ + vars.yml + vault.yml test-bootstrap.yml roles/ base/ @@ -117,8 +128,8 @@ ansible/ Tüm test node'larına uygulanır: - `dnf update` -- temel paketler (sırasıyla kurulur): - - `epel-release` — fail2ban ve davfs2 bu repo'dan gelir; önce kurulur +- `epel-release` — ayrı task olarak önce kurulur; `fail2ban`, `davfs2`, `htop`, `btop` bu repoya bağımlı +- temel paketler (`epel-release` aktif olduktan sonra): - `curl` - `wget` - `git` @@ -133,10 +144,12 @@ Tüm test node'larına uygulanır: - `chrony` - `python3` - `python3-pip` + - `python3-passlib` — `password_hash` filtresi için (EPEL) - `htop` — interaktif proses izleme (EPEL) - `btop` — kaynak monitörü, grafik arayüz (EPEL) - timezone: `Europe/Istanbul` - hostname ayarı +- klavye düzeni: `trq` (Türkçe Q) - sistem reboot gerekiyorsa kontrollü reboot ## Security Hardening Role @@ -150,9 +163,11 @@ Tüm test node'larına uygulanır: - `MaxAuthTries 3` - `fail2ban` SSH jail aktif edilir. - `dnf-automatic` ile otomatik güvenlik güncelleştirmeleri aktif edilir. +- `iklim` sistem kullanıcısı oluşturulur; `wheel` grubuna eklenir (şifre vault'tan alınır). - `firewalld` default: - incoming: deny (drop zone) - outgoing: allow +- SSH kuralı önce `drop` zone'a rich rule olarak yazılır, ardından default zone `drop` yapılır — kilitleme riski ortadan kalkar. - Public SSH sadece admin CIDR'dan açılır. ### SELinux Kararı @@ -252,6 +267,7 @@ Docker convenience script kullanılmayacak. Production benzeri test ortamı içi /opt/iklimco/init /opt/iklimco/init/postgresql /opt/iklimco/init/mongodb +/opt/iklimco/stacks ``` DB node üzerinde manuel DB kurulumu için minimum: @@ -281,37 +297,29 @@ Hetzner StorageBox'u WebDAV (DAVFS) protokolü üzerinden `/mnt/storagebox` olar ### Role Değişkenleri -`group_vars/all.yml` — tüm ortamlar için ortak: +Tüm değişkenler `group_vars/all/vars.yml` içinde tanımlanır: ```yaml storagebox_account: "u469968" -``` - -`group_vars/test.yml` — test ortamına özgü; user ve url account'tan türetilir: - -```yaml -storagebox_user: "{{ storagebox_account }}-sub1" +storagebox_user: "{{ storagebox_account }}-sub4" storagebox_url: "https://{{ storagebox_user }}.your-storagebox.de/" -storagebox_password: "{{ vault_storagebox_password }}" # Ansible Vault ile saklanır +storagebox_password: "{{ vault_storagebox_password }}" storagebox_mount_point: "/mnt/storagebox" ``` -Prod ortamında yalnızca suffix değişir (`sub4` → `sub5`), geri kalan her şey türetilir. +Prod ortamında suffix `sub4` → `sub5` olarak değişir. -`vault_storagebox_password` değeri Ansible Vault ile şifreli `group_vars/test-vault.yml` içinde tutulur: +Şifreler Ansible Vault ile şifreli `group_vars/all/vault.yml` içinde tutulur: ```bash -# Sifreleme -ansible-vault encrypt group_vars/test-vault.yml - -# Düzenleme -ansible-vault edit group_vars/test-vault.yml +ansible-vault edit group_vars/all/vault.yml ``` -`test-vault.yml` içeriği: +`vault.yml` içeriği: ```yaml vault_storagebox_password: "SUB_ACCOUNT_PAROLASI" +vault_iklim_password: "IKLIM_KULLANICI_PAROLASI" ``` ### Adımlar diff --git a/setup/07-prod-ansible-bootstrap.md b/setup/07-prod-ansible-bootstrap.md index 3f7d278..c6dca58 100644 --- a/setup/07-prod-ansible-bootstrap.md +++ b/setup/07-prod-ansible-bootstrap.md @@ -39,6 +39,16 @@ Ansible, kontrol makinesinde (kendi bilgisayarınızda) yüklü olmalıdır. Hed pipx install --include-deps ansible ``` +### Ek Python Bağımlılıkları + +`password_hash` filtresi için `passlib` kontrol makinesinde gereklidir: + +```bash +pipx inject ansible passlib +``` + +> `pip` ile kurduysanız: `pip install passlib` + ### Kurulumun Doğrulanması Hangi yöntemle kurarsanız kurun, kurulumun başarılı olduğunu doğrulamak için aşağıdaki komutları kullanın: @@ -102,8 +112,9 @@ ansible/ generated/ prod.yml group_vars/ - all.yml - prod.yml + all/ + vars.yml + vault.yml prod-bootstrap.yml roles/ base/ @@ -120,8 +131,8 @@ ansible/ Tüm prod node'larına uygulanır: - Paket cache update -- Temel paketler (sırasıyla kurulur): - - `epel-release` — fail2ban ve davfs2 bu repo'dan gelir; önce kurulur +- `epel-release` — ayrı task olarak önce kurulur; `fail2ban`, `davfs2`, `htop`, `btop` bu repoya bağımlı +- temel paketler (`epel-release` aktif olduktan sonra): - `curl` - `wget` - `git` @@ -133,14 +144,15 @@ Tüm prod node'larına uygulanır: - `tree` - `ca-certificates` - `fail2ban` - - `firewalld` - `chrony` - `python3` - `python3-pip` + - `python3-passlib` — `password_hash` filtresi için (EPEL) - `htop` — interaktif proses izleme (EPEL) - `btop` — kaynak monitörü, grafik arayüz (EPEL) - timezone: `Europe/Istanbul` - hostname ayarı +- klavye düzeni: `trq` (Türkçe Q) - chrony/NTP aktif ## Security Hardening Role @@ -154,7 +166,9 @@ Tüm prod node'larına uygulanır: - `MaxAuthTries 3` - `fail2ban` aktif edilir. - `dnf-automatic` ile otomatik güvenlik güncelleştirmeleri aktif edilir. +- `iklim` sistem kullanıcısı oluşturulur; `wheel` grubuna eklenir (şifre vault'tan alınır). - `firewalld` default: incoming deny (drop zone), outgoing allow. +- SSH kuralı önce `drop` zone'a rich rule olarak yazılır, ardından default zone `drop` yapılır. - SSH sadece admin CIDR'dan açılır. - DB portları public açılmaz. @@ -221,7 +235,7 @@ Her node'a uygulanır. Sunucu üzerinde ed25519 SSH anahtar çifti üretilir ve ## Kabul Kriterleri -- `ansible -i inventory/generated/prod.yml all -m ping` başarılı olur. +- `ansible all -m ping` başarılı olur. - 3 Swarm manager node `docker node ls` içinde Leader/Reachable görünür. - 3 DB node `docker node ls` içinde Worker olarak görünür. - Manager quorum sağlanır (3 manager, 1 kayıp tolere edilir).