Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2025-09-22 19:08:16 +01:00
parent 248432b132
commit 5017730027
37 changed files with 297 additions and 1721 deletions

View File

@@ -17,7 +17,6 @@
docker-image-grafana-image-renderer = import ./docker/grafana-image-renderer { inherit pkgs; };
docker-image-grafana-to-ntfy = import ./docker/grafana-to-ntfy { inherit pkgs; };
docker-image-grafana = import ./docker/grafana { inherit pkgs; };
docker-image-jellyfin = import ./docker/jellyfin { inherit pkgs; };
docker-image-jellyseerr = import ./docker/jellyseerr { inherit pkgs; };
docker-image-littlelink-server = import ./docker/littlelink-server { inherit pkgs; };
docker-image-mariadb = import ./docker/mariadb { inherit pkgs; };
@@ -28,6 +27,7 @@
docker-image-ntfy = import ./docker/ntfy { inherit pkgs; };
docker-image-oidcwarden = import ./docker/oidcwarden { inherit pkgs; };
docker-image-outline = import ./docker/outline { inherit pkgs; };
docker-image-plex = import ./docker/plex { inherit pkgs; };
docker-image-postgresql = import ./docker/postgresql { inherit pkgs; };
docker-image-prometheus = import ./docker/prometheus { inherit pkgs; };
docker-image-prometheus-fail2ban-exporter = import ./docker/prometheus-fail2ban-exporter {
@@ -52,21 +52,6 @@
docker-image-transmission-protonvpn = import ./docker/transmission-protonvpn { inherit pkgs; };
docker-image-whoami = import ./docker/whoami { inherit pkgs; };
jellyfin-plugin-bookshelf-bin = import ./jellyfin/plugins/bookshelf { inherit pkgs; };
jellyfin-plugin-intro-skipper-bin = import ./jellyfin/plugins/intro-skipper { inherit pkgs; };
jellyfin-plugin-javascript-injector-bin = import ./jellyfin/plugins/javascript-injector {
inherit pkgs;
};
jellyfin-plugin-opensubtitles-bin = import ./jellyfin/plugins/opensubtitles { inherit pkgs; };
jellyfin-plugin-playbackreporting-bin = import ./jellyfin/plugins/playbackreporting {
inherit pkgs;
};
jellyfin-plugin-reports-bin = import ./jellyfin/plugins/reports { inherit pkgs; };
jellyfin-plugin-sso-bin = import ./jellyfin/plugins/sso { inherit pkgs; };
jellyfin-plugin-subtitleextract-bin = import ./jellyfin/plugins/subtitleextract { inherit pkgs; };
jellyfin-plugin-tmdbboxsets-bin = import ./jellyfin/plugins/tmdbboxsets { inherit pkgs; };
jellyfin-plugin-tvdb-bin = import ./jellyfin/plugins/tvdb { inherit pkgs; };
littlelink-server = import ./littlelink-server { inherit pkgs; };
obsidian-plugin-better-word-count = import ./obsidian/plugins/better-word-count { inherit pkgs; };

View File

@@ -4,7 +4,7 @@ set -o errexit
set -o nounset
atticd "$@" &
PID=$!
PID="$!"
if [ -f /etc/attic/post-start.sh ]; then
# shellcheck disable=SC1091

View File

@@ -1,77 +0,0 @@
{ pkgs, ... }:
let
jellyfin = pkgs.jellyfin.overrideAttrs (_: {
makeWrapperArgs = [
"--add-flags"
"--ffmpeg=${pkgs.jellyfin-ffmpeg}/bin/ffmpeg"
];
});
jellyfin-web = pkgs.runCommandLocal "jellyfin-web" { } ''
mkdir -p $out/var/www
cp -r ${pkgs.jellyfin-web}/share/jellyfin-web $out/var/www/jellyfin
'';
entrypoint = pkgs.writeTextFile {
name = "entrypoint";
executable = true;
destination = "/bin/entrypoint";
text = builtins.readFile ./entrypoint.sh;
};
in
pkgs.dockerTools.buildImage {
name = "jellyfin";
fromImage = pkgs.docker-image-base;
copyToRoot = pkgs.buildEnv {
name = "root";
paths =
with pkgs;
[
entrypoint
jellyfin
jellyfin-web
jellyfin-ffmpeg
curl
jq
]
++ (with jellyfinPlugins; [
bookshelf
intro-skipper
javascript-injector
opensubtitles
playbackreporting
reports
sso
subtitleextract
tmdbboxsets
tvdb
]);
pathsToLink = [
"/bin"
"/lib"
"/var"
];
};
config = {
Entrypoint = [ "entrypoint" ];
ExposedPorts = {
"8096/tcp" = { };
};
WorkingDir = "/var/lib/jellyfin";
Volumes = {
"/etc/jellyfin" = { };
"/var/lib/jellyfin/data" = { };
"/var/lib/jellyfin/metadata" = { };
"/var/lib/jellyfin/root" = { };
"/var/log/jellyfin" = { };
"/tmp/jellyfin" = { };
};
Env = [
# FIXME: https://github.com/NixOS/nixpkgs/issues/176081
"FONTCONFIG_FILE=${pkgs.fontconfig.out}/etc/fonts/fonts.conf"
"FONTCONFIG_PATH=${pkgs.fontconfig.out}/etc/fonts/"
];
};
}

View File

@@ -1,31 +0,0 @@
#!/usr/bin/env sh
set -o errexit
set -o nounset
start() {
jellyfin \
-w /var/www/jellyfin \
-c /etc/jellyfin \
-d /var/lib/jellyfin \
-l /var/log/jellyfin \
-C /tmp/jellyfin \
"$@" &
PID=$!
}
start "$@"
if [ -f /etc/jellyfin/setup.sh ]; then
# shellcheck disable=SC1091
. /etc/jellyfin/setup.sh
kill "$PID"
wait "$PID" 2>/dev/null || true
start "$@"
fi
trap 'kill -INT "$PID"' INT TERM
wait "$PID"
exit $?

View File

@@ -34,6 +34,6 @@ fi
trap 'kill -QUIT "$PID"' INT TERM
mariadbd --user=root --datadir="$DATADIR" "$@" &
PID=$!
PID="$!"
wait "$PID"
exit $?

View File

@@ -34,6 +34,6 @@ fi
trap 'kill -QUIT "$PID"' INT TERM
mysqld --user=root --datadir="$DATADIR" "$@" &
PID=$!
PID="$!"
wait "$PID"
exit $?

View File

@@ -0,0 +1,48 @@
{ pkgs, ... }:
let
entrypoint = pkgs.writeTextFile {
name = "entrypoint";
executable = true;
destination = "/bin/entrypoint";
text = builtins.readFile ./entrypoint.sh;
};
in
pkgs.dockerTools.buildImage {
name = "plex";
fromImage = pkgs.docker-image-base;
copyToRoot = pkgs.buildEnv {
name = "root";
paths = with pkgs; [
entrypoint
util-linux
plex
xmlstarlet
curl
jq
];
pathsToLink = [
"/bin"
"/lib"
"/var"
"/usr"
];
};
config = {
Entrypoint = [ "entrypoint" ];
ExposedPorts = {
"32400/tcp" = { };
};
WorkingDir = "/var/lib/plex";
Volumes = {
"/var/lib/plex" = { };
"/tmp/plex" = { };
};
Env = [
"LD_LIBRARY_PATH=/run/opengl-driver/lib"
"PLEX_DATADIR=/var/lib/plex"
"PLEX_MEDIA_SERVER_TMPDIR=/tmp/plex"
];
};
}

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env sh
set -o errexit
set -o nounset
PREFERENCES="/var/lib/plex/Plex Media Server/Preferences.xml"
TEMPLATE_PREFERENCES="/etc/plex/Preferences.xml"
getPref() {
xmlstarlet sel -t -v "/Preferences/@$1" "$PREFERENCES" 2>/dev/null || true
}
setPref() {
name="$1"
value="$2"
xmlstarlet ed --inplace \
-d "/Preferences/@${name}" \
-i "/Preferences" -t attr -n "${name}" -v "${value}" \
"$PREFERENCES"
}
mkdir -p "$(dirname "$PREFERENCES")"
if [ ! -f "$PREFERENCES" ]; then
echo '<?xml version="1.0" encoding="utf-8"?><Preferences/>' > "$PREFERENCES"
fi
if [ -f "$TEMPLATE_PREFERENCES" ]; then
ATTRS="$(xmlstarlet sel -t -m "/Preferences/@*" -v "concat(name(),'=',.)" -n "$TEMPLATE_PREFERENCES")"
if [ -n "$ATTRS" ]; then
set --
while IFS='=' read -r name value; do
[ -z "$name" ] && continue
set -- "$@" -d "/Preferences/@${name}"
set -- "$@" -i "/Preferences" -t attr -n "${name}" -v "${value}"
done <<EOF
$ATTRS
EOF
if [ "$#" -gt 0 ]; then
xmlstarlet ed --inplace "$@" "$PREFERENCES"
fi
fi
fi
rm -f "/var/lib/plex/Plex Media Server/plexmediaserver.pid"
plexmediaserver &
PID="$!"
trap 'kill -QUIT "$PID"' INT TERM
wait "$PID"
exit $?

View File

@@ -32,7 +32,7 @@ set_config_value "InstanceName" "${INSTANCE_NAME:-Prowlarr}"
set_config_value "AnalyticsEnabled" "False"
Prowlarr -data=/var/lib/prowlarr -nobrowser "$@" &
PID=$!
PID="$!"
if [ -f /etc/prowlarr/post-start.sh ]; then
# shellcheck disable=SC1091

View File

@@ -32,7 +32,7 @@ set_config_value "InstanceName" "${INSTANCE_NAME:-Radarr}"
set_config_value "AnalyticsEnabled" "False"
Radarr -data=/var/lib/radarr -nobrowser "$@" &
PID=$!
PID="$!"
if [ -f /etc/radarr/post-start.sh ]; then
# shellcheck disable=SC1091

View File

@@ -32,7 +32,7 @@ set_config_value "InstanceName" "${INSTANCE_NAME:-Sonarr}"
set_config_value "AnalyticsEnabled" "False"
Sonarr -data=/var/lib/sonarr -nobrowser "$@" &
PID=$!
PID="$!"
if [ -f /etc/sonarr/post-start.sh ]; then
# shellcheck disable=SC1091

View File

@@ -68,7 +68,7 @@ transmission-daemon -f \
--bind-address-ipv4 "$BIND_IP" \
--bind-address-ipv6 "::1" \
"$@" > "$PIPE" 2>&1 &
PID=$!
PID="$!"
CAT_PIPE=$(mktemp -u)
GREP_PIPE=$(mktemp -u)
@@ -108,7 +108,7 @@ rpc_url="http://127.0.0.1:9091${rpc_path}rpc/"
sleep 45
done
) &
NATPMP_PID=$!
NATPMP_PID="$!"
# shellcheck disable=SC2317
cleanup() {

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-bookshelf-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "bookshelf";
version = "12";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-bookshelf/releases/download/v${finalAttrs.version}/bookshelf_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-P85SLXaJuFIv9AmAE6mPbxZDMBhqEt+88dZiPUKu2iQ=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/bookshelf
'';
})

