Skip to content

Docker

Local development environment via Docker Compose with hot reload for all services.

Services

docker-compose.yml defines the full development stack:

Service Image Port Purpose
db postgres:16-alpine 5432 PostgreSQL database
redis redis:7-alpine 6379 Celery broker + cache
web Custom build 8000 Django API server
worker Custom build — Celery worker
beat Custom build — Celery beat scheduler
frontend Custom build 5173 Admin dashboard (Vite dev)
portal Custom build 5174 Borrower portal (Vite dev)
docs Custom build 8001 MkDocs dev server

Quick Start

# Start all services
docker compose up -d

# Start specific services
docker compose up -d db redis web

# View logs
docker compose logs -f web

# Stop all services
docker compose down

Database Configuration

db:
  image: postgres:16-alpine
  environment:
    POSTGRES_DB: lms
    POSTGRES_USER: lms
    POSTGRES_PASSWORD: lms
  ports:
    - "5432:5432"
  volumes:
    - postgres_data:/var/lib/postgresql/data

Data persists across container restarts via the postgres_data named volume.

Web Service

uv run gunicorn config.asgi:application \
  -k uvicorn.workers.UvicornWorker \
  --bind 0.0.0.0:8000 \
  --reload
  • --reload enables hot reload for Python code changes
  • Source code is volume-mounted for live editing
  • Connects to db and redis services via Docker networking

Health Check

healthcheck:
  test: curl -f http://localhost:8000/api/v1/health || exit 1
  interval: 30s
  timeout: 5s
  start_period: 10s
  retries: 3

Port Mapping

Port Service URL
5432 PostgreSQL postgres://lms:lms@localhost:5432/lms
6379 Redis redis://localhost:6379
8000 Django API http://localhost:8000/api/v1/
5173 Admin dashboard http://localhost:5173/
5174 Borrower portal http://localhost:5174/
8001 Documentation http://localhost:8001/

Volume Mounts

Source code directories are mounted into containers for hot reload:

  • ./backend → /app/backend (web, worker, beat)
  • ./frontend/admin → /app/frontend/admin (frontend)
  • ./frontend/borrower → /app/frontend/borrower (portal)
  • ./docs → /app/docs (docs)

Environment Variables

All services read from a .env file in the project root. Copy the example:

cp .env.example .env

Key variables for Docker:

DATABASE_URL=postgres://lms:lms@db:5432/lms
CELERY_BROKER_URL=redis://redis:6379/1
CELERY_RESULT_BACKEND=redis://redis:6379/2
DJANGO_SETTINGS_MODULE=config.settings.development

Note

Docker service names (db, redis) are used as hostnames, not localhost.

Common Operations

# Run migrations
docker compose exec web uv run python manage.py migrateschema -as

# Run backend tests
docker compose exec web uv run pytest

# Open Django shell
docker compose exec web uv run python manage.py shell

# Install new Python dependencies
docker compose exec web uv sync --extra dev

# Install new npm dependencies
docker compose exec frontend npm install

Troubleshooting

Database connection refused

# Ensure db service is running and healthy
docker compose ps db
docker compose logs db

Redis connection issues

# Check Redis is accepting connections
docker compose exec redis redis-cli ping

Stale containers

# Rebuild all images
docker compose build --no-cache

# Remove all containers and volumes
docker compose down -v

See Also