43 lines
2.2 KiB
Markdown
43 lines
2.2 KiB
Markdown
# Deployment Guide
|
|
|
|
## Production Requirements
|
|
|
|
Use a supported Python version, Gunicorn, TLS termination, and a reverse proxy or managed platform. Never use `flask run` in production. Flask's official guidance recommends a dedicated WSGI server and commonly a reverse proxy: [Flask deployment documentation](https://flask.palletsprojects.com/en/stable/deploying/).
|
|
|
|
Set environment variables outside the repository:
|
|
|
|
```bash
|
|
STEADY_ENV=production
|
|
SECRET_KEY=<long-random-secret>
|
|
DATABASE_URL=sqlite:////srv/steady/instance/steady.db
|
|
TRUSTED_HOSTS=steady.example.com
|
|
FEATURE_ADMIN=false
|
|
```
|
|
|
|
Generate a secret with `python -c "import secrets; print(secrets.token_urlsafe(48))"`. Restrict the instance directory and environment to the service account. SQLite is suitable for a single-host deployment; use platform-managed storage and a database designed for concurrency before horizontal scaling.
|
|
|
|
## Release Procedure
|
|
|
|
```bash
|
|
python -m venv .venv
|
|
source .venv/bin/activate
|
|
python -m pip install -r requirements.txt
|
|
flask --app app db upgrade
|
|
python -m pytest
|
|
gunicorn --config gunicorn.conf.py wsgi:app
|
|
```
|
|
|
|
Gunicorn binds to `127.0.0.1:8000` by default. Put TLS and request buffering in a trusted reverse proxy; do not expose the internal bind when the proxy is intended to be mandatory. Configure forwarded headers only for known proxy addresses rather than applying `ProxyFix` generically.
|
|
|
|
## Operations
|
|
|
|
- Probe `/health` for process availability; it intentionally does not test every dependency.
|
|
- Back up the SQLite database using a consistent database-aware snapshot. Per-user JSON exports are portability backups, not a replacement for server backups.
|
|
- Back up before migrations and test restore procedures regularly.
|
|
- Rotate `SECRET_KEY` only with a plan to invalidate existing sessions.
|
|
- Review logs without recording passwords, secrets, backup contents, or task descriptions.
|
|
- Confirm HTTPS responses include HSTS and all responses include the configured security headers.
|
|
- Keep `FEATURE_ADMIN=false` unless the guarded placeholder is explicitly required.
|
|
|
|
Rollback should restore both the prior application release and its compatible database backup. Do not run destructive schema downgrades without reviewing the generated migration and recovery plan.
|
|
|