Django REST backend powering the LTSER Alishan site. Runs with PostgreSQL, Redis, Celery, and serves API + admin features.
- Framework: Django 4.2 + DRF + Simple JWT
- Services: PostgreSQL, Redis, Celery worker/beat, Nginx (proxy + static/media)
- Frontend: https://ltsertw-alishan.org/
- Docker + Docker Compose
- (Optional for local venv) Python 3.11+, PostgreSQL 16+, Redis 7+
-
Create
.envin the repo root:# Django SECRET_KEY=change-me DEBUG=1 ALLOWED_HOSTS=localhost,127.0.0.1 # Database DB_HOST=db DB_NAME=ltser DB_USER=ltser DB_PASSWORD=ltser-password # Redis / Celery REDIS_HOST=redis REDIS_PORT=6379 # CORS / CSRF CORS_ALLOWED_ORIGINS=http://localhost:5173 CSRF_TRUSTED_ORIGINS=http://localhost:8000 # Domains BACKEND_DOMAIN=http://localhost:8000 FRONTEND_DOMAIN=http://localhost:5173 # Auth / Google GOOGLE_CLIENT_ID=your-google-client-id # Email (SMTP) EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend EMAIL_HOST=smtp.gmail.com EMAIL_PORT=587 EMAIL_USE_TLS=true EMAIL_HOST_USER=your-email@example.com EMAIL_HOST_PASSWORD=your-email-password DEFAULT_FROM_EMAIL=your-email@example.com # SEGIS data SEGIS_API_ID=your-segis-id SEGIS_API_KEY=your-segis-key
-
Start services (web, db, redis, celery, adminer):
docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build
- Migrations run automatically before the server starts.
- Dev API: http://localhost:8000
- Adminer (DB UI): http://localhost:8080 (server:
db, user/pass from.env)
-
Create a superuser (once containers are up):
docker compose run --rm web python manage.py createsuperuser
docker compose logs -f web— follow Django logsdocker compose run --rm web python manage.py migrate— run migrations manuallydocker compose run --rm web python manage.py collectstatic— collect static files (for prod images)docker compose run --rm celery celery -A core inspect active— inspect Celerydocker compose down -v— stop and remove containers + volumes (local data reset)
app/core/— Django settings, URLs, WSGI/ASGI, Celery configapp/api/— API endpoints and pagination helpersapp/account/— authentication, JWT, Google login, user APIsapp/dashboard/— dashboard/management endpoints (downloads, forms, etc.)app/media/&app/static/— uploaded files and collected static assetsdocker-compose*.yml— service definitions for dev/prodnginx/django.conf— Nginx reverse proxy + static/media pathsrequirements.txt— Python dependencies
- Prepare
.envwith production values (setDEBUG=0, proper secrets, allowed hosts, TLS-ready domains). - Build and start:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
- Gunicorn serves Django; Nginx handles TLS/HTTP and static/media.
- Issue/renew TLS certs using the bundled Certbot service (mounted at
/var/www/certbotand/etc/letsencrypt); updatenginx/django.confserver names if domains change.
- Static/media are persisted via named Docker volumes (
static_volume,media_volume). - JWT auth uses access/refresh tokens; set
GOOGLE_CLIENT_IDif Google login is needed. - CORS/CSRF origins must match your frontend domains to allow browser calls.