8.2 KiB
start-dev-env
When to Use
Use this command when you want to:
- Test your code changes in an isolated Docker Compose environment
- Verify API endpoints work correctly after modifications
- Test database interactions with a fresh copy of the main database
- Iterate on changes by testing them in a real environment
- Debug issues in an isolated environment before committing
Prerequisites
- .NET SDK installed (
dotnet --version) - Main PostgreSQL database running on localhost:5432
- Docker installed and running
- PostgreSQL client (psql) installed
- Scripts are executable:
chmod +x scripts/*.sh
Execution Steps
Step 1: Verify Prerequisites
Check that all prerequisites are met:
-
Check main database is accessible: Run:
PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d managing -c '\q'If connection fails:
- Error: "❌ Cannot connect to main database at localhost:5432"
- Fix: Start the main PostgreSQL container:
cd src/Managing.Docker docker-compose -f docker-compose.yml -f docker-compose.local.yml up -d postgres - Wait 15 seconds for PostgreSQL to start
- Retry connection check
- STOP if database cannot be started
-
Check Docker is running: Run:
docker psIf Docker is not running:
- Error: "❌ Docker is not running"
- Fix: Start Docker Desktop or Docker daemon
- STOP if Docker cannot be started
Step 2: Generate Task ID
Generate a unique task ID for this dev session:
- Use format:
DEV-{timestamp}orDEV-{random} - Example:
DEV-20250101-143022orDEV-A3X9 - Store this ID for later reference
Step 3: Find Available Port
Find an available port offset to avoid conflicts:
- Start with offset 0 (ports: 5433, 5000, 6379)
- If ports are in use, try offset 10, 20, 30, etc.
- Check if ports are available:
lsof -i :5433 || echo "Port 5433 available" lsof -i :5000 || echo "Port 5000 available"
Step 4: Start Docker Environment
Start the Docker Compose environment with database copy:
Run: bash scripts/start-task-docker.sh {TASK_ID} {PORT_OFFSET}
Example:
bash scripts/start-task-docker.sh DEV-A3X9 0
Or use the simple wrapper:
bash scripts/start-dev-env.sh DEV-A3X9 0
What this does:
- Creates task-specific Docker Compose file
- Starts PostgreSQL on port 5433 (or 5432 + offset)
- Starts Redis on port 6379 (or 6379 + offset)
- Waits for PostgreSQL to be ready
- Copies database from main repo (localhost:5432) to test instance
- Starts API and Workers with correct connection strings
- Uses main InfluxDB instance at localhost:8086
If start succeeds:
- Note the API URL (e.g., "http://localhost:5000")
- Note the database name (e.g., "managing_dev-a3x9")
- Continue to Step 5
If start fails:
- Check error messages
- Common issues:
- Port conflicts: Try different port offset
- Database connection: Verify main database is running
- Docker issues: Check Docker is running
- Try to fix:
- Use different port offset
- Restart Docker
- Verify main database is accessible
- STOP if cannot start after multiple attempts
Step 5: Verify Environment is Running
Verify the Docker environment is working:
-
Check API health endpoint: Run:
curl http://localhost:{API_PORT}/healthIf health check fails:
- Wait 30 seconds for services to start
- Check Docker logs:
docker logs managing-api-{TASK_ID} - Check for errors
- STOP if services don't start after 2 minutes
-
Verify database was copied: Run:
PGPASSWORD=postgres psql -h localhost -p {POSTGRES_PORT} -U postgres -d managing_{TASK_ID} -c "SELECT COUNT(*) FROM \"Users\";"If database is empty or missing:
- Error: "❌ Database was not copied correctly"
- Fix: Re-run database copy script manually
- STOP if database cannot be copied
Step 6: Test Your Changes
Now you can test your changes:
-
API endpoints:
- Use API URL:
http://localhost:{API_PORT} - Test modified endpoints
- Verify responses are correct
- Use API URL:
-
Database interactions:
- Changes are isolated to this test database
- Main database remains unchanged
- Can test migrations, data changes, etc.
-
Iterate:
- Make code changes
- Rebuild solution:
/build-solution - Rebuild Docker images if needed:
docker-compose -f {COMPOSE_FILE} build - Restart services:
docker-compose -f {COMPOSE_FILE} restart managing-api-{TASK_ID} - Test again
Step 7: Stop Instance When Done
When finished testing, stop the Docker environment:
Run: bash scripts/stop-task-docker.sh {TASK_ID}
Example:
bash scripts/stop-task-docker.sh DEV-A3X9
This will:
- Stop all containers
- Remove volumes
- Clean up compose file
Integration with Development Workflow
After Making Code Changes
-
Build solution:
- Run:
/build-solution - Fix any build errors
- Run:
-
Start Docker environment for testing:
- Run:
/start-aspire-dev - Note the URLs
- Run:
-
Test your changes:
- Use the API endpoints
- Verify database interactions
- Check logs:
docker logs managing-api-{TASK_ID}
-
Iterate if needed:
- Fix issues found during testing
- Rebuild Docker images if code changed
- Restart services
- Test again
-
Stop when done:
- Stop the Docker environment
- Clean up if needed
When to Use This Command
- ✅ After modifying API endpoints
- ✅ After changing database models
- ✅ After updating business logic
- ✅ Before committing changes
- ✅ When debugging issues
- ✅ When testing integrations
When NOT to Use This Command
- ❌ For production deployments (use proper CI/CD)
- ❌ For running unit tests (use test runner)
- ❌ For code review (use static analysis)
Error Handling
If main database is not accessible:
- Start PostgreSQL container:
cd src/Managing.Docker && docker-compose up -d postgres - Wait 15 seconds
- Retry connection check
- STOP if database cannot be started
If ports are in use:
- Try different port offset (10, 20, 30, etc.)
- Check what's using the ports:
lsof -i :{PORT} - Stop conflicting services if needed
If database copy fails:
- Verify main database is accessible
- Check PostgreSQL client is installed:
which psql - Verify connection strings are correct
- Check disk space
- STOP if copy cannot complete
If Docker services don't start:
- Check Docker logs:
docker logs {container_id} - Verify all dependencies are installed
- Check .NET SDK version matches requirements
- STOP if services cannot start after multiple attempts
Example Execution
User input: /start-dev-env
AI execution:
-
Verify prerequisites:
- Check main database: ✅ Accessible
- Check Docker: ✅ Running
-
Generate task ID:
DEV-A3X9 -
Find available port: Offset 0 (ports available)
-
Start Docker environment:
bash scripts/start-task-docker.sh DEV-A3X9 0- Creating compose file...
- Starting PostgreSQL...
- ✅ PostgreSQL ready
- Copying database...
- ✅ Database copied
- Starting API and Workers...
- ✅ Services started
-
Verify:
- API: http://localhost:5000 ✅
- Health check: ✅ Healthy
- Database: ✅ Copied (1234 users found)
-
Success: "✅ Docker dev environment ready!"
- API: http://localhost:5000
- Database: managing_dev-a3x9 on port 5433
- To stop:
bash scripts/stop-task-docker.sh DEV-A3X9
Important Notes
- ✅ Always verify main database first - Must be accessible
- ✅ Use unique task IDs - Prevents conflicts
- ✅ Check port availability - Avoids port conflicts
- ✅ Wait for services to start - Can take 30-60 seconds
- ✅ Database is isolated - Changes don't affect main database
- ✅ InfluxDB uses main instance - No separate InfluxDB per task
- ✅ Stop when done - Frees up resources
- ⚠️ Multiple instances - Each needs unique ports
- ⚠️ Resource usage - Each instance uses memory/CPU
- 📦 Script location:
scripts/start-task-docker.sh - 🔧 Main database: localhost:5432
- 🗄️ Test databases: localhost:5433+ (isolated per task)
- 📊 InfluxDB: Uses main instance at localhost:8086