# 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 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.