Skip to main content

Docker Info

This project is built with reuse and modularity in mind. Every service is separate into its own separate yml file and included in the main docker-compose.yml.

docker-compose.yml
# All colon based stuff is <external>:<internal> -- external being the host machine, internal being the container itself.
# Ports in this instance cannot conflict and must be unique on the internal side.
# i.e. everything cannot run on port 8080

############ OTHER NOTES ############
# The system data will be placed in this project directory by default if you change nothing
# Data is placed in .containers and is .gitignored already
# arm64v8 = Apple Silicon Based Macs

name: home-media-docker
include:
####### NETWORK STUFF ########
- ./compose-files/traefik/traefik-compose.yml
- ./compose-files/authentik/authentik.yml
- ./compose-files/vpn/vpn.yml
- ./compose-files/transmission/transmission.yml ## --profile vpn
- ./compose-files/duplicati/duplicati.yml ## --profile vpn
- ./compose-files/pihole/pihole.yml ## --profile vpn

####### NOTES ########
- ./compose-files/bookstack/bookstack.yml

####### CONTAINER MANAGEMENT ########
- ./compose-files/portainer/portainer.yml

####### MEDIA CONSUMPTION ########
- ./compose-files/emby/emby.yml ## --profile emby
- ./compose-files/plex/plex.yml ## --profile plex
- ./compose-files/jellyfin/jellyfin.yml ## --profile jellyfin
- ./compose-files/komga/komga.yml
- ./compose-files/navidrome/navidrome.yml

####### MEDIA MANAGEMENT ########
- ./compose-files/jellyseerr/jellyseerr.yml
- ./compose-files/sonarr/sonarr.yml
- ./compose-files/radarr/radarr.yml
- ./compose-files/lidarr/lidarr.yml
- ./compose-files/prowlarr/prowlarr.yml
- ./compose-files/jackett/jackett.yml ## --profile jackett

####### DASHBOARDS ########
- ./compose-files/dashy/dashy.yml
- ./compose-files/heimdall/heimdall.yml ## --profile heimdall

####### DOCKER VOLUMES AND NETWORK CONFIG ########
- ./compose-files/optional-mounted-volumes.yml
- ./compose-files/networks.yml

######## HOME AUTOMATION CONTAINERS #############
- ./compose-files/homeassistant/homeassistant.yml
- ./compose-files/zwavejs/zwavejs.yml
- ./compose-files/zigbee2mqtt/zigbee2mqtt.yml

######## FAMILY STUFF ###################
- ./compose-files/mealie/mealie.yml
- ./compose-files/mattermost/mattermost.yml
- ./compose-files/wallos/wallos.yml

######## PASSWORD MANAGER ###################
- ./compose-files/vaultwarden/vaultwarden.yml

Including Services

Docker ships with a very nice feature to be able to include other yml files and reuse code or import code into the final compose.

When you include a yml file (shown above), it is appended to the file and resolves any conflicts when the compose script is evaluated.

File Structure

Expand the structure below to see where the files are located.

