docs: rewrite for box-first model + webhooks + notifications
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# Server deploy changes (terminal + dotfiles + Fedora + Phase 2)
|
||||
# Server deploy changes (box + terminal + dotfiles + webhooks + notifications)
|
||||
|
||||
Everything the production host / compose / `.env` needs for the workspace
|
||||
terminal, personalized dev environment, Nerd Font, and the per-user container.
|
||||
Everything the production host / compose / `.env` needs for the per-user box, the
|
||||
terminal, the personalized dev environment, GitHub webhooks, and notifications.
|
||||
Most items have safe defaults; the **Required** ones are the only must-dos.
|
||||
|
||||
## Required
|
||||
@@ -44,9 +44,10 @@ Most items have safe defaults; the **Required** ones are the only must-dos.
|
||||
restart picks up the new Fedora job image. Make sure the prod registry has the
|
||||
new `spoon-agent-job:latest`.
|
||||
|
||||
4. **Deploy Convex functions** (new tables `userDotfiles`, `userEnvironment`).
|
||||
`SPOON_ENCRYPTION_KEY` (or `INSTANCE_SECRET`) is already required and is what
|
||||
encrypts dotfiles at rest — no change, just confirm it's set.
|
||||
4. **Deploy Convex functions** (new tables `userDotfiles`, `userEnvironment`,
|
||||
`notifications`, `notificationPreferences`). `SPOON_ENCRYPTION_KEY` (or
|
||||
`INSTANCE_SECRET`) is already required and is what encrypts dotfiles at rest —
|
||||
no change, just confirm it's set.
|
||||
|
||||
5. **Confirm `SPOON_AGENT_HOST_WORKDIR`** on the `spoon-agent-worker` service is
|
||||
the absolute host path backing `SPOON_AGENT_WORKDIR` (the fix from the terminal
|
||||
@@ -54,17 +55,36 @@ Most items have safe defaults; the **Required** ones are the only must-dos.
|
||||
and are bind-mounted into the box via the host daemon — this only resolves if
|
||||
the host-workdir translation is correct. (No new var; just verify.)
|
||||
|
||||
6. **Configure the GitHub App webhook.** Set the App's webhook URL to
|
||||
`<CONVEX_SITE_URL>/webhooks/github` and set `GITHUB_APP_WEBHOOK_SECRET` in the
|
||||
**Convex** production env (the signature-verified `httpAction` runs in Convex,
|
||||
not the worker). Without the secret the endpoint fails closed (HTTP 503) and
|
||||
drift only refreshes via the hourly cron. `push` refreshes affected Spoons;
|
||||
`installation` / `installation_repositories` update connection status.
|
||||
|
||||
7. **Notifications email (optional).** In-app notifications work with no config.
|
||||
To also send email, set `USESEND_API_KEY`, `USESEND_URL`, and
|
||||
`USESEND_FROM_EMAIL` in the Convex env. Per-user, per-kind email toggles live
|
||||
in `Settings → Notifications`; unset preferences default to on.
|
||||
|
||||
8. **Claude Code runtime.** The box image pins `@anthropic-ai/claude-code`, so
|
||||
Anthropic provider profiles (API key or `anthropic_oauth_json` credential
|
||||
snapshot) can drive the `claude` runtime with no extra host env. Anthropic
|
||||
API-key auth flows through `ANTHROPIC_API_KEY`; OAuth snapshots are written to
|
||||
`~/.claude/.credentials.json` in the box.
|
||||
|
||||
## Optional (safe defaults — only set to override)
|
||||
|
||||
On the `spoon-agent-worker` service:
|
||||
|
||||
| Var | Default | Purpose |
|
||||
| ------------------------------ | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `SPOON_AGENT_TERMINAL_SECRET` | falls back to `SPOON_AGENT_WORKER_INTERNAL_TOKEN` | HMAC secret for terminal tokens (must match the Next app's, which also falls back). Leave unset to use the shared token. |
|
||||
| `SPOON_AGENT_BOX_IDLE_MS` | `1800000` (30m) | How long a per-user box survives idle before being reaped. |
|
||||
| `SPOON_AGENT_TERMINAL_IDLE_MS` | `1800000` | (Legacy; box idle now governs cleanup.) |
|
||||
| Var | Default | Purpose |
|
||||
| ----------------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `SPOON_AGENT_TERMINAL_SECRET` | falls back to `SPOON_AGENT_WORKER_INTERNAL_TOKEN` | HMAC secret for terminal/box tokens (must match the Next app's, which also falls back). Leave unset to use the shared token. |
|
||||
| `SPOON_AGENT_BOX_IDLE_MS` | `1800000` (30m) | How long a per-user box survives idle before being reaped. |
|
||||
|
||||
No new env is needed for dotfiles, the per-user home, or the Nerd Font.
|
||||
`SPOON_AGENT_TERMINAL_IMAGE` and `SPOON_AGENT_TERMINAL_IDLE_MS` were removed —
|
||||
the box uses `SPOON_AGENT_JOB_IMAGE` and `SPOON_AGENT_BOX_IDLE_MS`.
|
||||
|
||||
## Notes / one-time cleanup
|
||||
|
||||
@@ -84,7 +104,10 @@ No new env is needed for dotfiles, the per-user home, or the Nerd Font.
|
||||
|
||||
```bash
|
||||
docker exec spoon-agent-worker docker --version # CLI present (29.x)
|
||||
docker run --rm git.gbrown.org/gib/spoon-agent-job:latest codex --version # 0.142
|
||||
docker run --rm git.gbrown.org/gib/spoon-agent-job:latest codex --version # 0.142
|
||||
docker run --rm git.gbrown.org/gib/spoon-agent-job:latest claude --version # 2.1.207
|
||||
docker run --rm git.gbrown.org/gib/spoon-agent-job:latest opencode --version
|
||||
docker run --rm git.gbrown.org/gib/spoon-agent-job:latest bash -lc 'eza --version; zoxide --version; oh-my-posh --version'
|
||||
# then: open a thread → Terminal tab; Settings → Dotfiles add a .bashrc alias.
|
||||
# then: /machine → box status + terminal; open a thread → Terminal tab;
|
||||
# Settings → Dotfiles add a .bashrc alias; Settings → Notifications toggles.
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user