uv run python manage.py test passes locally (10/10)
DJANGO_ENV=beta and DJANGO_ENV=prod load with correct logging levels
scripts/validate-env.sh rejects missing production variables
docker compose up --build starts app + Postgres locally
Containerized unit tests pass in CI Docker job
Server .env created from .env.prod.example before first production deploy
CI workflow runs on this PR (tests only, no deploy)
## Summary
- Containerize the Django app with Docker and docker-compose (dev + production)
- Refactor settings into `dev` / `beta` / `prod` environments driven by environment variables
- Connect to PostgreSQL via `DATABASE_URL` or `DB_*` vars
- Migrate package management from pip to uv (`pyproject.toml`, `uv.lock`)
- Split Gitea workflows: PRs run unit tests only; pushes to `master` run tests, Docker validation, and deploy
- Update deploy script to rsync code, preserve server `.env`, validate config, and run Docker compose
Closes #4
## Test plan
- [x] `uv run python manage.py test` passes locally (10/10)
- [x] `DJANGO_ENV=beta` and `DJANGO_ENV=prod` load with correct logging levels
- [x] `scripts/validate-env.sh` rejects missing production variables
- [ ] `docker compose up --build` starts app + Postgres locally
- [ ] Containerized unit tests pass in CI Docker job
- [ ] Server `.env` created from `.env.prod.example` before first production deploy
- [ ] CI workflow runs on this PR (tests only, no deploy)
Replace hardcoded settings with environment-driven config, add Docker
compose for local and production deploys, migrate from pip to uv, and
split Gitea workflows so PRs run tests only while master pushes deploy.
WhiteNoise's manifest storage strictly resolves every referenced file
during collectstatic, including sourceMappingURL comments in vendored
JS bundles. A missing .map (financial/js/.../dashboard-free.js.map)
broke the prod container at startup. Add TolerantManifestStaticFilesStorage
which leaves unresolved references untouched instead of raising.
Co-authored-by: Cursor <cursoragent@cursor.com>
The production .env stores DJANGO_ALLOWED_HOSTS as a JSON array (legacy
format), but env_list only split on commas, yielding broken entries like
'["aimloperations.com"' and causing DisallowedHost (HTTP 400) for every
request. Parse JSON arrays as well as comma-separated values.
Co-authored-by: Cursor <cursoragent@cursor.com>
Templates reference public/img/logo.png (favicon, brand logo, social
share images) which isn't present in the repo. With the strict manifest
storage this raised ValueError at request time -> HTTP 500. Override
stored_name (and set manifest_strict=False) to fall back to the plain
name so a missing static degrades to a broken asset instead of a 500,
matching the previous non-manifest behaviour.
Co-authored-by: Cursor <cursoragent@cursor.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
dev/beta/prodenvironments driven by environment variablesDATABASE_URLorDB_*varspyproject.toml,uv.lock)masterrun tests, Docker validation, and deploy.env, validate config, and run Docker composeCloses #4
Test plan
uv run python manage.py testpasses locally (10/10)DJANGO_ENV=betaandDJANGO_ENV=prodload with correct logging levelsscripts/validate-env.shrejects missing production variablesdocker compose up --buildstarts app + Postgres locally.envcreated from.env.prod.examplebefore first production deployb5275f1b7etofaca7b1084faca7b1084to115c5ae319