Skip to content

M21.1: prepare the in-place release (apex routing, pinned site image, landing baseline) - #177

Merged
n8bar merged 8 commits into
mainfrom
claude/m21-1-prepare-release
Sep 6, 2026
Merged

n8bar merged 8 commits into
mainfrom
claude/m21-1-prepare-release

Conversation

@n8bar

@n8bar n8bar commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Summary

Phase 1 code for the in-place beta transition (M21.1):

  • Apex routing (§1.2): compose.alpha.yaml selects the nginx template set via CZ_NGINX_TEMPLATES (templates-alpha default, templates-transition, templates-apex). Transition serves the public apex (Laravel at / and the policy URLs; the site container behind /learn/, /staging/, robots.txt, sitemap.xml, and the IndexNow key file; www/http collapse to the apex in one hop) alongside the unchanged noindexed alpha block. Apex-only is the same public shape plus default_server blocks that drop alpha and every other hostname, cached DNS included.
  • Pinned site image (§1.3): CZ_SITE_TAG is required with no latest fallback; scripts/publish-site.sh <sha> rolls the site container, prints the previous tag as the rollback target, and proves the running image. DeploymentOverlayTest guards the pin, the selector, and the routing each template must carry.
  • Landing page baseline (§1.4, §1.7): title/description/canonical/OpenGraph/Twitter/SoftwareApplication JSON-LD derived from app.public_url, og-preview.* in public/, the legal footer, and a Guides button (GUIDES_URL, default the apex guides). LandingPageTest covers it.
  • Strategy checkoffs for §1.2–§1.7 and §3.6 ride along; §1.3.1–2 and §3.5 wait on the box.

Content-repo counterpart: n8bar/cryptozing-site#1.

Verification

  • nginx -t passes for all three template sets (nginx:1.27-alpine, envsubst path, throwaway certs).
  • Local routing smoke against a stub site container: public paths split correctly between app and site for both new sets; alpha keeps X-Robots-Tag: noindex, nofollow in transition; alpha, raw-IP, and unknown hosts are dropped (444) in apex-only.
  • docker compose config resolves the selector and fails loudly without CZ_SITE_TAG.
  • Full suite: 615 passed after the landing commit; the overlay test adds 6 (final run noted in the PR thread).

🤖 Generated with Claude Code

https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd

n8bar and others added 8 commits September 5, 2026 21:54
compose.alpha.yaml selects the nginx template set by CZ_NGINX_TEMPLATES
(templates-alpha default, templates-transition, templates-apex) and pins
the site container to CZ_SITE_TAG with no latest fallback.

templates-transition serves the public apex (Laravel at /, the site
container behind /learn/, /staging/, robots, sitemap, and the IndexNow
key file; www and http collapse to the apex) alongside the unchanged
noindexed alpha block. templates-apex is the same public shape with
default_server blocks that drop every other hostname, alpha included.

scripts/publish-site.sh rolls the site container onto a tag, prints the
previous one as the rollback target, and proves the running image.
DeploymentOverlayTest guards the pin, the selector, and the routing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
…, §2.6)

ANALYTICS_SCRIPT_URL + ANALYTICS_WEBSITE_ID load a deferred script on the
public landing page; either blank means no tracking, so generic installs
ship none. No other view references the config, and the tests hold the
policy pages, login, and the signed-in dashboard outside it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
umami 3.3.1 and its own Postgres 16 volume join compose.alpha.yaml with
required secrets and no published ports; every nginx template set serves
stats.${CZ_PUBLIC_SERVER_NAME} on the apex certificate, noindexed, proxied
to umami:3000. DeploymentOverlayTest covers the secrets, the volume, and
the stats block in each set.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bBptf9B3BtyeQaTWMrosd
@n8bar
n8bar merged commit b715b7e into main Sep 6, 2026
1 check passed
@n8bar
n8bar deleted the claude/m21-1-prepare-release branch September 6, 2026 06:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant