Files
server-infra/roles/web-static/tasks/main.yml
T
westfarn 658152088e
Sync runner checkout / sync (push) Successful in 6s
Treat omitted host_apps.enabled as true (#36)
Closes #35.

## Summary
- `#33` used Jinja `rejectattr('enabled', 'equalto', false)` to skip stopped apps. That filter **requires** the key, so every `host_apps` row that omits `enabled` (the documented default) crashed deploy on all webservers before git/compose.
- Filter with `item.enabled | default(true)` instead, in `app-deploy` and `web-static`. `print_forge` (`enabled: false`) still skipped. `url_shortening_service` and every other omitted-key row deploy again.

## Test plan
- [ ] `ansible-playbook playbooks/deploy-apps.yml --syntax-check`
- [ ] Redeploy `url_shortening_service` beta: `deploy.sh --app url_shortening_service --env beta --ref <sha>`
- [ ] Confirm `print_forge` is still not started (no compose up on 8007/8019)

Reviewed-on: #36
2026-09-16 08:21:29 -07:00

97 lines
3.4 KiB
YAML

---
# Serves node/vite static builds (dta_webapp beta/prod) via a single nginx
# container. Skips itself on hosts that have no node-static apps.
- name: web-static | node-static app names
ansible.builtin.set_fact:
_node_names: "{{ app_catalog | dict2items | selectattr('value.type', 'equalto', 'node-static') | map(attribute='key') | list }}"
# rejectattr('enabled', …) raises when the key is omitted. Omit = enabled (#35).
- name: web-static | reset static apps
ansible.builtin.set_fact:
_static_apps: []
- name: web-static | this host's static apps
ansible.builtin.set_fact:
_static_apps: "{{ _static_apps + [item] }}"
loop: "{{ host_apps | default([]) }}"
when:
- item.name in _node_names
- item.enabled | default(true)
loop_control:
label: "{{ item.name }}/{{ item.env }}"
- name: web-static | configure and run
when: _static_apps | length > 0
block:
- name: web-static | ensure project dir
ansible.builtin.file:
path: "{{ web_static_dir }}"
state: directory
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0750"
- name: web-static | nginx config
ansible.builtin.template:
src: nginx.conf.j2
dest: "{{ web_static_dir }}/nginx.conf"
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0644"
register: _nginx_conf
- name: web-static | compose file
ansible.builtin.template:
src: docker-compose.yml.j2
dest: "{{ web_static_dir }}/docker-compose.yml"
owner: "{{ admin_user }}"
group: "{{ admin_user }}"
mode: "0644"
register: _compose_file
# Free host ports before bind. Catches leftover/orphan containers from older
# compose projects that still publish 8080/8081/etc. Includes the current
# web-static container when present — compose up recreates it next.
- name: web-static | find containers publishing static ports
ansible.builtin.command:
cmd: docker ps -q --filter publish={{ item }}
loop: "{{ _static_apps | map(attribute='port') | list | unique }}"
register: _port_holders
changed_when: false
become: true
- name: web-static | unique container ids on static ports
ansible.builtin.set_fact:
_stale_port_cids: "{{ _port_holders.results | map(attribute='stdout_lines') | flatten | unique | list }}"
- name: web-static | remove containers holding static ports
ansible.builtin.command:
cmd: "docker rm -f {{ _stale_port_cids | join(' ') }}"
when: _stale_port_cids | length > 0
become: true
changed_when: true
register: _stale_port_rm
- name: web-static | start container
ansible.builtin.command:
cmd: >-
docker compose up -d --remove-orphans
{{ '--force-recreate' if (_compose_file is changed or (_stale_port_rm is changed)) else '' }}
chdir: "{{ web_static_dir }}"
become: true
become_user: "{{ admin_user }}"
changed_when: true
- name: web-static | reload nginx on config change
ansible.builtin.command:
cmd: "docker compose exec -T web-static nginx -s reload"
chdir: "{{ web_static_dir }}"
become: true
become_user: "{{ admin_user }}"
when:
- _nginx_conf is changed
- _compose_file is not changed
- _stale_port_rm is not changed
changed_when: true