feat(phasefinal-web): corporate site stack on ana-docker

Single static page (nginx) fronted by Traefik at www.phasefinal.com, built
from the design brief. Site markup/CSS checked in verbatim from the design
session; fonts self-hosted (SIL OFL) with the @font-face block uncommented,
which every fresh export re-comments.

Routed via a Traefik file-provider config rather than the container labels:
the docker provider on ana-docker was not registering newly-created
containers, so the file router avoids restarting shared ingress. Labels are
retained in compose so the file can be dropped once that is fixed.
This commit is contained in:
vh
2026-08-29 22:25:20 -07:00
parent c488eadc31
commit 7ffbee6f09
16 changed files with 2196 additions and 624 deletions
+53
View File
@@ -0,0 +1,53 @@
# phasefinal-web
The Phase Final, Inc. corporate site — a single static page served by nginx on
**ana-docker**, fronted by Traefik at `www.phasefinal.com`.
Built from the design brief at `docs/design/` (boothed 2026-08-29); the markup
and CSS came from a Claude Design session and are checked in verbatim under
`conf/site/` apart from the two post-export steps below.
## Two steps every fresh export needs
The design tool ships the site with **no font binaries** and the `@font-face`
block **commented out**, deliberately, to honour the brief's zero-external-
requests rule. Both must be undone on import:
1. Drop the four woff2 files into `conf/site/fonts/`
(Space Grotesk variable, IBM Plex Sans variable, IBM Plex Mono 400 + 600 —
all SIL OFL, self-hosted, no CDN).
2. Uncomment the four `@font-face` rules at the top of `conf/site/style.css`.
Without these the page silently falls back to system fonts and looks wrong
rather than broken, which is the failure mode you won't notice.
## Routing
`conf/traefik-dynamic-phasefinal-web.yml` deploys to
**`/opt/docker/conf/traefik-ana/config/phasefinal-web.yml`** — not into this
stack's own conf dir. It exists because Traefik's docker provider on ana-docker
was not registering newly-created containers on 2026-08-29; the compose file
still carries the correct `traefik.*` labels, so once that is fixed the file
router can be deleted. See the header comment in that file.
## Deploy
```bash
scripts/deploy-stack.sh ana-docker phasefinal-web
ssh infra-ops@10.250.50.70 'cd /opt/docker/compose/phasefinal-web && docker compose up -d'
```
## DNS
`www.phasefinal.com` → A `38.120.12.44` (the Anaheim public IP, forwarded to
ana-docker's Traefik). The apex `phasefinal.com` has **no** record — the site is
www-only by operator decision. Cloudflare-proxied is the intended end state, for
edge caching and the automatic email-address obfuscation the contact block
relies on.
## Content constraints
The copy is governed by hard legal and voice constraints — client naming rules,
the never-"military"/"weapons" phrasing rule, no named individuals. **Read the
design brief before editing any text.** Edits are made surgically in
`conf/site/index.html`; there is no CMS and there will not be one.