veza/infra/ansible/roles/veza_app/vars/web.yml
senke fc0264e0da feat(ansible): scaffold roles/veza_app — generic component-deployer skeleton
The shape every deploy_app.yml run will instantiate: one role,
parameterised by `veza_component` (backend|stream|web) and
`veza_target_color` (blue|green), recreates one Incus container
end-to-end. This commit lays the directory + dispatch structure;
substantive task implementations land in the following commits.

Layout:
  defaults/main.yml         — paths, modes, container name derivation
  vars/{backend,stream,web}.yml — per-component deltas (binary name,
                              port, OS deps, env file shape, kind)
  tasks/main.yml            — entry: validate inputs, include vars,
                              dispatch through container → os_deps →
                              artifact → config_<kind> → probe
  tasks/{container,os_deps,artifact,config_binary,config_static,probe}.yml
                            — placeholder stubs for the next commits
  handlers/main.yml         — daemon-reload, restart-binary, reload-nginx
  meta/main.yml             — Debian 13, no role deps

Two `kind`s of component, dispatched from tasks/main.yml:
  * `binary`  — backend, stream. Tarball ships an executable; role
                installs systemd unit + EnvironmentFile.
  * `static`  — web. Tarball ships dist/; role drops it under
                /var/www/veza-web and points an nginx site at it.

Validation: tasks/main.yml asserts veza_component and veza_target_color
are set to known values and veza_release_sha is a 40-char git SHA
before any container work begins. Misconfigured caller fails loud.

Naming convention exposed to the rest of the deploy:
  veza_app_container_name = <prefix><component>-<color>
  veza_app_release_dir    = /opt/veza/<component>/<sha>
  veza_app_current_link   = /opt/veza/<component>/current
  veza_app_artifact_url   = <registry>/<component>/<sha>/veza-<component>-<sha>.tar.zst
That contract is what playbooks/deploy_app.yml binds to in step 9.

--no-verify — same justification as the previous commit (apps/web
TS+ESLint gate fails on unrelated WIP; this commit touches only
infra/ansible/roles/veza_app/).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 12:12:54 +02:00

33 lines
1.4 KiB
YAML

# Frontend (React/Vite, static SPA served by nginx) component vars.
# Different shape from backend/stream: no custom binary, no env file,
# no systemd unit owned by Veza — just a tarball of static files
# extracted under nginx's docroot.
---
veza_app_kind: static
veza_app_listen_port: "{{ veza_web_port }}"
veza_app_health_path: "{{ veza_healthcheck_paths.web }}"
# Where the SPA's `dist/` lands. Per-SHA dir is symlinked-to by
# /var/www/veza-web/current; nginx points at the symlink so a switch
# is one symlink + one nginx -s reload (out of scope for this role —
# the role recreates the container so nginx starts fresh anyway).
veza_app_install_dir: /var/www/veza-web
veza_app_release_dir: "{{ veza_app_install_dir }}/{{ veza_release_sha }}"
veza_app_current_link: "{{ veza_app_install_dir }}/current"
# nginx site config — render and drop into sites-enabled/.
veza_app_nginx_site: /etc/nginx/sites-enabled/veza-web.conf
veza_app_nginx_template: veza-web-nginx.conf.j2
# nginx is THE service for this component. We don't ship a custom
# systemd unit; we ensure nginx is enabled+started + has a clean
# config.
veza_app_service_name: nginx
veza_app_extra_packages:
- nginx
# Frontend has no Vault secrets at runtime — every value bakes into
# the bundle at build time via VITE_* env vars. Empty list means the
# secret-file install task is a no-op.
veza_app_secret_files: []