47 lines
1.4 KiB
Markdown
47 lines
1.4 KiB
Markdown
# l4d2-web-app
|
|
|
|
Flask web app for managing L4D2 servers through user-private blueprints.
|
|
|
|
## Key v1 behaviors
|
|
|
|
- Local username/password login; no public signup
|
|
- Admin-managed overlay catalog
|
|
- Private blueprints per user
|
|
- Server creation from blueprints (live-linked; no per-server blueprint overrides)
|
|
- Async job model with persisted command logs in `job_logs`
|
|
- Desired vs actual state model
|
|
- Live logs for jobs and servers via SSE endpoints
|
|
- Host operations go through `l4d2ctl` via a local host command runner, not direct `l4d2host` imports
|
|
|
|
## Frontend constraints
|
|
|
|
- Server-rendered templates (Jinja)
|
|
- Vendored HTMX (`static/vendor/htmx.min.js`)
|
|
- Custom CSS only
|
|
- Tokenized, consistent link and accent colors
|
|
|
|
## Development
|
|
|
|
```bash
|
|
python3 -m venv .venv
|
|
.venv/bin/pip install -e .
|
|
.venv/bin/pytest tests -q
|
|
```
|
|
|
|
## Configuration
|
|
|
|
The web app reads these settings from the environment:
|
|
|
|
- `DATABASE_URL`: SQLAlchemy database URL, for example `sqlite:////var/lib/left4me/left4me.db`.
|
|
- `SECRET_KEY`: Flask secret key used for sessions and CSRF-sensitive state.
|
|
- `JOB_WORKER_THREADS`: number of background job worker threads.
|
|
|
|
In the systemd deployment, environment is loaded from `/etc/left4me/host.env` and `/etc/left4me/web.env`.
|
|
|
|
## Admin Bootstrap
|
|
|
|
Create the first admin account with the Flask CLI. Provide the password through `LEFT4ME_ADMIN_PASSWORD`:
|
|
|
|
```bash
|
|
LEFT4ME_ADMIN_PASSWORD='change-me' flask create-user <username> --admin
|
|
```
|