Architecture Decision Record · 0024

docs/ via separate Mittwald-Static-Files-App ausliefern

TL;DR — Der HTML-Doku-Strang unter docs/ wird in eine eigenständige Mittwald-Static-Files-App (Short-ID a-t884dh, Pfad /home/p-nxm58l/html/docs) deployed, parallel zur Drupal-App a-q7fxvm. Push auf main triggert eine zweite Azure-DevOps-Stage DeployDocs (rsync --delete über SSH), unabhängig vom Drupal-Build.

Kontext

Mit ADR-0022 wurde der komplette docs/-Strang (Plans, PRDs, ADRs, Brainstorms, Reports, Context-Snapshots, Design-Mapping, Wiki) auf HTML-First umgestellt. Die Dateien sind self-contained, brauchen keinen Build-Step und lassen sich direkt aus einem statischen HTTP-Server ausliefern.

Bisher war die Doku nur über das Repo erreichbar (lokal per file:// oder im Azure-DevOps-Git-Viewer). Stakeholder ausserhalb des Repos (Product Owner, Designer, externe Reviewer) brauchen aber einen direkten URL-Zugriff — vor allem auf docs/wiki/, docs/adr/ und docs/design/MAPPING.html.

Verfügbare Komponenten:

Entscheidung

Eine zweite Top-Level-Stage DeployDocs in azure-pipelines.yml, die bei jedem main-Push den Ordner docs/ per rsync --delete in die Static-Files-App spiegelt.

Rejected alternatives

GitHub Pages aus dem Azure-Devops-Mirror rejected

Der Code lebt primär in Azure DevOps, nicht in GitHub. Pages bräuchte einen separaten Sync-Push, Branch-Switch oder GitHub Actions — zusätzlicher Wartungspfad ausserhalb der bestehenden Pipeline. Ausserdem entstünde ein zweiter "wo ist der aktuelle Stand?"-Knoten.

docs/ als Subroute der Drupal-Site (/docs unter test.solcom.de) rejected

Hätte interne und externe Doku unter einer Domain vereint, aber: koppelt Doku-Sichtbarkeit an Drupal-Health (Wartungsfenster, fehlgeschlagene Deploys), erzwingt Webserver-Rewrite-Regeln in Drupal-Stack, und exponiert WIP-Strands (docs/tasks/, docs/brainstorms/) hinter der Marken-Domain. Static-Files-App entkoppelt sauber.

Confluence/SharePoint-Mirror rejected

Hätte stakeholder-vertraute UI gegeben, aber: bricht HTML-First (ADR-0022) durch Konversionsschritt, verliert die self-contained-Eigenschaft der Docs, und macht das Repo nicht mehr zur Source-of-Truth. Plus: kein automatisches Sync ohne separates ETL.

Mittwald-static-files-app im gleichen App-Slot wie Drupal rejected

Theoretisch hätte ein zusätzlicher /docs-Pfad im Drupal-App-Filesystem gereicht. Praktisch hätte das das Drupal-Rollback-Pattern (Releases-Symlink-Switch) gestört: jedes Drupal-Release hätte den docs/-Stand mitziehen oder explizit ausklammern müssen. Saubere Trennung via eigener App ist robuster.

Atomic-Releases-Pattern wie Drupal (releases/<SHA>/ + Symlink-Switch) rejected

Wäre konsistent mit der DeployTest-Stage gewesen, aber: für statisches HTML überdimensioniert. Mittwald-Static-Files-Apps haben einen fixen Doc-Root (kein nutzer-flippbarer Symlink), und das Risiko inkonsistenter Lese-Zustände während rsync ist bei einer Doku-Seite irrelevant. rsync --delete ist deutlich simpler und genauso wiederherstellbar (nächster Deploy korrigiert).

Consequences