This commit introduces a reordered and renumbered set of setup documentation files to better reflect the deployment stages for both test and production environments. Key changes include: * A new `setup-vs-roadmap-map.md` file to provide a clear mapping between roadmap tasks and their corresponding setup phases. * Significantly expanded Ansible bootstrap documentation for both test and production, detailing Docker, Swarm, security hardening, and StorageBox SSH key management roles. * Formalized database Docker and Swarm cluster setup instructions for test and production, including explicit steps for Swarm worker integration of DB nodes. * Updated roadmap documentation (`roadmap/prod-env/*`) to align with the refined setup, incorporating correct private IP addresses for Swarm joins, new node labels, and floating IP usage for GoDaddy DNS records.
217 lines
5.7 KiB
Markdown
217 lines
5.7 KiB
Markdown
# 07 - Prod Ansible Bootstrap
|
||
|
||
Bu aşamanın amacı Terraform ile oluşturulan prod makinelerini Linux, security hardening, Docker ve Swarm açısından hazır hale getirmektir. DB cluster yazılımı bu playbook tarafından kurulmaz; ancak DB node'ları Swarm'a worker olarak katılır.
|
||
|
||
## Ansible Kurulumu
|
||
|
||
Ansible, kontrol makinesinde (kendi bilgisayarınızda) yüklü olmalıdır. Hedef sunuculara herhangi bir ajan kurulmaz, sadece SSH erişimi yeterlidir.
|
||
|
||
### İşletim Sistemine Göre Kurulum
|
||
|
||
- **Ubuntu / Debian:**
|
||
```bash
|
||
sudo apt update
|
||
sudo apt install -y pipx python3-venv
|
||
|
||
pipx ensurepath
|
||
export PATH="$HOME/.local/bin:$PATH"
|
||
|
||
pipx install --include-deps ansible
|
||
```
|
||
|
||
- **Fedora / Rocky Linux / RHEL:**
|
||
```bash
|
||
sudo dnf install -y pipx python3-virtualenv
|
||
|
||
pipx ensurepath
|
||
export PATH="$HOME/.local/bin:$PATH"
|
||
|
||
pipx install --include-deps ansible
|
||
```
|
||
|
||
- **macOS (Homebrew):**
|
||
```bash
|
||
brew install ansible
|
||
```
|
||
|
||
- **Python Pip ile (Her platformda):**
|
||
```bash
|
||
pipx install --include-deps ansible
|
||
```
|
||
|
||
### 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:
|
||
|
||
```bash
|
||
# Ansible versiyonunu ve yapılandırma yollarını kontrol edin
|
||
ansible --version
|
||
|
||
# Ansible binary’sinin hangi konumdan çalıştığını kontrol edin
|
||
which -a ansible
|
||
```
|
||
|
||
## Ansible Komutlarını Çalıştırma
|
||
|
||
Tüm komutlar projenin `ansible/` dizini altından çalıştırılmalıdır.
|
||
|
||
### 1. Bağlantı Testi (Ping)
|
||
Sunuculara erişimi doğrulamak için:
|
||
```bash
|
||
ansible -i inventory/generated/prod.yml all -m ping
|
||
```
|
||
|
||
### 2. Bootstrap Playbook'unu Çalıştırma
|
||
Tüm rolleri (base, hardening, docker, swarm vb.) uygulamak için:
|
||
```bash
|
||
ansible-playbook -i inventory/generated/prod.yml playbooks/prod-bootstrap.yml --ask-vault-pass
|
||
```
|
||
|
||
## Hedef Makineler
|
||
|
||
| Host | Rol |
|
||
| --- | --- |
|
||
| `iklim-app-01` | Swarm manager + app worker |
|
||
| `iklim-app-02` | Swarm manager + app worker |
|
||
| `iklim-app-03` | Swarm manager + app worker |
|
||
| `iklim-db-01` | Manuel DB cluster node |
|
||
| `iklim-db-02` | Manuel DB cluster node |
|
||
| `iklim-db-03` | Manuel DB cluster node |
|
||
|
||
## Önerilen Dosya Yapısı
|
||
|
||
```text
|
||
ansible/
|
||
prod/
|
||
ansible.cfg
|
||
inventory/
|
||
generated/
|
||
prod.yml
|
||
group_vars/
|
||
all.yml
|
||
prod.yml
|
||
prod-bootstrap.yml
|
||
roles/
|
||
base/
|
||
hardening/
|
||
docker/
|
||
swarm/
|
||
node_dirs/
|
||
storagebox/
|
||
```
|
||
|
||
## Base Role
|
||
|
||
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
|
||
- `curl`
|
||
- `wget`
|
||
- `git`
|
||
- `jq`
|
||
- `tar`
|
||
- `unzip`
|
||
- `bash-completion`
|
||
- `gettext` — envsubst için; CI/CD deploy pipeline'larında gerekli
|
||
- `tree`
|
||
- `ca-certificates`
|
||
- `fail2ban`
|
||
- `firewalld`
|
||
- `chrony`
|
||
- `python3`
|
||
- `python3-pip`
|
||
- `htop` — interaktif proses izleme (EPEL)
|
||
- `btop` — kaynak monitörü, grafik arayüz (EPEL)
|
||
- timezone: `Europe/Istanbul`
|
||
- hostname ayarı
|
||
- chrony/NTP aktif
|
||
|
||
## Security Hardening Role
|
||
|
||
Tüm prod node'larına uygulanır:
|
||
|
||
- SSH password auth kapatılır.
|
||
- Root SSH login kapatılır.
|
||
- Sadece SSH key auth kalır.
|
||
- `PermitEmptyPasswords no`
|
||
- `MaxAuthTries 3`
|
||
- `fail2ban` aktif edilir.
|
||
- `dnf-automatic` ile otomatik güvenlik güncelleştirmeleri aktif edilir.
|
||
- `firewalld` default: incoming deny (drop zone), outgoing allow.
|
||
- SSH sadece admin CIDR'dan açılır.
|
||
- DB portları public açılmaz.
|
||
|
||
Hetzner Cloud Firewall asıl perimeter kabul edilir. firewalld host üzerinde ikinci savunma katmanıdır.
|
||
|
||
## Docker Role
|
||
|
||
Tüm prod node'larında (hem app hem db) zorunludur. DB node'ları Swarm Worker olarak ağa dahil olacağı için Docker Engine her makinede kurulu olmalıdır.
|
||
|
||
Kurulacak paketler:
|
||
|
||
- `docker-ce`
|
||
- `docker-ce-cli`
|
||
- `containerd.io`
|
||
- `docker-buildx-plugin`
|
||
- `docker-compose-plugin`
|
||
|
||
Kurulum resmi Docker dnf repository üzerinden yapılacak (`https://download.docker.com/linux/rhel/docker-ce.repo`).
|
||
|
||
## Swarm Role
|
||
|
||
Prod Swarm 3 manager ile kurulacak:
|
||
|
||
1. `iklim-app-01` üzerinde `docker swarm init` (Advertise/data path addr: `10.20.10.11`)
|
||
2. `iklim-app-02` ve `iklim-app-03` manager olarak join olur.
|
||
3. `iklim-db-01/02/03` worker olarak join olur.
|
||
4. Overlay network oluşturulur: `iklimco-net`
|
||
5. Node etiketleri:
|
||
- `iklim-app-*` -> `type=service`
|
||
- `iklim-db-*` -> `role=db`
|
||
6. Tüm node'lar `AVAILABILITY=Active` kalır.
|
||
|
||
## Node Directory Role
|
||
|
||
Tüm `iklim-app-*` node'larında:
|
||
```text
|
||
/opt/iklimco/ssl
|
||
/opt/iklimco/init
|
||
/opt/iklimco/stacks
|
||
```
|
||
|
||
DB node'larında:
|
||
```text
|
||
/opt/iklimco/db
|
||
/opt/iklimco/backup
|
||
```
|
||
|
||
## StorageBox DAVFS Mount Role
|
||
|
||
Her node'a uygulanır (tüm `iklim-app-*` ve `iklim-db-*`).
|
||
|
||
### Prod Sub-Account
|
||
|
||
| Parametre | Değişken | Değer |
|
||
| --- | --- | --- |
|
||
| Ana hesap | `storagebox_account` | `u469968` |
|
||
| Sub-account | `storagebox_user` | `u469968-sub5` |
|
||
| WebDAV URL | `storagebox_url` | `https://u469968-sub5.your-storagebox.de/` |
|
||
| Mount point | `storagebox_mount_point` | `/mnt/storagebox` |
|
||
|
||
## StorageBox SSH Key Role
|
||
|
||
Her node'a uygulanır. Sunucu üzerinde ed25519 SSH anahtar çifti üretilir ve StorageBox ana hesabına yüklenir.
|
||
|
||
## Kabul Kriterleri
|
||
|
||
- `ansible -i inventory/generated/prod.yml 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).
|
||
- `iklimco-net` overlay network vardır.
|
||
- Node etiketleri (`type=service`, `role=db`) inspect ile doğrulanır.
|
||
- Her node'da `/mnt/storagebox` mount edilmiştir.
|
||
- Public firewall sadece `22`, `80`, `443` ingress'e izin verir.
|