Skip to content

luffy.skynet.lan Docker Compose Stack

Overview

This page documents the docker-compose.yml and .env used for the luffy.skynet.lan stack. The Compose file defines the services and the skynetlan network used by the stack.

Start and management

Use the Makefile documented in Makefile doc to start and manage the stack (for example make install, make update, make fixnet).

Services

  • traefik: edge reverse proxy, exposes ports 80 and 443 and mounts its configuration from the host via CONFIGFOLDER/traefik/traefik.toml. The dashboard is routed at traefik.skynet.lan.
  • jellyfin: media server. Important environment variables are PUID, PGID, TZ. Volumes mount CONFIGFOLDER and media folders (TVFOLDER, MOVIEFOLDER). Hardware acceleration is provided via /dev/dri.
  • dozzle: container log viewer; binds the docker socket for container logs.
  • watchtower: container auto-updater; configured to send email notifications using the EMAIL* variables from .env.

Environment variables

The .env file provides runtime values referenced by the compose file:

  • USERID, GROUPID — host UID/GID to run containers as.
  • TIMEZONE — timezone for services.
  • CONFIGFOLDER — host path for application configuration.
  • MOVIEFOLDER, TVFOLDER — media folders mounted into media services.
  • EMAILFROM, EMAILTO, EMAILSERVER, EMAILPASSWORD, EMAILUSERAUTH, EMAILPORT — email settings for Watchtower notifications.

Notes

  • The Compose stack uses Traefik labels for HTTP routing; update hostnames and labels to match your environment.
  • The skynetlan network is explicitly declared; use make fixnet (see the Makefile doc) if the network needs recreation.
  • The raw docker-compose.yml and .env contents are preserved below unchanged.

docker-compose.yml

services:
  traefik:
    image: traefik:v2.11
    container_name: traefik
    ports:
      - "80:80"
      - "443:443"
    networks:
      - skynetlan
    volumes:
      - ${CONFIGFOLDER}/traefik/traefik.toml:/etc/traefik/traefik.toml
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - traefik.enable=true
      - traefik.http.routers.traefik.rule=Host(`traefik.skynet.lan`)
      - traefik.http.routers.traefik.entrypoints=web
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.services.traefik-svc.loadbalancer.server.port=8080
  jellyfin:
    image: linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
      - PUID=${USERID}
      - PGID=${GROUPID}
      - TZ=${TIMEZONE}
      - JELLYFIN_PublishedServerUrl=tsouxtra.skynet.lan
      - LIBVA_DRIVER_NAME=radeonsi
    volumes:
      - ${CONFIGFOLDER}/jellyfin:/config
      - ${TVFOLDER}:/media/tv
      - ${MOVIEFOLDER}:/media/movies
    ports:
      - 7359:7359/udp #optional
    dns: ${CONTAINERS_DNS}
    devices:
      - /dev/dri:/dev/dri
    networks:
      - skynetlan
    labels:
      - traefik.enable=true
      - traefik.http.routers.tsouxtra-rtr.rule=Host(`tsouxtra.skynet.lan`)
      - traefik.http.routers.tsouxtra-rtr.entrypoints=web
      - traefik.http.routers.tsouxtra-rtr.service=tsouxtra-svc
      - traefik.http.services.tsouxtra-svc.loadbalancer.server.port=8096
  dozzle:
    container_name: logsui
    image: amir20/dozzle:latest
    restart: unless-stopped
    networks:
      - skynetlan
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - traefik.enable=true
      - traefik.http.routers.applogs-rtr.rule=Host(`applogs.skynet.lan`)
      - traefik.http.routers.applogs-rtr.entrypoints=web
      - traefik.http.routers.applogs-rtr.service=applogs-svc
      - traefik.http.services.applogs-svc.loadbalancer.server.port=8080
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    networks:
      - skynetlan
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=${TIMEZONE}
      - WATCHTOWER_MONITOR_ONLY=true
      - WATCHTOWER_SCHEDULE=@daily
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_NOTIFICATIONS=email
      - WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG=Docker Container Updates
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${EMAILFROM}
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=${EMAILTO}
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${EMAILSERVER}
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${EMAILPASSWORD}
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${EMAILUSERAUTH}
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${EMAILPORT}

networks:
  skynetlan:

.env

#userdata
USERID=1000
GROUPID=1000
TIMEZONE=Europe/Athens
#File paths
#configuration files for all apps
CONFIGFOLDER=/mnt/data/dockerappdata

#media folders
MOVIEFOLDER=/mnt/poseidon/media/movies
TVFOLDER=/mnt/poseidon/media/tvshows

#Docker update notifications
EMAILFROM=[email protected]
EMAILTO=[email protected]
EMAILSERVER=mail.domain.tld
EMAILPASSWORD=password
EMAILUSERAUTH=[email protected]
EMAILPORT=587