Skip to content

Commit b57774c

Browse files
committed
fix(idp): make local ZITADEL DHI postgres boot reliably
1 parent 59b2c62 commit b57774c

5 files changed

Lines changed: 29 additions & 7 deletions

File tree

ansible/roles/idp_zitadel/defaults/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
terrarium_zitadel_enabled: "{{ terrarium_idp_mode == 'local' }}"
22
terrarium_zitadel_dir: "{{ terrarium_state_dir }}/zitadel"
33
terrarium_zitadel_postgres_dir: "{{ terrarium_zitadel_dir }}/postgres"
4+
terrarium_zitadel_postgres_uid: 70
5+
terrarium_zitadel_postgres_gid: 70
46
terrarium_zitadel_bootstrap_dir: "{{ terrarium_zitadel_dir }}/bootstrap"
57
terrarium_zitadel_outputs_path: /etc/terrarium/zitadel-apps.json
68
terrarium_zitadel_stage_dir: "{{ terrarium_state_dir }}/zitadel-container"

ansible/roles/idp_zitadel/tasks/main.yml

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,23 @@
8787
delay: 10
8888
changed_when: false
8989

90-
- name: Create ZITADEL directories inside system instance
90+
- name: Create ZITADEL root directories inside system instance
9191
ansible.builtin.command: >-
9292
/snap/bin/lxc exec {{ terrarium_zitadel_instance_name }} -- install -d -m 0700
9393
/etc/terrarium/secrets
9494
{{ terrarium_zitadel_dir }}
95-
{{ terrarium_zitadel_postgres_dir }}
9695
{{ terrarium_zitadel_bootstrap_dir }}
9796
changed_when: false
9897

98+
- name: Create ZITADEL Postgres data directory inside system instance
99+
ansible.builtin.command: >-
100+
/snap/bin/lxc exec {{ terrarium_zitadel_instance_name }} -- install -d
101+
-o {{ terrarium_zitadel_postgres_uid }}
102+
-g {{ terrarium_zitadel_postgres_gid }}
103+
-m 0700
104+
{{ terrarium_zitadel_postgres_dir }}
105+
changed_when: false
106+
99107
- name: Migrate legacy host ZITADEL data into system instance when present
100108
ansible.builtin.shell: |
101109
set -euo pipefail
@@ -259,12 +267,14 @@
259267
- name: Enable ZITADEL compose service inside system instance
260268
ansible.builtin.command: >-
261269
/snap/bin/lxc exec {{ terrarium_zitadel_instance_name }} -- bash -lc
262-
'systemctl daemon-reload && systemctl enable --now terrarium-zitadel.service'
270+
'systemctl daemon-reload && systemctl enable terrarium-zitadel.service'
263271
changed_when: false
264272

265-
- name: Restart ZITADEL compose service after managed file changes
266-
ansible.builtin.command: "/snap/bin/lxc exec {{ terrarium_zitadel_instance_name }} -- systemctl restart terrarium-zitadel.service"
267-
when: terrarium_zitadel_compose_render.changed or terrarium_zitadel_unit_render.changed
273+
- name: Start or restart ZITADEL compose service inside system instance
274+
ansible.builtin.command: >-
275+
/snap/bin/lxc exec {{ terrarium_zitadel_instance_name }} -- systemctl
276+
{{ 'restart' if (terrarium_zitadel_compose_render.changed or terrarium_zitadel_unit_render.changed) else 'start' }}
277+
terrarium-zitadel.service
268278
269279
- name: Ensure host loopback proxies reach the ZITADEL system instance
270280
ansible.builtin.shell: |

ansible/roles/idp_zitadel/templates/docker-compose.yml.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ services:
132132
POSTGRES_USER: postgres
133133
POSTGRES_PASSWORD: "{{ terrarium_zitadel_postgres_password }}"
134134
POSTGRES_DB: zitadel
135+
PGDATA: /var/lib/postgresql/data
135136
healthcheck:
136137
test:
137138
- CMD-SHELL

