Files
EZ-Homelab/docker-compose
Kelin f141848a10 Add EZ-Homelab Enhanced Setup System
- Complete modular bash-based setup system replacing Python TUI
- Phase 1-4 implementation: Core Infrastructure, Configuration Management, Deployment Engine, Service Orchestration & Management
- 9 production-ready scripts: preflight.sh, setup.sh, pre-deployment-wizard.sh, localize.sh, generalize.sh, validate.sh, deploy.sh, service.sh, monitor.sh, backup.sh, update.sh
- Shared libraries: common.sh (utilities), ui.sh (text interface)
- Template-based configuration system with environment variable substitution
- Comprehensive documentation: PRD, standards, and quick reference guides
- Automated backup, monitoring, and update management capabilities
- Cross-platform compatibility with robust error handling and logging
2026-01-29 19:53:36 -05:00
..
2026-01-29 19:53:36 -05:00

Docker Compose Stacks

This directory contains Docker Compose files for managing your homelab services. Each stack is organized in its own folder for better organization and maintainability.

Structure

docker-compose/
├── core/              # Core infrastructure (Traefik, Authelia, DuckDNS)
├── infrastructure/    # Additional infrastructure (Pi-hole, Dockge, etc.)
├── dashboards/        # Dashboard services (Homepage, Homarr)
├── vpn/               # VPN services (Gluetun, qBittorrent)
├── media/             # Media services (Plex, Jellyfin, etc.)
├── monitoring/        # Observability stack (Prometheus, Grafana, etc.)
├── alternatives/      # Alternative services (Authentik, etc.)
├── homeassistant/     # Home Assistant stack
├── nextcloud/         # Nextcloud stack
├── productivity/      # Productivity tools
├── utilities/         # Utility services
└── README.md          # This file

Usage

Starting Services

Start all services in a stack:

cd docker-compose/core && docker compose up -d

Start a specific service:

cd docker-compose/vpn && docker compose up -d gluetun

Stopping Services

Stop all services in a stack:

cd docker-compose/core && docker compose down

Stop a specific service:

cd docker-compose/vpn && docker compose stop qbittorrent

Viewing Status

Check running services:

docker compose -f docker-compose/media.yml ps

View logs:

docker compose -f docker-compose/media.yml logs -f plex

Updating Services

Pull latest images:

docker compose -f docker-compose/media.yml pull

Update a specific service:

docker compose -f docker-compose/media.yml pull plex
docker compose -f docker-compose/media.yml up -d plex

Networks

All services connect to a shared bridge network called homelab-network. Create it once:

docker network create homelab-network

Some services may use additional networks for security isolation:

  • monitoring-network - For monitoring stack
  • database-network - For database isolation
  • media-network - For media services

Create them as needed:

docker network create monitoring-network
docker network create database-network
docker network create media-network

Environment Variables

Create a .env file in the root of your homelab directory with common variables:

# .env
PUID=1000
PGID=1000
TZ=America/New_York
USERDIR=/home/username/homelab
DATADIR=/mnt/data

Never commit .env files to git! Use .env.example as a template instead.

Labels

To enable Authelia SSO



Traefik routing labels

If Traekif is on the same server add these labels.


If Traefik is on a seperate server, don't use traekfik labels in compose files, use an external host yaml file.

Sablier middleware labels

Add these labels to enable ondemand functionality.

    labels:
      - sablier.enable=true
      - sablier.group=<server>-<service name>
      - sablier.start-on-demand=true
      

Best Practices

  1. Pin Versions: Always specify image versions (e.g., nginx:1.25.3 not nginx:latest)
  2. Use Labels: Add labels for organization and documentation
  3. Health Checks: Define health checks for critical services
  4. Resource Limits: Set memory and CPU limits for resource-intensive services
  5. Logging: Configure log rotation to prevent disk space issues
  6. Restart Policies: Use unless-stopped for most services
  7. Comments: Document non-obvious configurations

Template

When creating a new service, use this template:

services:
  service-name:
    image: vendor/image:version
    container_name: service-name
    restart: unless-stopped
    networks:
      - homelab-network
    ports:
      - "host_port:container_port"
    volumes:
      - ./config/service-name:/config
      - service-data:/data
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:port/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    labels:
      - "homelab.category=category"
      - "homelab.description=Service description"

volumes:
  service-data:
    driver: local

networks:
  homelab-network:
    external: true

Troubleshooting

Service won't start

  1. Check logs: docker compose -f file.yml logs service-name
  2. Validate config: docker compose -f file.yml config
  3. Check for port conflicts: sudo netstat -tlnp | grep PORT
  4. Verify volumes exist and have correct permissions

Permission errors

  1. Ensure PUID and PGID match your user: id -u and id -g
  2. Fix directory ownership: sudo chown -R 1000:1000 ./config/service-name

Network issues

  1. Verify network exists: docker network ls
  2. Check service is connected: docker network inspect homelab-network
  3. Test connectivity: docker compose exec service1 ping service2

Migration from Docker Run

If you have services running via docker run, migrate them to compose:

  1. Get current configuration:

    docker inspect container-name > container-config.json
    
  2. Convert to compose format (extract image, ports, volumes, environment)

  3. Test the compose configuration

  4. Stop old container:

    docker stop container-name
    docker rm container-name
    
  5. Start with compose:

    docker compose -f file.yml up -d
    

Backup Strategy

Regular backups are essential:

# Backup compose files (already in git)
git add docker-compose/*.yml
git commit -m "Update compose configurations"

# Backup volumes
docker run --rm \
  -v volume-name:/data \
  -v $(pwd)/backups:/backup \
  busybox tar czf /backup/volume-name-$(date +%Y%m%d).tar.gz /data

# Backup config directories
tar czf backups/config-$(date +%Y%m%d).tar.gz config/

Getting Help

Examples

See the example compose files in this directory:

  • infrastructure.yml - Essential services like reverse proxy
  • media.yml - Media server stack
  • monitoring.yml - Observability and monitoring
  • development.yml - Development environments and tools