docker-compose.yml
Home-Media-Docker/
├── compose-files <--------- Add files in this directory
│   ├── authentik
│   │   ├── .env-example
│   │   └── authentik.yml
│   ├── bookstack
│   │   ├── .env-example
│   │   └── bookstack.yml
│   ├── dashy
│   │   ├── .env-example
│   │   └── dashy.yml
│   ├── duplicati
│   │   ├── .env-example
│   │   └── duplicati.yml
│   ├── emby
│   │   ├── .env-example
│   │   └── emby.yml
│   ├── heimdall
│   │   ├── .env-example
│   │   └── heimdall.yml
│   ├── homeassistant
│   │   ├── .env-example
│   │   └── homeassistant.yml
│   ├── jackett
│   │   ├── .env-example
│   │   └── jackett.yml
│   ├── jellyfin
│   │   ├── .env-example
│   │   └── jellyfin.yml
│   ├── jellyseerr
│   │   ├── .env-example
│   │   └── jellyseerr.yml
│   ├── komga
│   │   ├── .env-example
│   │   └── komga.yml
│   ├── lidarr
│   │   ├── .env-example
│   │   └── lidarr.yml
│   ├── mattermost
│   │   ├── .env-example
│   │   └── mattermost.yml
│   ├── mealie
│   │   ├── .env-example
│   │   └── mealie.yml
│   ├── navidrome
│   │   ├── .env-example
│   │   └── navidrome.yml
│   ├── networks.yml
│   ├── optional-mounted-volumes.yml
│   ├── pihole
│   │   ├── .env-example
│   │   └── pihole.yml
│   ├── plex
│   │   ├── .env-example
│   │   └── plex.yml
│   ├── portainer
│   │   ├── .env-example
│   │   └── portainer.yml
│   ├── prowlarr
│   │   ├── .env-example
│   │   └── prowlarr.yml
│   ├── radarr
│   │   ├── .env-example
│   │   └── radarr.yml
│   ├── sonarr
│   │   ├── .env-example
│   │   └── sonarr.yml
│   ├── traefik
│   │   ├── .env-example
│   │   └── traefik-compose.yml
│   ├── transmission
│   │   ├── .env-example
│   │   └── transmission.yml
│   ├── vaultwarden
│   │   ├── .env-example
│   │   └── vaultwarden.yml
│   ├── vpn
│   │   ├── .env-example
│   │   └── vpn.yml
│   ├── wallos
│   │   ├── .env-example
│   │   └── wallos.yml
│   ├── zigbee2mqtt
│   │   ├── .env-example
│   │   └── zigbee2mqtt.yml
│   └── zwavejs
│   │ ├── .env-example
│   │ └── zwavejs.yml
├── dashy-config.yml <------ Configuration for Dashy the dashboard
├── docker-compose.yml <------ Main compose file. Add includes here
├── scripts <------ Helper scripts directory
│   ├── README.md
│   ├── config-check.sh
│   ├── copyenv.sh
│   ├── hassio.sh
│   ├── startup.sh
│   └── tearDown.sh
└── traefik-data <---- Traefik config files (do not delete if you want to use traefik)
├── acme.json
├── config.yml
└── traefik.yml

Why?

This allows for services to be added and removed extremely easily. If you want to add a new yml of your own to this, it is literally just a matter of adding the item to the include: array.

Each compose file is sorted into its own directory with its own .env-example file to get you started. There are some variables in the root .env file that will need to be shared across the containers.

Compose Profiles

Every yml file is just a docker-compose service, network configuration, or volume configuration. The services have a profiles array that makes the COMPOSE_PROFILES environment variable work. Those profiles allow you to spin up only the services you specify.

Variable Setup

When setting up the COMPOSE_PROFILES env variable (required), you will have to make some decisions about how you want your containers to be added and what all you want to use in a container. Almost every service (except media servers) has the all profile so if you just want everything in the project, set the COMPOSE_PROFILES to all and move on. Otherwise, you can pick and choose what you want.

Example

  • All containers with the all profile. And a media server (jellyfin as an example)
COMPOSE_PROFILES=all,jellyfin
  • Only a few Containers
COMPOSE_PROFILES=vpn,transmission,sonarr,radarr,jellyfin,dashy,homeAutomation
## homeAutomation spins up 3 containers - see below

Compose Profile Options

These are all possible profile options you can use for the associated services.

ServiceProfiles
Authentikauthentik,all
Bookstack/BookstackDBbookstack, all
Dashydashy, all
Duplicatiduplicati, all
Embyemby
Heimdallheimdall, all
Home Assistanthomeassistant, homeAutomation, all
Jackettjackett
Jellyfinjellyfin
Jellyseerrjellyseerr, all
Komgakomga, all
Lidarrlidarr, all
Mattermostmattermost, all
Mealiemealie, all
Navidromenavidrome, all
PiHolepihole, all
Plexplex
Portainerportainer, all
Prowlarrprowlarr, all, sonarr, radarr, lidarr
Radarrradarr, all
Sonarrsonarr, all
Traefiktraefik, all
Transmissiontransmission, all
Vaultwardenvaultwarden, all
VPNvpn, all
Walloswallos, all
Zigbee2MQTTzigbee2mqtt, homeAutomation, all
ZwaveJSzwavejs, homeAutomation, all