docs: sync Infisical secret paths to the two-level tree
Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
54a561854c
commit
40b512dd96
@@ -24,7 +24,7 @@ Two services on one LXC, sharing one Claude Max OAuth subscription:
|
|||||||
- **Meridian**: Node 22 from NodeSource apt + `npm i -g @rynfar/meridian`. systemd unit `meridian.service` as user `meridian`, bound to `0.0.0.0:3456`, `HOME=/opt/meridian`.
|
- **Meridian**: Node 22 from NodeSource apt + `npm i -g @rynfar/meridian`. systemd unit `meridian.service` as user `meridian`, bound to `0.0.0.0:3456`, `HOME=/opt/meridian`.
|
||||||
- **LiteLLM**: Python venv at `/opt/litellm/venv` + `pip install 'litellm[proxy]'`. systemd unit `litellm.service` as user `litellm`, bound to `0.0.0.0:4000`. `Requires=meridian.service` so it can't outlive the backend.
|
- **LiteLLM**: Python venv at `/opt/litellm/venv` + `pip install 'litellm[proxy]'`. systemd unit `litellm.service` as user `litellm`, bound to `0.0.0.0:4000`. `Requires=meridian.service` so it can't outlive the backend.
|
||||||
- **OAuth credentials** at `/opt/meridian/.claude/` (mode 0700, owned by `meridian`).
|
- **OAuth credentials** at `/opt/meridian/.claude/` (mode 0700, owned by `meridian`).
|
||||||
- **LITELLM_MASTER_KEY** at `/opt/litellm/litellm.env` (mode 0600, owned by `litellm`). Source of truth in Infisical `/meridian/vault_litellm_master_key`. Pulled by `deploy.sh` on the controller and exported for the playbook to consume.
|
- **LITELLM_MASTER_KEY** at `/opt/litellm/litellm.env` (mode 0600, owned by `litellm`). Source of truth in Infisical `/apps/meridian/vault_litellm_master_key`. Pulled by `deploy.sh` on the controller and exported for the playbook to consume.
|
||||||
- **No Caddy, no Cloudflare.** Both ports exposed via the same UDM alias `meridian.lan.balders.ca → .164`.
|
- **No Caddy, no Cloudflare.** Both ports exposed via the same UDM alias `meridian.lan.balders.ca → .164`.
|
||||||
|
|
||||||
## Bootstrap
|
## Bootstrap
|
||||||
@@ -69,7 +69,7 @@ Two services on one LXC, sharing one Claude Max OAuth subscription:
|
|||||||
```
|
```
|
||||||
6. Smoke via LiteLLM (OpenAI format, master-key auth):
|
6. Smoke via LiteLLM (OpenAI format, master-key auth):
|
||||||
```bash
|
```bash
|
||||||
KEY=$(infisical secrets get vault_litellm_master_key --env prod --path /meridian --plain)
|
KEY=$(infisical secrets get vault_litellm_master_key --env prod --path /apps/meridian --plain)
|
||||||
curl http://192.168.1.164:4000/v1/chat/completions \
|
curl http://192.168.1.164:4000/v1/chat/completions \
|
||||||
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
|
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
|
||||||
-d '{"model":"claude-haiku-4-5","max_tokens":40,"messages":[{"role":"user","content":"reply with the single word: pong"}]}'
|
-d '{"model":"claude-haiku-4-5","max_tokens":40,"messages":[{"role":"user","content":"reply with the single word: pong"}]}'
|
||||||
@@ -79,7 +79,7 @@ Two services on one LXC, sharing one Claude Max OAuth subscription:
|
|||||||
|
|
||||||
Pulled from Infisical at deploy time (`infisical.vault.read_secrets` in `site.yml`):
|
Pulled from Infisical at deploy time (`infisical.vault.read_secrets` in `site.yml`):
|
||||||
|
|
||||||
**`/meridian/`**
|
**`/apps/meridian/`**
|
||||||
- `vault_litellm_master_key` — LiteLLM proxy master key (required; sanity-checked in `site.yml`)
|
- `vault_litellm_master_key` — LiteLLM proxy master key (required; sanity-checked in `site.yml`)
|
||||||
- `vault_openai_api_key` — OpenAI key for LiteLLM `direct_*` models (optional, `default('')`)
|
- `vault_openai_api_key` — OpenAI key for LiteLLM `direct_*` models (optional, `default('')`)
|
||||||
- `vault_gemini_api_key` — Gemini key for LiteLLM `direct_*` models (optional, `default('')`)
|
- `vault_gemini_api_key` — Gemini key for LiteLLM `direct_*` models (optional, `default('')`)
|
||||||
@@ -97,8 +97,8 @@ Available model aliases (same on both endpoints, all backed by Claude Max): `cla
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# vault_pulse_admin_token (possibly stale — verify before removing; not read by the playbook, manual recipe only)
|
# vault_pulse_admin_token (possibly stale — verify before removing; not read by the playbook, manual recipe only)
|
||||||
PULSE_ADMIN_TOKEN=$(infisical secrets get vault_pulse_admin_token --env prod --path /pulse --plain)
|
PULSE_ADMIN_TOKEN=$(infisical secrets get vault_pulse_admin_token --env prod --path /automation/pulse --plain)
|
||||||
LITELLM_KEY=$(infisical secrets get vault_litellm_master_key --env prod --path /meridian --plain)
|
LITELLM_KEY=$(infisical secrets get vault_litellm_master_key --env prod --path /apps/meridian --plain)
|
||||||
curl -X POST https://pulse.balders.ca/api/settings/ai/update \
|
curl -X POST https://pulse.balders.ca/api/settings/ai/update \
|
||||||
-H "X-API-Token: $PULSE_ADMIN_TOKEN" -H 'Content-Type: application/json' \
|
-H "X-API-Token: $PULSE_ADMIN_TOKEN" -H 'Content-Type: application/json' \
|
||||||
-d "{\"provider\":\"openai\",\"openai_api_key\":\"$LITELLM_KEY\",\"openai_base_url\":\"http://meridian.lan.balders.ca:4000/v1\",\"model\":\"claude-haiku-4-5\",\"enabled\":true}"
|
-d "{\"provider\":\"openai\",\"openai_api_key\":\"$LITELLM_KEY\",\"openai_base_url\":\"http://meridian.lan.balders.ca:4000/v1\",\"model\":\"claude-haiku-4-5\",\"enabled\":true}"
|
||||||
@@ -112,7 +112,7 @@ curl -X POST https://pulse.balders.ca/api/ai/test -H "X-API-Token: $PULSE_ADMIN_
|
|||||||
- **Subsequent deploys**: via Semaphore template "Meridian Deploy" (scheduled Sun 02:55 EDT). `LITELLM_MASTER_KEY` is auto-reconciled into Semaphore environment 4 by `homelab-ansible-lxc-semaphore/scripts/sync-semaphore-state.py` (merge-only `ENVIRONMENT_KEYS` step).
|
- **Subsequent deploys**: via Semaphore template "Meridian Deploy" (scheduled Sun 02:55 EDT). `LITELLM_MASTER_KEY` is auto-reconciled into Semaphore environment 4 by `homelab-ansible-lxc-semaphore/scripts/sync-semaphore-state.py` (merge-only `ENVIRONMENT_KEYS` step).
|
||||||
- **Token refresh**: handled automatically by the Claude Code SDK. Manual fallback: `sudo -u meridian /usr/bin/meridian refresh-token`.
|
- **Token refresh**: handled automatically by the Claude Code SDK. Manual fallback: `sudo -u meridian /usr/bin/meridian refresh-token`.
|
||||||
- **Restart after creds change**: `sudo systemctl restart meridian` (LiteLLM follows automatically via `Requires=`).
|
- **Restart after creds change**: `sudo systemctl restart meridian` (LiteLLM follows automatically via `Requires=`).
|
||||||
- **Rotate master key**: update `/meridian/vault_litellm_master_key` in Infisical, redeploy, update consumers (Pulse, paperless-ai, etc.).
|
- **Rotate master key**: update `/apps/meridian/vault_litellm_master_key` in Infisical, redeploy, update consumers (Pulse, paperless-ai, etc.).
|
||||||
- **Logs**: `journalctl -u meridian -f` / `journalctl -u litellm -f`.
|
- **Logs**: `journalctl -u meridian -f` / `journalctl -u litellm -f`.
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|||||||
Reference in New Issue
Block a user