diff --git a/ansible/README.md b/ansible/README.md index 0403de6..3baa6e7 100644 --- a/ansible/README.md +++ b/ansible/README.md @@ -312,7 +312,7 @@ Ana playbook: `prod-bootstrap.yml` | `node_dirs` | `node_dirs` | `all` | Node dizinleri (`/opt/iklimco/...`) | | `storagebox` | `storagebox` | `all` | WebDAV mount ve yönetilen dizinlerin oluşturulması | | `storagebox_ssh_key` | `storagebox_ssh_key` | `all` | StorageBox SSH key üretimi | -| `swarm` | `swarm` | `app`, `db` | Swarm init/join, overlay ağ, node label'ları | +| `swarm` | `swarm` | `app`, `db` | Swarm init/join, `iklimco-net` overlay ağı (MTU=1400), node label'ları | | `db_labels` | inline task | `iklim-app-01` | DB node'larına `role=db` ve `db-index=01/02/03` label'ı ekler | | `db_stack` | `db_stack` | `db` | StorageBox'ta MongoDB ve PostgreSQL config dizinleri | | `act_runner` | `act_runner` | `app` | Gitea Actions runner kurulumu ve kaydı | diff --git a/ansible/prod/group_vars/db/vars.yml b/ansible/prod/group_vars/db/vars.yml index 80c12d9..c1085db 100644 --- a/ansible/prod/group_vars/db/vars.yml +++ b/ansible/prod/group_vars/db/vars.yml @@ -1,6 +1,7 @@ # DB node'larında StorageBox uid/gid=999 (mongodb ve postgres container user) # davfs2 dosyaları uid 999 sahibi gösterir; container içi erişim açılır. +# file_mode=0600: MongoDB keyfile "too open" hatasını engeller (0666 reddedilir). storagebox_dir_mode: "0777" -storagebox_file_mode: "0666" +storagebox_file_mode: "0600" storagebox_uid: "999" storagebox_gid: "999" diff --git a/ansible/roles/act_runner/templates/config.yaml.j2 b/ansible/roles/act_runner/templates/config.yaml.j2 index e061d9e..710eaba 100644 --- a/ansible/roles/act_runner/templates/config.yaml.j2 +++ b/ansible/roles/act_runner/templates/config.yaml.j2 @@ -21,9 +21,9 @@ cache: external_server: "" container: - # Job container'ları iklimco-net overlay network'üne katılır; - # böylece iklim-db_postgresql ve iklim-db_mongodb servislerine direkt erişebilir. - network: "iklimco-net" + # Job containers start on bridge. The deploy workflow connects them to iklimco-net + # after the stack is deployed (so iklimco-net exists before the runner tries to use it). + network: "bridge" enable_ipv6: false privileged: false options: "-v /mnt/storagebox:/mnt/storagebox" diff --git a/ansible/roles/node_dirs/tasks/main.yml b/ansible/roles/node_dirs/tasks/main.yml index 5ab5081..fa23fab 100644 --- a/ansible/roles/node_dirs/tasks/main.yml +++ b/ansible/roles/node_dirs/tasks/main.yml @@ -15,6 +15,18 @@ - /opt/iklimco/backup when: inventory_hostname in groups['db'] +- name: Create db data directories (bind mounts for MongoDB and PostgreSQL) + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "999" + group: "999" + mode: '0700' + loop: + - /opt/iklimco/db/mongodb + - /opt/iklimco/db/postgresql + when: inventory_hostname in groups['db'] + - name: Create service node directories ansible.builtin.file: path: "{{ item }}" diff --git a/ansible/roles/swarm/tasks/main.yml b/ansible/roles/swarm/tasks/main.yml index f039d08..538b679 100644 --- a/ansible/roles/swarm/tasks/main.yml +++ b/ansible/roles/swarm/tasks/main.yml @@ -52,17 +52,9 @@ - inventory_hostname in groups['db'] - swarm_status.stdout != 'active' -# 5. Overlay Network oluşturulması (Sadece bir kez Leader üzerinden) -- name: Create iklimco-net overlay network - community.docker.docker_network: - name: iklimco-net - driver: overlay - attachable: yes - state: present - delegate_to: "{{ groups['app'][0] }}" - run_once: true - -# 6. Node Etiketleri (Labels) +# 5. Node Etiketleri (Labels) +# iklimco-net overlay network is created and owned by the Swarm stack (docker-stac-infra_db-prod.yml). +# Stack-owned networks get full Docker DNS (service VIPs, aliases). No manual creation needed. - name: Label App nodes (service) ansible.builtin.shell: docker node update --label-add type=service {{ inventory_hostname }} delegate_to: "{{ groups['app'][0] }}" diff --git a/facts/prod-kurulum-gecmisi.md b/facts/prod-kurulum-gecmisi.md index 707d50f..945be27 100644 --- a/facts/prod-kurulum-gecmisi.md +++ b/facts/prod-kurulum-gecmisi.md @@ -260,5 +260,28 @@ curl -s http://10.20.20.11:8008/cluster | python3 -m json.tool | DB stack deploy (etcd + MongoDB + Patroni) | ✅ | | MongoDB replica set init (rs0: 1 primary, 2 secondary) | ✅ | | Patroni HA cluster (1 leader, 2 replica, lag=0) | ✅ | -| Ana infra stack deploy (docker-stack-infra.prod.yml) | ⏳ bekliyor | +| Ana infra stack deploy (docker-stac-infra_db-prod.yml) | ⏳ bekliyor | +| MongoDB rs.initiate (ilk deploy sonrası elle) | ⏳ bekliyor | | Deploy pipeline ilk çalışma | ⏳ bekliyor | + +## Önemli Mimari Notlar + +### Tek Stack Yaklaşımı (2026-05-26) + +`docker-stack-infra-prod.yml` ve `docker-stack-db-prod.yml` tek dosyada birleştirildi: `docker-stac-infra_db-prod.yml`. Her iki dosya da aynı `iklimco` stack adına deploy edildiğinden servis isimleri değişmedi. + +**Neden birleştirildi:** External overlay network'lerde Docker embedded DNS hiçbir entry kaydetmez (servis VIP'leri, alias'lar dahil). Stack-owned network'te Docker DNS tam çalışır — vault `retry_join`, etcd alias'ları ve tüm servis discovery sorunları çözüldü. + +**Network:** `iklimco-net` artık stack tarafından oluşturulur (MTU=1400, attachable). Ansible `swarm` rolündeki network oluşturma task'ı kaldırıldı. + +**MongoDB rs.initiate:** İlk deploy sonrası `rs.initiate` elle verilmeli (DB Stack Deploy bölümüne bakınız). + +**Network silinirse:** Stack'i yeniden deploy et — `docker stack deploy -c docker-stac-infra_db-prod.yml iklimco` + +### Vault retry_join (2026-05-25) + +`retry_join.leader_api_addr` olarak `iklimco_vault` (Swarm servis adı) kullanılır. Stack-owned network sayesinde Docker DNS bu VIP'i kayıt eder. `leader_tls_server_name: vault.iklim.co` ile `*.iklim.co` sertifikası TLS doğrulamasını geçer. + +### Runner / iklimco-net (2026-05-26) + +Act runner config'de `container.network: "bridge"` kullanılır (önceki `iklimco-net`). Workflow'da "Connect Runner to Overlay Network" adımı "Deploy Swarm Stacks" sonrasına taşındı — böylece stack'in oluşturduğu `iklimco-net`'e runner job container bağlanabilir.