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¶
- Application: http://localhost:3000
- Prisma Studio: http://localhost:5555 (with
--profile tools) - PostgreSQL: localhost:5432
- Redis: localhost:6379
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:
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.dockerfor 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
.envfiles - Use default passwords in production
- Run as root in containers
- Expose ports unnecessarily
- Skip database backups
- Use development images in production
Related Documentation¶
Next Steps¶
- Review Kubernetes for container orchestration
- Set up CI/CD pipeline
- Complete Production Checklist