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.
143 lines
4.3 KiB
Markdown
143 lines
4.3 KiB
Markdown
# 04 - Test DB Docker Kurulumu (Swarm Worker)
|
||
|
||
Bu aşamanın amacı `iklim-db-01` node'unu Swarm'a worker olarak eklemek ve PostgreSQL ile MongoDB'yi Swarm servisi olarak çalıştırmaktır.
|
||
|
||
## Mimari Karar
|
||
|
||
Yol haritasında DB'lerin "manuel" kurulacağı belirtilmiştir. Test ortamında bu "manuel" süreç, DB'lerin işletim sistemine doğrudan kurulması yerine, **Swarm Worker** üzerinde Docker konteynerleri olarak ayağa kaldırılması şeklinde uygulanacaktır.
|
||
|
||
**Neden?**
|
||
1. **Yönetim Kolaylığı:** Docker ile versiyon geçişleri ve konfigürasyon yönetimi çok daha hızlıdır.
|
||
2. **Overlay Network:** Uygulama servisleri (`iklim-app-01`), DB'lere `iklimco-net` overlay network üzerinden şifreli ve izole bir şekilde erişebilir.
|
||
3. **Veri Kalıcılığı:** Veriler Hetzner StorageBox (`/mnt/storagebox`) üzerinde saklanarak host bağımsızlığı sağlanır.
|
||
|
||
## Ön Koşullar
|
||
|
||
- `03-test-ansible-bootstrap.md` her iki node'da tamamlanmış olmalı.
|
||
- StorageBox `/mnt/storagebox` olarak her iki node'da mount edilmiş olmalı.
|
||
- Docker `iklim-db-01` üzerinde kurulu olmalı (Bootstrap role bunu yapar).
|
||
|
||
## 1. Firewall Güncellemesi
|
||
|
||
`iklim-db-01`'in Swarm'a katılabilmesi ve uygulama trafiğini kabul etmesi için `terraform/hetzner/test/firewall.tf` dosyasına kurallar eklenmelidir.
|
||
|
||
### Swarm İletişimi (App Subnet <-> DB Subnet)
|
||
Swarm yönetimi için `2377/tcp`, `7946/tcp/udp` ve `4789/udp` portları her iki subnet arasında karşılıklı açık olmalıdır.
|
||
|
||
### DB Erişimi (App Subnet -> DB Subnet)
|
||
- **PostgreSQL:** `5432/tcp`
|
||
- **MongoDB:** `27017/tcp`
|
||
|
||
Güncellemeyi yaptıktan sonra:
|
||
```bash
|
||
cd terraform/hetzner/test
|
||
terraform apply
|
||
```
|
||
|
||
## 2. DB Node'u Swarm'a Ekleme
|
||
|
||
**iklim-app-01 üzerinde (Manager)** join token alın:
|
||
```bash
|
||
docker swarm join-token worker
|
||
```
|
||
|
||
**iklim-db-01 üzerinde (Worker)** Swarm'a katılın:
|
||
```bash
|
||
docker swarm join --token <TOKEN> 10.10.10.11:2377
|
||
```
|
||
|
||
**iklim-app-01 üzerinde** node'u etiketleyin:
|
||
```bash
|
||
docker node update --label-add role=db iklim-db-01
|
||
```
|
||
|
||
## 3. StorageBox Dizin Yapısı
|
||
|
||
**iklim-db-01 üzerinde:**
|
||
```bash
|
||
mkdir -p /mnt/storagebox/test/db/postgresql/data
|
||
mkdir -p /mnt/storagebox/test/db/mongodb/data
|
||
mkdir -p /mnt/storagebox/test/db/mongodb/log
|
||
mkdir -p /mnt/storagebox/test/db/mongodb/config
|
||
```
|
||
|
||
## 4. Veritabanı Konfigürasyonları
|
||
|
||
### MongoDB Config (`mongod.conf`)
|
||
`/mnt/storagebox/test/db/mongodb/config/mongod.conf` dosyasını oluşturun:
|
||
```yaml
|
||
storage:
|
||
dbPath: /data/db
|
||
journal:
|
||
enabled: true
|
||
systemLog:
|
||
destination: file
|
||
logAppend: true
|
||
path: /data/log/mongod.log
|
||
net:
|
||
port: 27017
|
||
bindIp: 0.0.0.0
|
||
security:
|
||
authorization: enabled
|
||
```
|
||
|
||
## 5. DB Stack Kurulumu
|
||
|
||
`/opt/iklimco/stacks/db.yml` (iklim-app-01 üzerinde):
|
||
```yaml
|
||
version: "3.8"
|
||
|
||
networks:
|
||
iklimco-net:
|
||
external: true
|
||
|
||
services:
|
||
postgresql:
|
||
image: postgis/postgis:17-3.5
|
||
environment:
|
||
POSTGRES_USER: "${DATABASE_POSTGRES_ROOT_USER}"
|
||
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
|
||
POSTGRES_DB: postgres
|
||
PGDATA: /var/lib/postgresql/data/pgdata
|
||
volumes:
|
||
- /mnt/storagebox/test/db/postgresql/data:/var/lib/postgresql/data
|
||
networks:
|
||
- iklimco-net
|
||
deploy:
|
||
placement:
|
||
constraints:
|
||
- node.labels.role == db
|
||
|
||
mongodb:
|
||
image: mongo:8
|
||
environment:
|
||
MONGO_INITDB_ROOT_USERNAME: "${DATABASE_MONGO_ROOT_USER}"
|
||
MONGO_INITDB_ROOT_PASSWORD: "${MONGO_ROOT_PASSWORD}"
|
||
volumes:
|
||
- /mnt/storagebox/test/db/mongodb/data:/data/db
|
||
- /mnt/storagebox/test/db/mongodb/log:/data/log
|
||
- /mnt/storagebox/test/db/mongodb/config/mongod.conf:/etc/mongod.conf
|
||
command: ["--config", "/etc/mongod.conf"]
|
||
networks:
|
||
- iklimco-net
|
||
deploy:
|
||
placement:
|
||
constraints:
|
||
- node.labels.role == db
|
||
```
|
||
|
||
### Deploy
|
||
```bash
|
||
# .env dosyasını oluşturun (Hassas veriler için)
|
||
# DATABASE_POSTGRES_ROOT_USER, POSTGRES_PASSWORD, DATABASE_MONGO_ROOT_USER, MONGO_ROOT_PASSWORD
|
||
|
||
docker stack deploy -c /opt/iklimco/stacks/db.yml iklim-db
|
||
```
|
||
|
||
## 6. Kabul Kriterleri
|
||
|
||
- `docker node ls` komutunda `iklim-db-01` Ready ve Active görünür.
|
||
- `docker stack services iklim-db` her iki servisi 1/1 replica ile gösterir.
|
||
- Uygulama node'undan `iklim-db_postgresql` ve `iklim-db_mongodb` DNS isimleriyle erişim sağlanır.
|
||
- Reboot sonrası veriler `/mnt/storagebox` üzerinden korunur.
|