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
parent
226a6bef46
commit
a2b3f9b5b9
3
hosts
3
hosts
|
@ -69,6 +69,9 @@ logs0.pyrocufflink.blue
|
||||||
|
|
||||||
[home-assistant]
|
[home-assistant]
|
||||||
|
|
||||||
|
[jellyfin]
|
||||||
|
file0.pyrocufflink.blue
|
||||||
|
|
||||||
[jenkins-slave]
|
[jenkins-slave]
|
||||||
|
|
||||||
[journal2ntfy:children]
|
[journal2ntfy:children]
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: jellyfin
|
||||||
|
roles:
|
||||||
|
- role: apache
|
||||||
|
tags: apache
|
||||||
|
- jellyfin
|
|
@ -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 }}
|
|
@ -0,0 +1,9 @@
|
||||||
|
- name: reload systemd
|
||||||
|
systemd:
|
||||||
|
daemon_reload: true
|
||||||
|
|
||||||
|
- name: restart jellyfin
|
||||||
|
systemd:
|
||||||
|
name: jellyfin
|
||||||
|
state: restarted
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
- block:
|
||||||
|
- import_tasks: install.yml
|
||||||
|
tags:
|
||||||
|
- install
|
||||||
|
- import_tasks: deploy.yml
|
||||||
|
- import_tasks: httpd-proxy.yml
|
||||||
|
tags:
|
||||||
|
- jellyfin
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
JELLYFIN_PublishedServerUrl={{ jellyfin_server_url }}
|
|
@ -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>
|
Loading…
Reference in New Issue