Django 5.2 with dev/test/prod settings, SQLite tuned for Litestream (WAL, IMMEDIATE transactions), ULID primary keys via a shared base model, and a custom User model ahead of the first migration. Minimal accessible base template with dark mode via color-scheme and an optional theme picker. /healthz answers before host validation so Fly checks pass. Dockerfile (dev and prod targets), compose for local dev, fly.toml with placeholder app/region, Litestream backups to B2, and a Forgejo Actions workflow. Migrations run in bin/start because Fly release machines don't mount volumes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.1 KiB
Markdown
42 lines
1.1 KiB
Markdown
# Intent
|
|
|
|
Track the why behind features, across implementations. See [docs/concept.md](docs/concept.md) and [docs/plan.md](docs/plan.md).
|
|
|
|
## Local development
|
|
|
|
With uv:
|
|
|
|
```sh
|
|
uv sync
|
|
uv run python manage.py migrate
|
|
uv run python manage.py runserver
|
|
```
|
|
|
|
Or with Docker:
|
|
|
|
```sh
|
|
docker compose up --build
|
|
```
|
|
|
|
Then open http://localhost:8000. Data lives in `data/` (uv) or the `data` volume (Docker).
|
|
|
|
Checks:
|
|
|
|
```sh
|
|
uv run ruff check . && uv run ruff format --check . && uv run pytest
|
|
```
|
|
|
|
## Production
|
|
|
|
Fly.io, one machine with a volume at `/data`. `bin/start` restores the database from B2 if the volume is empty, runs migrations, and starts gunicorn under Litestream.
|
|
|
|
Secrets (`fly secrets set`):
|
|
|
|
| Name | Purpose |
|
|
|---|---|
|
|
| `DJANGO_SECRET_KEY` | Django secret key |
|
|
| `LITESTREAM_BUCKET`, `LITESTREAM_ENDPOINT`, `LITESTREAM_ACCESS_KEY_ID`, `LITESTREAM_SECRET_ACCESS_KEY` | B2 backup bucket |
|
|
| `BUCKET_NAME`, `AWS_*` | Tigris uploads; set by `fly storage create` |
|
|
| `SENTRY_DSN` | Optional error reporting |
|
|
|
|
Restore drill: create a fresh volume, deploy, and confirm `bin/start` logs a restore before migrating.
|