Skip to content

Docker Compose Deployment

Last Updated: 2025-01-22

Deploy AccessALI using Docker Compose for local development and staging environments.


Overview

Docker Compose provides:

  • Consistent environment - Same setup across team
  • Service orchestration - App, database, Redis
  • Hot reload - Development with live updates
  • Production parity - Mirror production setup

Services

The docker-compose.yml defines three core services:

graph LR
    App[Next.js App<br/>:3000] --> Postgres[(PostgreSQL<br/>:5432)]
    App --> Redis[(Redis<br/>:6379)]
    PrismaStudio[Prisma Studio<br/>:5555] --> Postgres

1. PostgreSQL Database

postgres:
  image: postgres:16-alpine
  container_name: accessali-postgres
  ports:
    - "5432:5432"
  environment:
    POSTGRES_USER: accessali
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-accessali_dev_password}
    POSTGRES_DB: accessali
  volumes:
    - postgres_data:/var/lib/postgresql/data

2. Redis Cache

redis:
  image: redis:7-alpine
  container_name: accessali-redis
  ports:
    - "6379:6379"
  command: redis-server --requirepass ${REDIS_PASSWORD:-redis_dev_password}

3. Next.js Application

app:
  build:
    context: .
    dockerfile: Dockerfile.dev
  container_name: accessali-app
  ports:
    - "3000:3000"
  environment:
    DATABASE_URL: postgresql://accessali:password@postgres:5432/accessali
  volumes:
    - ./src:/app:delegated
    - /app/node_modules

Quick Start

1. Environment Setup

Create .env.docker:

# Database
POSTGRES_PASSWORD=accessali_dev_password

# Redis
REDIS_PASSWORD=redis_dev_password

# JWT & NextAuth
JWT_SECRET=your-jwt-secret-minimum-32-characters-required
NEXTAUTH_SECRET=dev-secret-key-minimum-32-characters-long

# Mock APIs (use mocks in development)
USE_MOCK_SAP=true
USE_MOCK_SALESFORCE=true
USE_MOCK_SPRINGCM=true

2. Build and Start

# Build services
docker-compose build

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f app

# Check status
docker-compose ps

3. Initialize Database

# Run migrations
docker-compose exec app pnpm db:migrate

# Seed data (optional)
docker-compose exec app pnpm db:seed

# Open Prisma Studio
docker-compose --profile tools up prisma-studio

4. Access Services


Development Workflow

Daily Development

# Start services
docker-compose up -d

# Watch logs
docker-compose logs -f app

# Stop services
docker-compose down

Hot Reload

Source code is mounted as a volume, providing automatic hot-reload:

volumes:
  - ./src:/app:delegated  # Source code sync
  - /app/node_modules      # Preserve node_modules

Execute Commands

# Access app shell
docker-compose exec app sh

# Run migrations
docker-compose exec app pnpm db:migrate

# Run tests
docker-compose exec app pnpm test

# Type check
docker-compose exec app pnpm type-check

Database Management

Migrations

# Create migration
docker-compose exec app pnpm db:migrate:dev --name migration_name

# Apply migrations
docker-compose exec app pnpm db:migrate

# Reset database
docker-compose exec app pnpm db:reset

Backup and Restore

# Backup
docker-compose exec postgres pg_dump -U accessali accessali > backup.sql

# Restore
docker-compose exec -T postgres psql -U accessali accessali < backup.sql

Production Deployment

Build Production Image

# Build production image
docker build -f Dockerfile -t accessali:latest .

# Run with docker-compose.prod.yml
docker-compose -f docker-compose.prod.yml up -d

Environment Variables

Production .env.production:

DATABASE_URL=postgresql://user:password@db-host:5432/accessali
NEXTAUTH_SECRET=production-secret-minimum-32-characters
USE_MOCK_SAP=false
USE_MOCK_SALESFORCE=false

Troubleshooting

Container Won't Start

# Check logs
docker-compose logs app

# Rebuild image
docker-compose build --no-cache app

# Remove volumes and restart
docker-compose down -v
docker-compose up -d

Database Connection Error

# Check database is running
docker-compose ps postgres

# Check connection
docker-compose exec postgres pg_isready -U accessali

# Verify DATABASE_URL in app
docker-compose exec app env | grep DATABASE_URL

Hot Reload Not Working

# Restart app service
docker-compose restart app

# Check volume mounts
docker-compose exec app ls -la /app

# Rebuild if necessary
docker-compose up -d --build app

Best Practices

Do

  • Use .env.docker for local configuration
  • Keep secrets out of version control
  • Use health checks for services
  • Monitor logs during development
  • Clean up volumes periodically
  • Use production compose file for staging

Don't

  • Commit .env files
  • Use default passwords in production
  • Run as root in containers
  • Expose ports unnecessarily
  • Skip database backups
  • Use development images in production


Next Steps

  1. Review Kubernetes for container orchestration
  2. Set up CI/CD pipeline
  3. Complete Production Checklist