View File

@@ -1,22 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-intro-skipper-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "intro-skipper";
version = "10.10/v1.10.10.23";
src =
let
parts = pkgs.lib.strings.splitString "/" finalAttrs.version;
full = builtins.elemAt parts 1;
in
pkgs.fetchzip {
url = "https://github.com/intro-skipper/intro-skipper/releases/download/${finalAttrs.version}/intro-skipper-${full}.zip";
sha256 = "sha256-r+syY/AlErws1xVkkiWm51aI+QxtefdLDc/sWC7oVo8=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/intro-skipper
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-javascript-injector-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "javascript-injector";
version = "2.0.0.0";
src = pkgs.fetchzip {
url = "https://github.com/n00bcodr/Jellyfin-JavaScript-Injector/releases/download/${finalAttrs.version}/javascript-injector-${finalAttrs.version}.zip";
sha256 = "sha256-BzT4Hk4ulHsnkV9eKyy2oK6su98Am0x6rydfjAY/AWY=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/javascript-injector
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-opensubtitles-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "opensubtitles";
version = "20";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-opensubtitles/releases/download/v${finalAttrs.version}/open-subtitles_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-U17wQn32GB4nh05ExYJhzRw4nDvYOCB4EJtDoaaUnjI=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/opensubtitles
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-playbackreporting-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "playbackreporting";
version = "16";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-playbackreporting/releases/download/v${finalAttrs.version}/playback-reporting_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-UrWxS0CpeeW4nYNyRNxnK0jqiAqXwfLv3YfFokfVH0A=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/playbackreporting
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-reports-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "reports";
version = "17";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-reports/releases/download/v${finalAttrs.version}/reports_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-kN1UDhx5/1sw3PO5co2YkfbZNiDj56F2YAT8S/0EdZM=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/reports
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-sso-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "sso";
version = "3.5.2.4";
src = pkgs.fetchzip {
url = "https://github.com/9p4/jellyfin-plugin-sso/releases/download/v${finalAttrs.version}/sso-authentication_${finalAttrs.version}.zip";
sha256 = "sha256-e+w5m6/7vRAynStDj34eBexfCIEgDJ09huHzi5gQEbo=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/sso
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-subtitleextract-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "subtitleextract";
version = "4";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-subtitleextract/releases/download/v${finalAttrs.version}/subtitle-extract_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-FstPWUYsZg416DNshIV4yOvbg6U21cRxKse8hITUyBY=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/subtitleextract
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-tmdbboxsets-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "tmdbboxsets";
version = "11";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-tmdbboxsets/releases/download/v${finalAttrs.version}/tmdb-box-sets_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-cO3hpjFacS62kdXn8ebS7oMtFT9LJAt8Q4b36aSxwCQ=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/tmdbboxsets
'';
})

View File

@@ -1,17 +0,0 @@
{ pkgs, ... }:
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-tvdb-bin
pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "tvdb";
version = "19";
src = pkgs.fetchzip {
url = "https://github.com/jellyfin/jellyfin-plugin-tvdb/releases/download/v${finalAttrs.version}/thetvdb_${finalAttrs.version}.0.0.0.zip";
sha256 = "sha256-011wpVwQy562XDAwAQ44GJTbu/ESHcyo5F/wrtNBAcs=";
stripRoot = false;
};
installPhase = ''
mkdir -p $out/var/lib/jellyfin/plugins
cp -r $src $out/var/lib/jellyfin/plugins/tvdb
'';
})