Files
com.gregkilmer.www/vault-kit/24.01_PersonalWebsite/GregKilmer.com stack.md
T
Claude 754c6482be Phase 7: Cosmos deployment
- Dockerfile with a check target (typecheck and tests) and one image per
  service on a pinned Node 22.20 Alpine base, each with only its own
  production dependencies and a health check.
- deploy/compose.yaml: gk-content, gk-admin and gk-site on homelab_network
  with no host ports, read-only root filesystems, no capabilities, the vault's
  Site folder mounted into the content service, and backup.dump=sqlite on it.
- deploy/deploy.sh builds and checks the commit, restarts the stack, and goes
  back to the last good tag if it doesn't come up healthy; rollback.sh swaps
  tags. .gitea/workflows/deploy.yml runs it on a host runner on Cosmos.
- docs/deploy.md runbook (settings, runner, mirror, NPM hosts, Turnstile,
  Healthchecks, backups, cutover) and the stack's inventory note in vault-kit.
- Site: trusts X-Forwarded-Host/Proto for gregkilmer.com hosts so form posts
  pass Astro's origin check behind the proxy; rate limits read
  CF-Connecting-IP; site URL set for absolute links.
- Content service: the held-change webhook carries a Discord-ready message;
  .env.example lists the core settings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aSbo2D1qP8cMFQCykf7kx
2026-10-12 00:43:03 +00:00

37 lines
1.7 KiB
Markdown

---
tags: [homelab, service]
---
# GregKilmer.com stack
The new GregKilmer.com: a content service that reads this folder's `Site/` notes, a tailnet-only admin page, and the public site. Repo: `github.com/Patiun/com.gregkilmer.www` (mirrored to Gitea, deployed by Gitea Actions). Runbook: `docs/deploy.md` in the repo.
## Containers
| Container | Role | Network | Host port |
| --- | --- | --- | --- |
| `gk-content` | Content service, sync jobs and MCP server | homelab_network | none |
| `gk-admin` | Admin page | homelab_network | none |
| `gk-site` | Public site | homelab_network | none |
- Compose: `/home/greg/homelab/gregkilmer/compose.yaml` (copied from the repo's `deploy/compose.yaml` on each deploy)
- Settings and secrets: `/home/greg/homelab/gregkilmer/{.env,content.env,admin.env,site.env}` (600)
## Data and backups
- `/home/greg/homelab/gregkilmer/data/content/content.db`: note history, review queue, saved inquiries and orders, sync cache. Label `backup.dump=sqlite` on `gk-content`.
- `/home/greg/homelab/gregkilmer/data/content/submissions/`: form attachments, covered by Kopia.
- The vault's `Site/` folder is mounted read-write into `gk-content`, which writes accepted API and MCP changes back as notes.
## Access
- `admin.gregkilmer.com` to `gk-admin:4320`: Tailnet only.
- `content.gregkilmer.com` to `gk-content:4310` (API and `/mcp`): Tailnet only.
- `beta.gregkilmer.com` to `gk-site:4321`: Tailnet only until cutover. After cutover, `gregkilmer.com` is public through Cloudflare.
## Health
- Healthchecks: the content service's full scan every 5 minutes, plus one check per sync job.
- A Discord webhook is sent whenever a change is held for review.
- Each container has a Docker health check on `/health` (site: `/`).