setup-compose-stack
About
This skill generates Docker Compose configurations for common multi-service application patterns like web apps with databases, caches, and background workers. It implements production-ready features including named volumes, health checks, dependency management, and environment variable handling. Developers should use it to quickly create reproducible containerized environments for development, testing, or deployment scenarios.
Quick Install
Claude Code
Recommendednpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/setup-compose-stackCopy and paste this command in Claude Code to install this skill
Documentation
Set Up Compose Stack
Configure Docker Compose for multi-service stacks w/ DBs, caches, workers.
Use When
- Web app + DB|cache
- Dev env w/ multi services
- Bg workers + API
- Reproducible multi-service envs
In
- Required: App service (lang, port, entry)
- Required: Supporting services (DB, cache, queue)
- Optional: Dev vs prod config
- Optional: Existing Dockerfiles
Do
Step 1: Core Stack
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://appuser:apppass@postgres:5432/appdb
REDIS_URL: redis://redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
postgres:
image: postgres:16
environment:
POSTGRES_DB: appdb
POSTGRES_USER: appuser
POSTGRES_PASSWORD: apppass
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata:/data
volumes:
pgdata:
redisdata:
→ docker compose up starts all, app waits for healthy DB.
Step 2: Health Checks
Enable depends_on w/ condition: service_healthy:
services:
postgres:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]
interval: 5s
timeout: 5s
retries: 5
redis:
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
Step 3: Networks
services:
app:
networks:
- frontend
- backend
postgres:
networks:
- backend
nginx:
networks:
- frontend
ports:
- "80:80"
networks:
frontend:
driver: bridge
backend:
driver: bridge
Isolates DB from external; app bridges both.
Step 4: Env Vars
.env (git-ignored):
POSTGRES_PASSWORD=secure_password_here
APP_SECRET=your_secret_key
Reference:
services:
postgres:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
app:
env_file:
- .env
.env.example (committed):
POSTGRES_PASSWORD=changeme
APP_SECRET=changeme
Step 5: Worker Services
services:
worker:
build:
context: .
dockerfile: Dockerfile
command: ["node", "src/worker.js"]
environment:
DATABASE_URL: postgres://appuser:apppass@postgres:5432/appdb
REDIS_URL: redis://redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
deploy:
replicas: 2
Step 6: Profiles for Optional
services:
app:
# always starts
build: .
mailhog:
image: mailhog/mailhog
ports:
- "8025:8025"
profiles:
- dev
adminer:
image: adminer
ports:
- "8080:8080"
profiles:
- dev
# Start core services only
docker compose up
# Start with dev tools
docker compose --profile dev up
Step 7: Override for Dev
docker-compose.override.yml auto-merged:
services:
app:
build:
target: dev
volumes:
- .:/app
- /app/node_modules
environment:
NODE_ENV: development
DEBUG: "app:*"
command: ["npm", "run", "dev"]
Step 8: Build + Run
# Build all images
docker compose build
# Start in background
docker compose up -d
# View logs
docker compose logs -f app
# Check service status
docker compose ps
# Stop and remove
docker compose down
# Stop and remove volumes (full reset)
docker compose down -v
→ All services start, health checks pass, app connects DB+cache.
If err: docker compose logs <service>. Common: port conflicts, missing env vars, health check timeouts.
Check
-
docker compose upstarts w/o errs - Health checks pass DB+cache
- App connects all deps
- Named volumes persist across restarts
-
.envgit-ignored;.env.examplecommitted -
docker compose downcleanly stops - Profiles separate dev from prod
Traps
- No health checks:
depends_onw/ocondition: service_healthyonly waits for container start, not ready. - Hardcoded pwds:
.env|Docker secrets. Never commit pwds. - Volume mount overwrites: Mounting
.:/appoverwrites image'snode_modules. Anonymous volume:/app/node_modules. - Port conflicts:
docker compose ps+lsof -i :<port>. version:key: Compose V2 ignores. Omit for modern.- WSL path issues:
/mnt/c/...for Windows dirs from WSL.
→
setup-docker-compose— R-specific configscreate-dockerfile— write Dockerfilecreate-multistage-dockerfile— optimized imagesconfigure-nginx— add Nginx reverse proxy
GitHub Repository
Related Skills
railway-docs
DocumentationThis skill fetches current Railway documentation to answer questions about features, functionality, or specific docs URLs. It ensures developers receive accurate, up-to-date information directly from Railway's official sources. Use it when users ask how Railway works or reference Railway documentation.
n8n-code-python
DocumentationThis Claude Skill provides expert guidance for writing Python code in n8n's Code nodes, specifically for using Python's standard library and working with n8n's special syntax like `_input`, `_json`, and `_node`. It helps developers understand Python's limitations within n8n and recommends using JavaScript for most workflows while offering Python solutions for specific data transformation needs.
archon
DocumentationThe Archon skill provides RAG-powered semantic search and project management through a REST API. Use it for querying documentation, managing hierarchical projects/tasks, and performing knowledge retrieval with document upload capabilities. Always prioritize Archon first when searching external documentation before using other sources.
n8n-code-javascript
DocumentationThis Claude Skill provides expert guidance for writing JavaScript code in n8n's Code nodes. It covers essential n8n-specific syntax like `$input`/`$json` variables, HTTP helpers, and DateTime handling, while troubleshooting common errors. Use it when developing n8n workflows that require custom JavaScript processing in Code nodes.
