netx/docs/ALEMBIC.md
oliver 20c2fcd496 Harden auth with revocable sessions, cookies, and single-login default.
Issue short-lived access JWTs backed by AuthSession rows, HttpOnly cookies with refresh rotation, idle timeout, session management UI, WebCRT ownership caps, and optional Redis login rate limits; new logins revoke other sessions by default.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 14:13:37 +08:00

47 lines
1.8 KiB
Markdown

# Alembic (schema migrations)
Schema evolution uses Alembic. On API startup, netx **automatically** runs
`alembic upgrade head` (same patches as [`netx_api/schema_patches.py`](../netx_api/schema_patches.py)).
You normally do **not** need extra env flags.
## What happens on boot
1. `create_all` — create any missing tables from ORM metadata
2. `alembic upgrade head` — apply revisions (idempotent brownfield patches)
3. Auth column safety-net ensures (before admin bootstrap)
4. Legacy inline ALTER block is **skipped** by default (already covered by Alembic)
## Commands (optional / CI)
```powershell
cd netx
.\.venv\Scripts\alembic.exe upgrade head
.\.venv\Scripts\alembic.exe current
.\.venv\Scripts\alembic.exe history
```
### Brownfield DB that already received old startup DDL
First boot after this change will run `upgrade head`. Patches are idempotent.
If Alembic history was never stamped and you prefer to mark current without re-running:
```powershell
.\.venv\Scripts\alembic.exe stamp head
```
## Env overrides (usually leave defaults)
| Variable | Default | Meaning |
|----------|---------|---------|
| `NETX_ALEMBIC_UPGRADE_ON_START` | `true` | Run `alembic upgrade head` on API start. Set `false` only if a separate migrate job owns upgrades. |
| `NETX_SKIP_LEGACY_STARTUP_DDL` | `true` | Skip the duplicate inline ALTER path. Set `false` only as emergency fallback. |
| `NETX_DATABASE_URL` | — | Same URL Alembic reads via `netx_api.config.settings`. |
## Revisions
| Revision | Purpose |
|----------|---------|
| `20260802_scopes` | `app_user.scopes` / `api_token.scopes` |
| `20260802_legacy` | Shared brownfield patches (alarms, inventory, managed_ne, topology, port traffic, key-alert, …) |
| `20260806_auth_session` | Revocable JWT login sessions (`auth_session`) |
| `20260806_auth_refresh` | Refresh token columns on `auth_session` |