jellyfin: Deploy Jellyfin media server

Jellyfin is a multimedia library manager. Clients can browse and stream
music, movies, and TV shows from the server and play them locally
(including in the browser).
step-ssh
Dustin 2023-09-12 13:38:35 -05:00
parent 226a6bef46
commit a2b3f9b5b9
11 changed files with 216 additions and 0 deletions

3
hosts
View File

@ -69,6 +69,9 @@ logs0.pyrocufflink.blue
[home-assistant]
[jellyfin]
file0.pyrocufflink.blue
[jenkins-slave]
[journal2ntfy:children]

5
jellyfin.yml Normal file
View File

@ -0,0 +1,5 @@
- hosts: jellyfin
roles:
- role: apache
tags: apache
- jellyfin

View File

@ -0,0 +1,13 @@
jellyfin_version: latest
jellyfin_container_image: docker.io/jellyfin/jellyfin
jellyfin_media_dirs:
- /srv/cifs/Music
- /srv/cifs/Movies
- /srv/cifs/TV Shows
jellyfin_server_name: jellyfin.pyrocufflink.blue
jellyfin_server_url: https://{{ jellyfin_server_name }}
jellyfin_ssl_certificate: >-
{{ apache_ssl_certificate }}
jellyfin_ssl_certificate_key: >-
{{ apache_ssl_certificate_key }}

View File

@ -0,0 +1,9 @@
- name: reload systemd
systemd:
daemon_reload: true
- name: restart jellyfin
systemd:
name: jellyfin
state: restarted

View File

@ -0,0 +1,79 @@
- name: ensure jellyfin group exists
group:
name: jellyfin
gid: 201
system: true
state: present
tags:
- user
- group
- name: ensure jellyfin user exists
user:
name: jellyfin
uid: 201
group: jellyfin
system: true
home: /
createhome: false
state: present
tags:
- user
- name: ensure jellyfin cache directory exists
file:
path: /var/cache/jellyfin
owner: jellyfin
group: jellyfin
mode: u=rwx,go=
state: directory
tags:
- datadir
- name: ensure jellyfin data directory exists
file:
path: /var/lib/jellyfin
owner: jellyfin
group: jellyfin
mode: u=rwx,og=rx
state: directory
tags:
- datadir
- name: ensure jellyfin environment is configured
template:
src: jellyfin.env.j2
dest: /etc/sysconfig/jellyfin
owner: root
group: root
mode: u=rw,go=
tags:
- config
- name: ensure jellyfin.container systemd unit exists
template:
src: jellyfin.container.j2
dest: /etc/containers/systemd/jellyfin.container
owner: root
group: root
mode: u=rw,go=r
notify:
- reload systemd
- restart jellyfin
tags:
- systemd
- container
- name: flush handlers
meta: flush_handlers
- name: ensure jellyfin starts at boot
systemd:
name: jellyfin
enabled: true
tags:
- service
- name: ensure jellyfin is running
systemd:
name: jellyfin
state: started
tags:
- service

View File

@ -0,0 +1,19 @@
- name: ensure apache is configured to proxy for jellyfin
template:
src: jellyfin.httpd.conf.j2
dest: /etc/httpd/conf.d/jellyfin.conf
owner: root
group: root
mode: u=rw,go=r
notify:
- reload httpd
tags:
- apache
- name: ensure selinux is configured for apache reverse proxy
seboolean:
name: httpd_can_network_connect
state: true
persistent: true
tags:
- selinux

View File

@ -0,0 +1,12 @@
- name: ensure podman is installed
package:
name:
- container-selinux
- podman
state: present
- name: ensure jellyfin container image is present
podman_image:
name: '{{ jellyfin_container_image }}:{{ jellyfin_version }}'
state: present

View File

@ -0,0 +1,9 @@
- block:
- import_tasks: install.yml
tags:
- install
- import_tasks: deploy.yml
- import_tasks: httpd-proxy.yml
tags:
- jellyfin

View File

@ -0,0 +1,39 @@
[Unit]
Description=Jellyfin Media Server
Wants=network.target
After=network.target
[Container]
Image={{ jellyfin_container_image }}:{{ jellyfin_version }}
#UserNS=keep-id
User=201
Group=201
EnvironmentFile=/etc/sysconfig/jellyfin
Volume=/var/lib/jellyfin:/config:rw,z
Volume=/var/cache/jellyfin:/cache:rw,z
{% for path in jellyfin_media_dirs %}
Volume={{ path }}:/media/{{ path | basename }}:ro
{% endfor %}
Network=host
NoNewPrivileges=yes
[Service]
#MemoryDenyWriteExecute=yes
PrivateTmp=yes
ProtectClock=yes
ProtectHome=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectProc=invisible
ProtectSystem=strict
ReadWritePaths=/var/lib/jellyfin
ReadWritePaths=/var/lib/containers/storage
ReadWritePaths=/var/cache/jellyfin
RestrictRealtime=yes
RestrictSUIDSGID=yes
SuccessExitStatus=0 143
UMask=0077
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1 @@
JELLYFIN_PublishedServerUrl={{ jellyfin_server_url }}

View File

@ -0,0 +1,27 @@
<VirtualHost _default_:80>
ServerName {{ jellyfin_server_name }}
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule /.* https://%{SERVER_NAME}$0 [R=301,L]
</VirtualHost>
<VirtualHost _default_:443>
ServerName {{ jellyfin_server_name }}
SSLCertificateFile {{ jellyfin_ssl_certificate }}
SSLCertificateKeyFile {{ jellyfin_ssl_certificate_key }}
SSLCertificateChainFile {{ jellyfin_ssl_certificate }}
ProxyPreserveHost On
ProxyRequests Off
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8096/$1 [P,L]
RewriteRule /(.*) http://localhost:8096/$1 [P,L]
ProxyPassReverse / http://localhost:8096/
Header always set \
Strict-Transport-Security "max-age=63072000; includeSubDomains"
</VirtualHost>