Best Docker Compose Templates for Your Home Server
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
- Create directories:
mkdir -p config data media downloads - Save as docker-compose.yml: Copy template to file
- Customize values: Change passwords, paths, and ports as needed
- Deploy:
docker-compose up -d - 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: alwayskeeps services running - ✅ Use PUID/PGID: Match your user permissions
- ✅ Specify versions:
:latestcan 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.