Sync runner checkout / sync (push) Successful in 7s
## Summary
- Change `dta_webapp` `webroot_pattern` from `/var/www/{env}.app.ditchtheagent/html` → `/var/www/{env}.realpath.app/html`
- Update `IMPLEMENTATION.md` references to match
- **web-static:** before `compose up`, `docker rm -f` any container publishing the static host ports (`docker ps --filter publish=<port>`), then force-recreate when cleanup ran — clears orphan/legacy binders while keeping the same ports
Closes #12
Coordinates with [dta_webapp#48](Ditch_The_Agent/dta_webapp#48) / [PR #49](Ditch_The_Agent/dta_webapp#49) (`build:beta`/`build:prod` write to the same dirs; prod uses `prod.realpath.app`).
## Test plan
- [ ] Confirm `app_catalog.dta_webapp.webroot_pattern` expands to beta/prod realpath paths
- [ ] On a host with a leftover container on 8080/8081, run deploy and confirm it is removed and web-static rebinds
- [ ] After merge, redeploy `dta_webapp` beta (and prod when ready) and verify files under `/var/www/{env}.realpath.app/html`
- [ ] Hit web-static ports and confirm new build content servedReviewed-on: #13
86 lines
3.1 KiB
YAML
86 lines
3.1 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 }}"
|
|
|
|
- name: web-static | this host's static apps
|
|
ansible.builtin.set_fact:
|
|
_static_apps: "{{ host_apps | default([]) | selectattr('name', 'in', _node_names) | list }}"
|
|
|
|
- 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
|