Docker Compose Templates

Deploy self-hosted services in minutes

Best Docker Compose Templates for Your Home Server

Published: March 22, 2026 | Category: Docker & Self-Hosting | Reading time: 12 min

Docker containers are the best way to run services on your home server. They're isolated, easy to update, and portable across hardware. But writing docker-compose files from scratch takes time.

These ready-to-use Docker Compose templates deploy popular self-hosted services in minutes. Copy, paste, customize, and run.

Prerequisites

Before using these templates, make sure you have:

  • Docker installed: curl -fsSL https://get.docker.com | sh
  • Docker Compose installed: pip install docker-compose
  • Docker user permissions: Add your user to docker group
  • Reverse proxy recommended: Nginx Proxy Manager or Traefik

Media Server Stack (Plex + Jellyfin + Radarr + Sonarr)

version: '3.8'

services:
  plex:
    image: linuxserver/plex:latest
    container_name: plex
    restart: always
    ports:
      - 32400:32400
    volumes:
      - ./config/plex:/config
      - ./media:/media
    environment:
      - PUID=1000
      - PGID=1000
      - VERSION=docker

  jellyfin:
    image: linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: always
    ports:
      - 8096:8096
    volumes:
      - ./config/jellyfin:/config
      - ./media:/media
    environment:
      - PUID=1000
      - PGID=1000

  radarr:
    image: linuxserver/radarr:latest
    container_name: radarr
    restart: always
    ports:
      - 7878:7878
    volumes:
      - ./config/radarr:/config
      - ./media:/media
      - ./downloads:/downloads
    environment:
      - PUID=1000
      - PGID=1000

  sonarr:
    image: linuxserver/sonarr:latest
    container_name: sonarr
    restart: always
    ports:
      - 8989:8989
    volumes:
      - ./config/sonarr:/config
      - ./media:/media
      - ./downloads:/downloads
    environment:
      - PUID=1000
      - PGID=1000

What this stack does: Plex and Jellyfin for media streaming, Radarr for movies, Sonarr for TV shows — all working together automatically.

Productivity Stack (Nextcloud + OnlyOffice + Paperless-ngx)

version: '3.8'

services:
  nextcloud_db:
    image: mariadb:latest
    container_name: nextcloud_db
    restart: always
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=your_secure_password
      - MYSQL_PASSWORD=your_secure_password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  nextcloud:
    image: linuxserver/nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - 8080:80
    volumes:
      - ./data/nextcloud:/config
      - ./data/nextcloud/data:/data
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_HOST=nextcloud_db
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=your_secure_password
      - MYSQL_DATABASE=nextcloud
    depends_on:
      - nextcloud_db

  onlyoffice:
    image: onlyoffice/documentserver:latest
    container_name: onlyoffice
    restart: always
    ports:
      - 9090:80
    volumes:
      - ./data/onlyoffice:/var/www/onlyoffice/Data
    environment:
      - ONLYOFFICE_HTTPS_ENABLED=false

  paperless:
    image: jonaswinkler/paperless-ngx:latest
    container_name: paperless
    restart: always
    ports:
      - 8000:8000
    volumes:
      - ./data/paperless/data:/usr/src/paperless/data
      - ./data/paperless/media:/usr/src/paperless/media
      - ./data/paperless/export:/usr/src/paperless/export
    environment:
      - PUID=1000
      - PGID=1000

What this stack does: Nextcloud for file sharing and collaboration, OnlyOffice for document editing, Paperless-ngx for document management and OCR.

Home Automation Stack (Home Assistant + Zigbee2MQTT + Mosquitto)

version: '3.8'

services:
  homeassistant:
    image: homeassistant/home-assistant:latest
    container_name: homeassistant
    restart: always
    ports:
      - 8123:8123
    volumes:
      - ./config/homeassistant:/config
    environment:
      - TZ=America/New_York

  zigbee2mqtt:
    image: koenkk/zigbee2mqtt:latest
    container_name: zigbee2mqtt
    restart: always
    volumes:
      - ./config/zigbee2mqtt:/app/data
      - /run/udev:/run/udev
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    environment:
      - TZ=America/New_York

  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mosquitto
    restart: always
    ports:
      - 1883:1883
      - 9001:9001
    volumes:
      - ./config/mosquitto:/mosquitto/config

What this stack does: Home Assistant for home automation, Zigbee2MQTT for smart device control, Mosquitto MQTT broker for messaging.

Monitoring Stack (Grafana + Prometheus + Node Exporter)

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - 9090:9090
    volumes:
      - ./config/prometheus:/etc/prometheus
      - ./data/prometheus:/prometheus

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - 3000:3000
    volumes:
      - ./data/grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your_secure_password

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    restart: always
    ports:
      - 9100:9100
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - /:/rootfs

What this stack does: Prometheus for metrics collection, Grafana for visualization dashboards, Node Exporter for system monitoring.

Password Manager (Bitwarden)

version: '3.8'

services:
  bitwarden_db:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: bitwarden_db
    restart: always
    volumes:
      - ./data/bitwarden/db:/var/opt/mssql/data
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=your_secure_password

  bitwarden:
    image: vaultwarden/server:latest
    container_name: bitwarden
    restart: always
    ports:
      - 8082:80
    volumes:
      - ./data/bitwarden:/data
    environment:
      - ADMIN_TOKEN=your_secure_admin_token
      - DATABASE_URL=Server=bitwarden_db;Database=bitwarden;User Id=sa;Password=your_secure_password;
      - SMTP_HOST=smtp.gmail.com
      - SMTP_FROM=your-email@gmail.com
      - SMTP_PORT=587
    depends_on:
      - bitwarden_db

What this does: Bitwarden-compatible password manager for self-hosted credential management.

Reverse Proxy (Nginx Proxy Manager)

version: '3.8'

services:
  nginx_proxy_manager:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx_proxy_manager
    restart: always
    ports:
      - 80:80
      - 443:443
      - 81:81
    volumes:
      - ./data/nginx_proxy_manager:/data
      - ./data/letsencrypt:/etc/letsencrypt
    environment:
      - DB_SQLITE_FILE=/data/database.sqlite

What this does: Easy-to-use reverse proxy with Let's Encrypt SSL for all your services. Access everything through HTTPS with auto-renewing certificates.

Usage Tips

  1. Create directories: mkdir -p config data media downloads
  2. Save as docker-compose.yml: Copy template to file
  3. Customize values: Change passwords, paths, and ports as needed
  4. Deploy: docker-compose up -d
  5. Access services: Open ports in your browser

Best Practices

  • Use environment variables: Never hardcode passwords in compose files
  • Mount volumes: Persist data outside containers
  • Set restart policies: restart: always keeps services running
  • Use PUID/PGID: Match your user permissions
  • Specify versions: :latest can break; pin to :v1.2.3
  • Limit resources: Add memory and CPU limits for production

Recommended Hardware

For running these stacks, consider:

  • CPU: 4+ cores recommended (Intel i5, Ryzen 5)
  • RAM: 8GB minimum, 16GB ideal
  • Storage: NVMe SSD for OS, HDD for media
  • Network: Gigabit ethernet minimum, 10GbE for media streaming

Conclusion

These Docker Compose templates get you started with self-hosting quickly. Customize, expand, and build your own stack based on your needs.

For more templates and community-maintained stacks, check out Selfhst and Awesome Self-Hosted.

Affiliate Disclosure: This article contains affiliate links to recommended services and hardware. If you purchase, I may earn a commission at no extra cost.