Replace the Schulcloud token without a restart
A token lasts 30 days and only a browser login yields one — the account is federated, so the server cannot mint it. Replacing it meant editing .env and recreating the container, every month. `schulcloud token set` (a hidden prompt, or piped input) and a /token page both send it to PUT /api/token. The server checks it with Schulcloud first — well-formed, unexpired, still logged in, the same account — then swaps it into the config every request reads, restarts the keepalive and saves it in STATE_DIR, a new volume, with mode 0600. At startup the newer of the saved token and TSC_JWT_COOKIE wins, unless they belong to different accounts. A refused paste changes nothing, and the token is never logged. The keepalive's pings carry a generation, so a 401 for the old token that arrives after a swap cannot stop the new cycle. `schulcloud token`, whoami and the log report the expiry and warn a week ahead. Found on the way: a host that is off for more than two hours loses the session however long the token has left — this machine lost it overnight — which is what the always-on Pi is for. 174 tests. Smoke 72/72 on the local instance, and a real swap verified end to end there. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,13 +19,17 @@ moves the published port when 8080 is taken, and `CRAWL_INTERVAL_MS` restores a
|
||||
crawl timer — worth doing against a real account, because `what_changed` can
|
||||
only report what happened between crawls.
|
||||
|
||||
After pasting a new `TSC_JWT_COOKIE` into `.env`, **recreate** the container —
|
||||
A fresh Schulcloud token goes in with `schulcloud token set`, or on the page at
|
||||
`http://127.0.0.1:8080/token` — no restart; see docs/CLI.md. Editing
|
||||
`TSC_JWT_COOKIE` in `.env` instead needs the container **recreated**, because
|
||||
`env_file` is read when the container is created, not on restart:
|
||||
|
||||
```bash
|
||||
docker compose up -d --force-recreate schulcloud-mcp
|
||||
``` On the Pi neither port is published — Caddy
|
||||
reaches the container over the Docker network.
|
||||
```
|
||||
|
||||
On the Pi neither port is published — Caddy reaches the container over the
|
||||
Docker network.
|
||||
|
||||
Loopback binding is deliberate. The bearer token is the only thing in front of
|
||||
your account's data, so it should not be listening on your LAN while you test.
|
||||
@@ -103,9 +107,9 @@ node dist/bin/cli.js sync
|
||||
## Run the test suites
|
||||
|
||||
```bash
|
||||
npm test # 135 offline tests
|
||||
npm test # 174 offline tests
|
||||
npm run smoke # end-to-end against the live instance, live-only mode
|
||||
DATABASE_URL=… npm run smoke # end-to-end with the index (69 checks)
|
||||
DATABASE_URL=… npm run smoke # end-to-end with the index (74 checks)
|
||||
```
|
||||
|
||||
Store tests need a database and skip without one:
|
||||
|
||||
Reference in New Issue
Block a user