codex_a 0cbac68ec1
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m4s
CI / ci (pull_request) Successful in 1m23s
feat: add production deploy pipeline and fix dev CSS
Dev:
- Add tailwind install + build to docker-compose startup so CSS is built
  inside the container — not dependent on local filesystem

Production (docker-compose.prod.yml):
- Gunicorn on 127.0.0.1:8001, bind-mounted static/media to host paths
  so Caddy can serve them directly
- Runs migrate, tailwind build, collectstatic on startup

Settings (production.py):
- Disable SECURE_SSL_REDIRECT (Caddy handles redirects; Django would loop)
- Add CSRF_TRUSTED_ORIGINS for nohypeai.net

CI (.gitea/workflows/ci.yml):
- Add push-to-main trigger
- Add deploy job: SSHes to lintel-prod-01 as deploy, runs deploy/deploy.sh

Server config (deploy/):
- deploy/caddy/nohype.caddy — Caddy site config for nohypeai.net
- deploy/sum-nohype.service — systemd unit for the compose stack
- deploy/deploy.sh — deploy script (pull, build, restart)

One-time manual steps required on lintel-prod-01 (need root):
  sudo cp deploy/sum-nohype.service /etc/systemd/system/
  sudo cp deploy/caddy/nohype.caddy /etc/caddy/sites-enabled/
  sudo systemctl daemon-reload && sudo systemctl enable sum-nohype
  sudo systemctl reload caddy

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-28 21:34:13 +00:00
2026-02-28 18:27:56 +00:00
2026-02-28 11:12:52 +00:00

No Hype AI

Django 5.2 + Wagtail 7 blog engine for No Hype AI.

Environment Variables

Required:

  • SECRET_KEY
  • DATABASE_URL
  • ALLOWED_HOSTS
  • DEBUG
  • WAGTAIL_SITE_NAME

Also used:

  • WAGTAILADMIN_BASE_URL
  • CONSENT_POLICY_VERSION
  • EMAIL_BACKEND
  • EMAIL_HOST
  • EMAIL_PORT
  • EMAIL_USE_TLS
  • EMAIL_HOST_USER
  • EMAIL_HOST_PASSWORD
  • DEFAULT_FROM_EMAIL
  • NEWSLETTER_PROVIDER

Containerized Development

docker compose build
docker compose run --rm web python manage.py migrate
docker compose up

App is exposed on http://localhost:8035.

Test/Lint/Typecheck (Docker)

docker compose run --rm web pytest
docker compose run --rm web ruff check .
docker compose run --rm web mypy apps config

Deploy Runbook

git pull origin main
pip install -r requirements/production.txt
python manage.py migrate --run-syncdb
python manage.py collectstatic --noinput
python manage.py tailwind build
python manage.py check_content_integrity
sudo systemctl reload gunicorn

Backups

  • PostgreSQL dump daily: pg_dump | gzip > backup-$(date +%Y%m%d).sql.gz
  • MEDIA_ROOT rsynced offsite daily
  • Restore DB: gunzip -c backup-YYYYMMDD.sql.gz | psql "$DATABASE_URL"
  • Restore media: rsync -avz <backup-host>:/path/to/media/ /srv/nohypeai/media/

Runtime Notes

  • Keep Caddy serving /static/ and /media/ directly in production.
  • Keep Gunicorn behind Caddy and run from a systemd service/socket pair.
  • Use python manage.py purge_old_comment_data --months 24 in cron for comment-data retention.
Description
No description provided
Readme 1.1 MiB
Languages
Python 63.5%
HTML 33.1%
JavaScript 1.4%
Makefile 0.9%
Shell 0.5%
Other 0.6%