Database
The panel stores its state in a single SQLite-format file at PANEL_DB_PATH
(default /data/panel.db) via EF Core.
SQLite / libSQL / Turso-compatible
Turso and libSQL are SQLite-compatible forks, so the database is just a SQLite-format file on disk. The panel uses EF Core’s SQLite provider against it — a self-contained, file-based store with no external database server. Inspect it with whichever CLI you prefer:
sqlite3 /data/panel.db # or the libsql / turso shells, e.g. `turso db shell /data/panel.db`
(There’s no EF Core 10 provider for the newer Turso/Limbo engine or for libSQL today, so the SQLite provider on the compatible file is the robust choice.)
Tables
ASP.NET Core Identity owns the AspNet* tables (users, roles, claims, …). The app adds:
| Table | Entity | Holds |
|---|---|---|
AspNetUsers (+ IsDeveloper, IsActive, CreatedAt) |
ApplicationUser |
Accounts. IsDeveloper is the additive Developer capability. |
ServerSettings (single row, Id=1) |
ServerSettings |
Configured, AutoStart, LaunchParams, Ruleset. |
AuditLog |
AuditEntry |
Every privileged action (actor, role, action, target, detail, success, ts). |
Crashes |
CrashReport |
Unexpected game exits (timestamps, exit code, fault addr/instr/module, launch params, console tail + CRASHLOG). |
FileEdits |
FileEdit |
Every panel file change with the pre-change snapshot for revert. |
How schema is created & migrated
There are no EF migration files; schema is applied at startup by
Bootstrap.cs:
EnsureCreatedAsync()creates the schema on a fresh database.- Because
EnsureCreatedwon’t alter a pre-existing database volume, Bootstrap also runs defensiveCREATE TABLE IF NOT EXISTS/ALTER TABLE … ADD COLUMNstatements (ignoring “already exists”) for tables/columns added over time (Crashes,FileEdits,IsDeveloper,Ruleset). This lets an existing/data/panel.dbpick up new features without manual steps. - The single
ServerSettingsrow and the initial root user are seeded (root only if none exists, fromROOT_USERNAME/ROOT_PASSWORD).
Backups
Back up the whole /data volume (database + Data-Protection keys + TLS material). A hot copy
of panel.db is usually fine for this low-write workload; for a guaranteed-consistent copy use
sqlite3 /data/panel.db ".backup /data/panel-backup.db".