Files
ColaFlow/DOCKER-README.md
Yaojia Wang 014d62bcc2 Project Init
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 23:55:18 +01:00

433 lines
9.7 KiB
Markdown

# ColaFlow Docker Development Environment
This document explains how to set up and use the Docker-based development environment for ColaFlow.
## Prerequisites
- **Docker Desktop** (latest version)
- Windows: Docker Desktop for Windows with WSL2
- Mac: Docker Desktop for Mac
- Linux: Docker Engine + Docker Compose
- **Git** (for cloning repository)
- **Minimum System Requirements**:
- 8GB RAM (16GB recommended)
- 20GB free disk space
- 4 CPU cores
## Quick Start
### 1. Start All Services
```bash
# Start all core services (PostgreSQL, Redis, Backend, Frontend)
docker-compose up -d
# View logs
docker-compose logs -f
# View specific service logs
docker-compose logs -f backend
docker-compose logs -f frontend
```
### 2. Access Services
| Service | URL | Credentials |
|---------|-----|-------------|
| **Frontend** | http://localhost:3000 | N/A |
| **Backend API** | http://localhost:5000 | N/A |
| **API Documentation** | http://localhost:5000/scalar/v1 | N/A |
| **PostgreSQL** | localhost:5432 | User: `colaflow` / Password: `colaflow_dev_password` |
| **Redis** | localhost:6379 | Password: `colaflow_redis_password` |
| **pgAdmin** (optional) | http://localhost:5050 | Email: `admin@colaflow.com` / Password: `admin` |
| **Redis Commander** (optional) | http://localhost:8081 | N/A |
### 3. Stop Services
```bash
# Stop all services (preserves data)
docker-compose stop
# Stop and remove containers (preserves volumes)
docker-compose down
# Stop and remove everything including volumes (⚠️ DATA LOSS)
docker-compose down -v
```
## Service Details
### Core Services
#### PostgreSQL (Database)
- **Image**: `postgres:16-alpine`
- **Port**: 5432
- **Database**: `colaflow`
- **Volume**: `postgres_data` (persistent)
- **Health Check**: Automatic readiness check
#### Redis (Cache & Session Store)
- **Image**: `redis:7-alpine`
- **Port**: 6379
- **Persistence**: AOF (Append-Only File)
- **Volume**: `redis_data` (persistent)
#### Backend API (.NET 9)
- **Port**: 5000 (HTTP)
- **Dependencies**: PostgreSQL + Redis
- **Hot Reload**: Enabled (when volume mounted)
- **Health Endpoint**: http://localhost:5000/health
#### Frontend (Next.js 15)
- **Port**: 3000
- **Dependencies**: Backend API
- **Hot Reload**: Enabled (via volume mounts)
- **Dev Mode**: Enabled by default
### Test Services
#### PostgreSQL Test Database
- **Port**: 5433
- **Database**: `colaflow_test`
- **Purpose**: Integration testing (Testcontainers)
- **Storage**: In-memory (tmpfs)
### Optional Tools
To enable optional management tools:
```bash
# Start with tools (pgAdmin + Redis Commander)
docker-compose --profile tools up -d
# Or set in .env file
COMPOSE_PROFILES=tools
```
#### pgAdmin (Database Management)
- Visual PostgreSQL management
- Access: http://localhost:5050
- Add server manually:
- Host: `postgres`
- Port: `5432`
- Database: `colaflow`
- Username: `colaflow`
- Password: `colaflow_dev_password`
#### Redis Commander (Redis Management)
- Visual Redis key-value browser
- Access: http://localhost:8081
## Development Workflows
### Building from Source
The Docker Compose setup expects the following directory structure:
```
product-master/
├── docker-compose.yml
├── src/ # Backend source code
│ ├── ColaFlow.API/
│ ├── ColaFlow.Application/
│ ├── ColaFlow.Domain/
│ ├── ColaFlow.Infrastructure/
│ └── Dockerfile.backend # Backend Dockerfile
├── colaflow-web/ # Frontend source code
│ ├── app/
│ ├── components/
│ ├── lib/
│ └── Dockerfile # Frontend Dockerfile
└── scripts/
└── init-db.sql
```
### Backend Development
```bash
# Rebuild backend after code changes
docker-compose up -d --build backend
# View backend logs
docker-compose logs -f backend
# Execute commands in backend container
docker-compose exec backend dotnet --version
docker-compose exec backend dotnet ef migrations list
```
### Frontend Development
```bash
# Rebuild frontend after dependency changes
docker-compose up -d --build frontend
# View frontend logs
docker-compose logs -f frontend
# Install new npm packages
docker-compose exec frontend npm install <package-name>
```
### Database Operations
```bash
# Access PostgreSQL CLI
docker-compose exec postgres psql -U colaflow -d colaflow
# Backup database
docker-compose exec postgres pg_dump -U colaflow colaflow > backup.sql
# Restore database
docker-compose exec -T postgres psql -U colaflow -d colaflow < backup.sql
# View database logs
docker-compose logs -f postgres
```
### Redis Operations
```bash
# Access Redis CLI
docker-compose exec redis redis-cli -a colaflow_redis_password
# View Redis logs
docker-compose logs -f redis
# Clear all Redis data
docker-compose exec redis redis-cli -a colaflow_redis_password FLUSHALL
```
## Testing
### Integration Tests
The `postgres-test` service provides an isolated test database for integration tests.
```bash
# Start test database
docker-compose up -d postgres-test
# Run integration tests (from host)
cd src/ColaFlow.API.Tests
dotnet test --filter Category=Integration
# Test database connection string
Host=localhost;Port=5433;Database=colaflow_test;Username=colaflow_test;Password=colaflow_test_password
```
### Testcontainers
For automated integration testing, Testcontainers will spin up temporary Docker containers automatically. No manual setup required.
## Troubleshooting
### Docker Desktop Not Running
**Error**: `error during connect: Get "http:///.../docker...": open //./pipe/docker...`
**Solution**:
1. Start Docker Desktop
2. Wait for it to fully initialize (green icon in system tray)
3. Retry your command
### Port Already in Use
**Error**: `Bind for 0.0.0.0:5432 failed: port is already allocated`
**Solution**:
```bash
# Find process using the port (Windows)
netstat -ano | findstr :5432
# Kill the process
taskkill /PID <PID> /F
# Or change port in docker-compose.yml
ports:
- "5433:5432" # Map to different host port
```
### Container Health Check Failing
**Error**: `container "colaflow-postgres" is unhealthy`
**Solution**:
```bash
# Check container logs
docker-compose logs postgres
# Restart the service
docker-compose restart postgres
# Remove and recreate
docker-compose down
docker-compose up -d
```
### Out of Disk Space
**Error**: `no space left on device`
**Solution**:
```bash
# Remove unused images and containers
docker system prune -a
# Remove unused volumes (⚠️ deletes data)
docker volume prune
```
### Backend Cannot Connect to Database
**Symptoms**: Backend crashes on startup or shows connection errors
**Solution**:
1. Check PostgreSQL is healthy: `docker-compose ps`
2. Verify connection string in `docker-compose.yml`
3. Check logs: `docker-compose logs postgres`
4. Ensure health checks pass before backend starts (depends_on conditions)
### Frontend Cannot Connect to Backend
**Symptoms**: API calls fail with CORS or connection errors
**Solution**:
1. Check backend is running: `curl http://localhost:5000/health`
2. Verify `NEXT_PUBLIC_API_URL` in frontend environment
3. Check CORS settings in backend configuration
4. Review logs: `docker-compose logs backend frontend`
## Performance Optimization
### Memory Limits
Add memory limits to prevent Docker from consuming too much RAM:
```yaml
services:
backend:
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
```
### Build Cache
Speed up rebuilds by leveraging Docker build cache:
```bash
# Use BuildKit for better caching
DOCKER_BUILDKIT=1 docker-compose build
# Set as default (add to .bashrc or .zshrc)
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1
```
### Volume Performance
For better I/O performance on Windows/Mac:
```yaml
volumes:
- ./colaflow-web:/app:cached # Better read performance
```
## Security Notes
### Development Credentials
⚠️ **NEVER use these credentials in production!**
All passwords and secrets in `docker-compose.yml` are for **local development only**.
### Production Deployment
For production:
1. Use environment-specific compose files
2. Store secrets in secure vaults (Azure Key Vault, AWS Secrets Manager, etc.)
3. Enable HTTPS/TLS
4. Use strong passwords
5. Implement network segmentation
6. Enable authentication on all services
## Advanced Usage
### Running Individual Services
```bash
# Start only database
docker-compose up -d postgres redis
# Start backend without frontend
docker-compose up -d postgres redis backend
```
### Custom Configuration
Create a `.env` file for custom settings:
```bash
# Copy template
cp .env.example .env
# Edit .env with your values
# Then start services
docker-compose up -d
```
### Multi-Environment Setup
```bash
# Development (default)
docker-compose up -d
# Staging
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
# Production
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
```
## Clean Slate Restart
To completely reset your environment:
```bash
# Stop all containers
docker-compose down -v
# Remove all ColaFlow images
docker images | grep colaflow | awk '{print $3}' | xargs docker rmi -f
# Remove all unused Docker resources
docker system prune -a --volumes
# Restart from scratch
docker-compose up -d --build
```
## Next Steps
- [Backend Development Guide](./docs/backend-guide.md)
- [Frontend Development Guide](./docs/frontend-guide.md)
- [Testing Guide](./tests/README.md)
- [Architecture Documentation](./docs/M1-Architecture-Design.md)
## Support
For issues with Docker setup:
1. Check this README's Troubleshooting section
2. Review Docker Compose logs: `docker-compose logs`
3. Check Docker Desktop is up-to-date
4. Consult team documentation
---
**Last Updated**: 2025-11-02
**Maintained By**: QA Team