Back to Skills

setup-compose-stack

pjt222
Updated Yesterday
7 views
17
2
17
View on GitHub
Documentationapi

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

Recommended
Primary
npx skills add pjt222/agent-almanac -a claude-code
Plugin CommandAlternative
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternative
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/setup-compose-stack

Copy 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 up starts w/o errs
  • Health checks pass DB+cache
  • App connects all deps
  • Named volumes persist across restarts
  • .env git-ignored; .env.example committed
  • docker compose down cleanly stops
  • Profiles separate dev from prod

Traps

  • No health checks: depends_on w/o condition: service_healthy only waits for container start, not ready.
  • Hardcoded pwds: .env|Docker secrets. Never commit pwds.
  • Volume mount overwrites: Mounting .:/app overwrites image's node_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 configs
  • create-dockerfile — write Dockerfile
  • create-multistage-dockerfile — optimized images
  • configure-nginx — add Nginx reverse proxy

GitHub Repository

pjt222/agent-almanac
Path: i18n/caveman-ultra/skills/setup-compose-stack
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Related Skills

railway-docs

Documentation

This 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.

View skill

n8n-code-python

Documentation

This 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.

View skill

archon

Documentation

The 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.

View skill

n8n-code-javascript

Documentation

This 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.

View skill