# Build and run everything
docker-compose up --build
# Or run in background
docker-compose up -d --buildThen open: http://localhost:3000
┌─────────────┐ ┌─────────────┐
│ Frontend │─────▶│ Backend │
│ (Next.js) │ │ (FastAPI) │
│ Port 3000 │ │ Port 8000 │
└─────────────┘ └──────┬──────┘
│
▼
┌─────────────┐
│ Volume │
│ ./output/ │
│ (Persisted)│
└─────────────┘
Generated skills are stored in ./output/ directory which is mounted as a volume.
This means:
- ✅ Skills persist across container restarts
- ✅ You can access files directly on host
- ✅ Multiple containers can share the same output
- Port: 8000
- Tech: Python 3.11 + uv + FastAPI
- Mounts: CLI scripts, configs, output directory
- Port: 3000
- Tech: Next.js 15 + React + TypeScript
- Build: Standalone output for production
# Start services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
# Rebuild after code changes
docker-compose up --build
# Remove volumes (deletes generated skills!)
docker-compose down -vCreate .env file:
# Backend
PYTHONUNBUFFERED=1
# Frontend
NEXT_PUBLIC_API_URL=http://localhost:8000# In docker-compose.yml, change:
NEXT_PUBLIC_API_URL=https://your-backend-domain.comUse nginx to serve both frontend and backend on same domain:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://frontend:3000;
}
location /api {
proxy_pass http://backend:8000;
}
}# Run multiple backend workers
docker-compose up --scale backend=3- All generated skill files (.zip)
- Persists across restarts
- Can be backed up easily
doc_scraper.pyenhance_skill.pypackage_skill.pyconfigs/
These are mounted read-only so the container uses the exact CLI tools.
Check volume mount:
docker-compose exec backend ls -la /outputCheck mounts:
docker-compose exec backend ls -la /Check network:
docker-compose exec frontend ping backend- Backend: ~30 seconds
- Frontend: ~2 minutes
- Total: ~2.5 minutes
- Memory: ~500MB (backend) + ~200MB (frontend)
- CPU: Varies based on scraping jobs
Add to docker-compose.yml:
services:
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
backend:
environment:
- REDIS_URL=redis://redis:6379/0
volumes:
redis-data:Then update backend/app.py to use Redis instead of in-memory dict.
Add to docker-compose.yml:
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.ymlFor production:
- Don't expose backend port publicly
- Use environment secrets (not .env files)
- Add rate limiting
- Enable HTTPS
- Regular security updates
✅ One command: docker-compose up -d
✅ Persisted data: Skills saved in ./output/
✅ Production-ready: Standalone builds
✅ Easy scaling: Add more backend workers
🚀 That's it! Simple and powerful.