Initial commit: docker-compose-config skill

Add skill for Docker Compose configuration management with:
- Multi-host environment structure with per-hostname overrides
- External volume mount patterns with env variable substitution
- Reverse proxy network configuration for SWAG integration
- Reference docs for examples and network topology

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-30 16:39:42 -05:00
commit e769526b13
3 changed files with 584 additions and 0 deletions

168
SKILL.md Normal file
View File

@@ -0,0 +1,168 @@
---
name: docker-compose-config
description: Docker Compose configuration management for multi-host server deployments. Use when creating, modifying, or managing docker-compose.yml files with environment-specific configurations, external volume mounts, and reverse proxy networks. Triggers on tasks involving Docker Compose files, environment overrides, multi-host deployments, or service configuration for self-hosted applications.
---
# Docker Compose Configuration Management
This skill provides guidance for managing Docker Compose configurations across multiple server environments with per-host overrides.
## Directory Structure
Each project follows this structure:
```
/docker/config/
├── <project>/
│ ├── docker-compose.yml # Main service definitions
│ ├── docker-compose.override.yml # Current host overrides (gitignored)
│ ├── .env # Environment variables (gitignored)
│ └── environments/
│ └── <hostname>/ # Per-host configs
│ ├── .env
│ └── docker-compose.override.<hostname>.yml
```
## Compose File Conventions
### Service Definition Pattern
```yaml
name: <project-name>
services:
<service-name>:
container_name: <service_container>
image: <registry>/<image>:<version>@sha256:<digest>
environment:
PUID: ${UID}
PGID: ${GID}
# Service-specific vars use env substitution
VAR_NAME: ${VAR_NAME}
volumes:
- ${DATA_PATH}:/app/data
- /etc/localtime:/etc/localtime:ro
ports:
- ${SERVICE_PORT:-default}:internal_port
restart: unless-stopped
networks:
- default
- reverse_proxy
networks:
reverse_proxy:
name: reverse_proxy
attachable: true
```
### Key Patterns
1. **Image pinning**: Use SHA256 digests for reproducibility
```yaml
image: ghcr.io/org/image:v1.0.0@sha256:abc123...
```
2. **Port defaults**: Always provide defaults for ports
```yaml
ports:
- ${APP_PORT:-8080}:8080
```
3. **Volume mounts**: Use environment variables for paths
```yaml
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- ${DB_DATA_LOCATION}/data:/var/lib/postgresql/data
```
4. **Proxy network**: Services needing reverse proxy access join `reverse_proxy` network
```yaml
networks:
- default
- reverse_proxy
networks:
reverse_proxy:
name: reverse_proxy
attachable: true
```
## Environment File Conventions
### Structure (.env)
```bash
# Permissions
UID=1000
GID=1000
# Paths
UPLOAD_LOCATION=/mnt/user/pictures
DB_DATA_LOCATION=/mnt/user/appdata/<project>
# Ports
APP_PORT=8080
# Secrets
DB_PASSWORD=<generated>
# Database
DB_HOSTNAME=database
DB_USERNAME=postgres
DB_DATABASE_NAME=<project>
```
### Per-Host Variations
- `environments/<hostname>/.env` overrides paths for specific hosts
- Common overrides: mount paths (`/mnt/user/` vs `/mnt/main/`), ports
## Common Commands
```bash
# Start a project
docker compose -f <project>/docker-compose.yml up -d
# Start with host-specific override
docker compose -f <project>/docker-compose.yml \
-f <project>/environments/<host>/docker-compose.override.<host>.yml up -d
# View logs
docker compose -f <project>/docker-compose.yml logs -f
# Stop services
docker compose -f <project>/docker-compose.yml down
```
## Adding a New Host Environment
1. Create `environments/<hostname>/` directory
2. Copy existing host's `.env` as template
3. Update paths and port mappings for the host
4. Create override compose file if device mappings differ
## Service Dependencies
Use `depends_on` with health checks for proper startup order:
```yaml
depends_on:
database:
condition: service_healthy
```
## Healthchecks
```yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/"]
start_period: 5m
interval: 30s
timeout: 20s
retries: 10
```
## References
- See [examples.md](references/examples.md) for complete service configurations
- See [networks.md](references/networks.md) for network topology details