Files
homelab-opentofu/modules/20-services-apps/jellyfin
2025-08-21 17:42:48 +10:00
..
2025-08-21 17:42:48 +10:00
2025-08-21 17:42:48 +10:00
2025-08-21 17:42:48 +10:00

Jellyfin Module

This module deploys Jellyfin as a Docker container and outputs a service definition to be published via your reverse proxy.

Overview

  • Container: jellyfin (LinuxServer.io)
  • TCP 8096 for HTTP UI; UDP 7359/1900 for discovery/DLNA
  • Config and media volumes mapped via variables

Usage

module "jellyfin" {
  source      = "./modules/20-services-apps/jellyfin"
  volume_path = "/srv/appdata/jellyfin" # host path for Jellyfin config
  data_path   = "/srv/data"             # host media root, mounted as /data
  networks    = [module.media_docker_network.name, module.homelab_docker_network.name]
}

Variables

Variable Description Type Default
volume_path Base directory for Jellyfin config string -
data_path Base directory for media data mounted at /data string -
networks List of networks to attach list(string) []

Outputs

Output Description
service_definition Service definition for integration with networking modules

Service Definition

This module outputs a service definition that is used by the networking modules to expose the service.

{
  name         = "jellyfin"
  primary_port = 8096
  endpoint     = "http://jellyfin:8096"
  subdomains   = ["stream"]
  publish_via  = "reverse_proxy"
  proxied      = false
}

Environment Variables (.env)

This module optionally reads HOSTNAME from .env if you choose to publish a fixed external URL (see commented example in main.tf).

  • HOSTNAME — your public domain (e.g., example.com). Used only if you enable JELLYFIN_PublishedServerUrl.

Note: TZ, PUID, and PGID are provided automatically by the generic docker-service module via system globals.

Data Persistence

  • /config -> ${volume_path}
  • /data -> ${data_path}

Ensure the host paths exist and are writable by the container user.

Dependencies

  • No explicit inter-container dependencies. Healthcheck ensures readiness.
  • UDP ports are exposed for discovery/DLNA.

Integration with Networking Modules

This service is configured to be exposed through the Caddy reverse proxy, set by publish_via = "reverse_proxy".

Example Integration in Main Configuration

# In services/main.tf
module "jellyfin" {
  source      = "${local.module_dir}/20-services-apps/jellyfin"
  volume_path = "${local.volume_host}/jellyfin"
  data_path   = "${local.data_host}/media"
  networks    = [module.media_docker_network.name, module.homelab_docker_network.name]
}

The service definition is exported by the services module as module.services.service_definitions and consumed by networking modules in the root main.tf.