# Docker Deployment Testing Guide
## Prerequisites
1. **Start Docker Desktop**
- Open Docker Desktop application on your Mac
- Wait for it to fully start (green indicator in menu bar)
- Verify with: `docker --version`
## Step 1: Clean Slate
Remove any existing containers and volumes:
```bash
docker compose down -v
```
## Step 2: Build Images
Build fresh Docker images with all blockchain integration:
```bash
docker compose build --no-cache
```
This will:
- Build backend image with Python dependencies
- Build frontend image with npm dependencies
- Include all blockchain integration code
**Expected time**: 3-5 minutes
## Step 3: Start Services
Start both backend and frontend containers:
```bash
docker compose up -d
```
The `-d` flag runs containers in detached mode (background).
## Step 4: Monitor Startup
Watch logs to see when services are ready:
```bash
# Watch all logs
docker compose logs -f
# Or watch specific service
docker compose logs -f backend
docker compose logs -f frontend
```
**Wait for these messages:**
- Backend: `Uvicorn running on http://0.0.0.0:8000`
- Frontend: `➜ Local: http://localhost:5173/`
Press `Ctrl+C` to stop watching logs.
## Step 5: Verify Services
Check that containers are running:
```bash
docker compose ps
```
Expected output:
```
NAME STATUS PORTS
h2h-prototype-backend-1 Up X minutes 0.0.0.0:8000->8000/tcp
h2h-prototype-frontend-1 Up X minutes 0.0.0.0:5173->5173/tcp
```
## Step 6: Health Checks
### Backend API Test
```bash
# Test auth endpoint
curl -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "alice@example.com", "password": "password123"}'
```
**Expected**: JSON with `access_token` and `refresh_token`
### Frontend Test
```bash
# Check frontend is serving
curl -s http://localhost:5173 | grep -o "
.*"
```
**Expected**: `H2H - Peer-to-Peer Betting Platform`
## Step 7: Database Initialization
Initialize the database with seed data:
```bash
docker compose exec backend python seed_data.py
```
**Expected**: Creates test users (alice, bob, charlie) with sample bets
## Step 8: Verify Blockchain Files
Check that blockchain integration files are present in containers:
```bash
# Check backend blockchain services
docker compose exec backend ls -la app/blockchain/services/
# Check frontend blockchain components
docker compose exec frontend ls -la src/blockchain/hooks/
```
## Step 9: Test Application in Browser
Open your browser and navigate to:
### Frontend
**URL**: http://localhost:5173
**Test these features:**
1. Login with `alice@example.com` / `password123`
2. Navigate to Marketplace
3. Look for blockchain badges (⛓️) on bet cards
4. Click "Create Bet" and check for gas estimate panel
5. Check header for "Connect Wallet" button
6. Navigate to Wallet page
7. Verify "On-Chain Escrow" section appears
### Backend API Docs
**URL**: http://localhost:8000/docs
Browse the interactive API documentation (Swagger UI)
## Step 10: Run Automated Tests
Run the verification script inside the container:
```bash
# Copy verification script into backend container
docker compose exec backend bash -c "cat > /tmp/verify.sh << 'EOF'
#!/bin/bash
echo '🔍 Verifying Blockchain Integration in Docker'
echo '=============================================='
FILES=(
'app/blockchain/contracts/BetEscrow.pseudocode.md'
'app/blockchain/contracts/BetOracle.pseudocode.md'
'app/blockchain/services/blockchain_service.py'
'app/blockchain/services/blockchain_indexer.py'
'app/blockchain/services/oracle_node.py'
)
PASSED=0
FAILED=0
for file in \"\${FILES[@]}\"; do
if [ -f \"\$file\" ]; then
echo \"✅ \$file\"
((PASSED++))
else
echo \"❌ \$file\"
((FAILED++))
fi
done
echo ''
echo \"Results: \$PASSED passed, \$FAILED failed\"
EOF
chmod +x /tmp/verify.sh && /tmp/verify.sh"
```
## Step 11: Check Logs for Errors
```bash
# Check for any errors in backend
docker compose logs backend | grep -i error
# Check for any errors in frontend
docker compose logs frontend | grep -i error
```
**Expected**: No critical errors (warnings about blockchain providers are OK)
## Step 12: Interactive Testing
### Open a shell in backend container
```bash
docker compose exec backend bash
```
Inside the container:
```bash
# Check Python can import blockchain modules
python -c "from app.blockchain.services.blockchain_service import BlockchainService; print('✅ Blockchain imports work')"
# Check database has blockchain fields
python -c "from app.models.bet import Bet; import inspect; fields = [f for f in dir(Bet) if 'blockchain' in f]; print(f'Blockchain fields: {fields}')"
# Exit container
exit
```
### Open a shell in frontend container
```bash
docker compose exec frontend sh
```
Inside the container:
```bash
# Check TypeScript compiles without errors
npm run type-check 2>&1 | grep -E '(error|✓)' || echo "Type check completed"
# Exit container
exit
```
## Step 13: Performance Check
Monitor resource usage:
```bash
docker stats --no-stream
```
**Expected**:
- Backend: < 200MB RAM
- Frontend: < 500MB RAM (during development)
## Step 14: Stop Services
When done testing:
```bash
# Stop containers (keep data)
docker compose stop
# Or stop and remove containers (keep volumes)
docker compose down
# Or remove everything including volumes
docker compose down -v
```
## Troubleshooting
### Port Already in Use
```bash
# Kill processes on port 8000
lsof -ti:8000 | xargs kill -9
# Kill processes on port 5173
lsof -ti:5173 | xargs kill -9
# Then restart
docker compose up -d
```
### Frontend Build Errors
```bash
# Rebuild frontend without cache
docker compose build --no-cache frontend
docker compose up -d frontend
```
### Backend Import Errors
```bash
# Rebuild backend
docker compose build --no-cache backend
docker compose exec backend pip install -r requirements.txt
docker compose restart backend
```
### Database Issues
```bash
# Reset database
docker compose down -v
docker compose up -d
docker compose exec backend python seed_data.py
```
### View Container File System
```bash
# Backend files
docker compose exec backend ls -R app/blockchain/
# Frontend files
docker compose exec frontend find src/blockchain -type f
```
## Complete Test Script
Save this as `test-docker.sh`:
```bash
#!/bin/bash
echo "🐳 H2H Docker Deployment Test"
echo "=============================="
echo ""
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Stop existing containers
echo "🛑 Stopping existing containers..."
docker compose down -v > /dev/null 2>&1
# Build images
echo "🏗️ Building Docker images..."
docker compose build --no-cache > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Images built successfully${NC}"
else
echo -e "${RED}❌ Image build failed${NC}"
exit 1
fi
# Start services
echo "🚀 Starting services..."
docker compose up -d
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Services started${NC}"
else
echo -e "${RED}❌ Failed to start services${NC}"
exit 1
fi
# Wait for services to be ready
echo "⏳ Waiting for services to be ready (15 seconds)..."
sleep 15
# Check backend
echo "🔍 Testing backend..."
BACKEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/docs)
if [ "$BACKEND_STATUS" = "200" ]; then
echo -e "${GREEN}✅ Backend responding (HTTP $BACKEND_STATUS)${NC}"
else
echo -e "${RED}❌ Backend not responding (HTTP $BACKEND_STATUS)${NC}"
fi
# Check frontend
echo "🔍 Testing frontend..."
FRONTEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:5173)
if [ "$FRONTEND_STATUS" = "200" ]; then
echo -e "${GREEN}✅ Frontend responding (HTTP $FRONTEND_STATUS)${NC}"
else
echo -e "${RED}❌ Frontend not responding (HTTP $FRONTEND_STATUS)${NC}"
fi
# Seed database
echo "🌱 Seeding database..."
docker compose exec -T backend python seed_data.py > /dev/null 2>&1
echo -e "${GREEN}✅ Database seeded${NC}"
# Test login
echo "🔐 Testing login endpoint..."
LOGIN_RESPONSE=$(curl -s -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "alice@example.com", "password": "password123"}')
if echo "$LOGIN_RESPONSE" | grep -q "access_token"; then
echo -e "${GREEN}✅ Login successful${NC}"
else
echo -e "${RED}❌ Login failed${NC}"
fi
echo ""
echo "=============================="
echo "🎉 Docker deployment test complete!"
echo ""
echo "Access the application:"
echo " Frontend: http://localhost:5173"
echo " Backend API: http://localhost:8000/docs"
echo ""
echo "To view logs: docker compose logs -f"
echo "To stop: docker compose down"
```
Make executable and run:
```bash
chmod +x test-docker.sh
./test-docker.sh
```
## Expected Results
✅ **All checks should pass:**
- Images build successfully
- Both containers start and run
- Backend API responds on port 8000
- Frontend serves on port 5173
- Login endpoint works
- Database seeds successfully
- Blockchain files present in containers
- No critical errors in logs
## Success Criteria
Your Docker deployment is successful if:
1. ✅ `docker compose ps` shows both containers "Up"
2. ✅ Can login at http://localhost:5173 with test credentials
3. ✅ Backend API docs accessible at http://localhost:8000/docs
4. ✅ Blockchain badges visible in UI (⛓️)
5. ✅ Connect Wallet button appears in header
6. ✅ Gas estimate panels show in bet creation
7. ✅ No import/module errors in logs
## Next Steps
Once Docker deployment is verified:
1. Test full bet lifecycle in browser
2. Verify all blockchain UI components render
3. Check browser console for any React errors
4. Test WebSocket connections (real-time updates)
5. Verify responsive design on mobile viewport
The application is now running in Docker with full blockchain integration! 🚀