- Move Simon's architecture documentation into architecture/ (setup, variables, topology, dns, deploy, security, operations plus index and glossary). All cross-repo references point at https://git.digitalboard.ch/Digitalboard/{reference-ansible,dns-zones} via absolute URLs so the docs remain navigable from any context. - Rewrite README.md as a documentation hub: introduction, platform Mermaid overview, comparison of the three repos (docs / digitalboard.core / reference-ansible) and a full table of contents covering architecture, contributing, infrastructure, keycloak, ms-entra and troubleshooting. Addresses the open items from the WKS PoC review (2026-05-26): docs README begrüssungstext + Übersichtsgrafik + Verlinkung der beiden anderen Repos, sowie das Verschieben der Architektur-Doku.
4.6 KiB
Operations — new tenants and known gaps
← Back to Architecture index
10. Walkthrough: creating a new demo tenant
Recommended template: demo-gymburgdorf (not vagrant, since its
group topology is incompatible).
-
Copy the inventory:
cp -r inventories/demo-gymburgdorf inventories/demo-<customer> -
Adjust
hosts.yml: IPs and hostnames per host. -
group_vars/all/vault.yml— pointvault_mountat the new tenant mount (demo-<customer>). -
group_vars/traefik_servers/traefik.yml— bendtraefik_acme_dns_zoneand thetraefik_acme_tsig_*lookup paths to the new zone / new Bao path. -
host_vars/application/*.ymlandhost_vars/storage/*.yml— walk through them: FQDNs to the new domain pattern (e.g.*.<customer>.souveredu.ch), Bao lookup paths todemo-<customer>/data/…. -
Prepare OpenBao (out-of-band, not via Ansible):
- Create a new KV-v2 mount
demo-<customer>. - Write secrets:
acme-tsig,authentik,nextcloud,garage, … (see security.md for the mandatory-override list). - Policy for the deploy token: read on
demo-<customer>/data/*.
- Create a new KV-v2 mount
-
DNS (in the
dns-zonesrepo, see dns.md):- Add
key:andacl:entries for the new tenant inknot/knot.conf, patternacme_update_key_demo_<customer>/acme_updates_demo_<customer>scoped todemo-<customer>._acme.digitalboard.ch.. - Append the new ACL to the
_acme.digitalboard.chzone'sacl:list — the tenants share the parent zone, no NS delegation. - In
zones/souveredu.ch.zone(or the tenant's public zone) add the public/internal A records (rvp.<customer>,reverseproxy.int.<customer>,application.int.<customer>,storage.int.<customer>, …), the service CNAMEs torvp.<customer>, and the_acme-challenge.*CNAMEs intodemo-<customer>._acme.digitalboard.ch. Bump the SOA serial. make deploy_ns1to push.
- Add
-
Makefile — add a new target modelled on
deploy_site_demo_gymburgdorfand wire it intodeploy_site_demo. -
Smoke test:
ansible all -i inventories/demo-<customer>/hosts.yml -m ping. -
Deploy: Bao login +
make deploy_site_demo_<customer>.
11. Known gaps and trade-offs
- Optional services without group bindings in
demo-gymburgdorf:opencloud,send,opnform,homarr, andbookstackare declared as plays in playbooks/site.yml but have no<service>_serversgroup in the inventory — those plays run as no-ops. If needed, add the group +host_vars/application/<svc>.ymlas described in topology.md. Mind spelling:opnform_servers(notopenform/openforms). turnhost: defined in the DMZ, but no STUN/TURN role in playbooks/site.yml. Currently provisioned only viabase+traefik.- Idempotency: roles are Docker-Compose-based; re-runs may trigger container restarts when compose inputs change. There is no dedicated rollback mechanism — on failure, roll back manually to the previous state.
- TLS renewal: handled internally by Traefik via ACME. There is no external renewal cron in the repo.
- CI / testing: not present in the repo. Smoke test is
make ping_demo. - Logs: Traefik runs with
traefik_log_level: DEBUGindemo-gymburgdorfandvagrant(role default isINFO) — reduce toINFOorWARNbefore adapting for production. - TSIG secrets in
knot.conf: thedns-zonesrepo currently stores all four ACME TSIG keys in plaintext inknot/knot.conf. The Ansible side reads them from Bao, but the Knot side does not — anyone with read on thedns-zonesrepo can write TXT records under the matching tenant's ACME sub-tree. For prod, source the Knot keys from a templated config + secret store, or restrict repo access. - Demo tenants share
_acme.digitalboard.ch: isolation is by Knot ACLupdate-owner-name, not by zone delegation. A mis-edit of the ACL list could break ACL-based isolation without breaking DNS resolution — failure is silent. The production zone (digitalboard.ch) uses a properly delegated child zone and is not affected.