ansible/roles/idp_zitadel/templates/terrarium-zitadel.service.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Wants=network-online.target
88
Type=oneshot
99
RemainAfterExit=yes
1010
WorkingDirectory={{ terrarium_zitadel_dir }}
11-
ExecStart=/usr/bin/docker compose --project-name terrarium-zitadel -f {{ terrarium_zitadel_dir }}/docker-compose.yml up -d --wait --remove-orphans
11+
ExecStart=/usr/bin/docker compose --project-name terrarium-zitadel -f {{ terrarium_zitadel_dir }}/docker-compose.yml up -d --wait --wait-timeout 600 --remove-orphans
1212
ExecStop=/usr/bin/docker compose --project-name terrarium-zitadel -f {{ terrarium_zitadel_dir }}/docker-compose.yml down
1313
TimeoutStartSec=900
1414

tests/ansible-bootstrap-cert.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ describe("Traefik bootstrap certificate template", () => {
9898
expect(tasks).toContain("lxc exec {{ terrarium_zitadel_instance_name }} -- bash -lc");
9999
expect(tasks).toContain("Migrate legacy host ZITADEL data into system instance when present");
100100
expect(tasks).toContain("Ensure host loopback proxies reach the ZITADEL system instance");
101+
expect(tasks).toContain("systemctl enable terrarium-zitadel.service");
102+
expect(tasks).toContain("Start or restart ZITADEL compose service inside system instance");
103+
expect(tasks).not.toContain("systemctl enable --now terrarium-zitadel.service");
101104
expect(tasks).not.toContain("- name: Install ZITADEL runtime packages");
102105
});
103106

@@ -119,10 +122,15 @@ describe("Traefik bootstrap certificate template", () => {
119122
const playbook = readFileSync(join(repoRoot, "ansible/site.yml"), "utf8");
120123

121124
expect(defaults).toContain("terrarium_zitadel_postgres_image: \"\"");
125+
expect(defaults).toContain("terrarium_zitadel_postgres_uid: 70");
126+
expect(defaults).toContain("terrarium_zitadel_postgres_gid: 70");
122127
expect(defaults).toContain(`terrarium_zitadel_postgres_image_hardened: "${POSTGRES_DHI_IMAGE}"`);
123128
expect(defaults).toContain(`terrarium_zitadel_postgres_image_mirror: "${POSTGRES_MIRROR_IMAGE}"`);
124129
expect(defaults).toContain(`terrarium_zitadel_postgres_image_fallback: "${POSTGRES_FALLBACK_IMAGE}"`);
125130
expect(tasks).toContain("Resolve ZITADEL Postgres image");
131+
expect(tasks).toContain("Create ZITADEL Postgres data directory inside system instance");
132+
expect(tasks).toContain("-o {{ terrarium_zitadel_postgres_uid }}");
133+
expect(tasks).toContain("-g {{ terrarium_zitadel_postgres_gid }}");
126134
expect(tasks).toContain("terrarium_zitadel_postgres_image_mirror");
127135
expect(tasks.indexOf("terrarium_zitadel_postgres_image_hardened")).toBeLessThan(
128136
tasks.indexOf("terrarium_zitadel_postgres_image_mirror")
@@ -131,6 +139,7 @@ describe("Traefik bootstrap certificate template", () => {
131139
tasks.indexOf("terrarium_zitadel_postgres_image_fallback")
132140
);
133141
expect(compose).toContain("image: {{ terrarium_zitadel_postgres_image_effective }}");
142+
expect(compose).toContain("PGDATA: /var/lib/postgresql/data");
134143
expect(playbook).toContain("Check Docker registry credentials for hardened images");
135144
expect(playbook).toContain("'terrarium_zitadel_postgres_image': terrarium_zitadel_postgres_image_effective");
136145
expect(defaults).not.toContain("postgres:17.2-alpine");

0 commit comments

Comments
 (0)