From ff98822668d1586cf079474b0204a506b01f8b39 Mon Sep 17 00:00:00 2001 From: Danilo Reyes Date: Thu, 28 Mar 2024 13:34:04 -0600 Subject: [PATCH] metube and jira --- server/docker.nix | 12 ++++ server/nginx.nix | 152 +++++++++++++++++++++++---------------------- server/servers.nix | 29 ++++----- 3 files changed, 105 insertions(+), 88 deletions(-) diff --git a/server/docker.nix b/server/docker.nix index 030f010..c063b4e 100644 --- a/server/docker.nix +++ b/server/docker.nix @@ -41,6 +41,18 @@ # }; # extraOptions = [ "--cap-add" "MKNOD" ]; # }; + # metube = { + # image = "ghcr.io/alexta69/metube"; + # ports = [ "8881:8081" ]; + # volumes = [ + # "/var/lib/docker-configs/metube:/downloads" + # "/home/jawz/.local/share/cookies.txt:/cookies.txt" + # ]; + # environment = { + # TZ = "America/Mexico_City"; + # YTDL_OPTIONS = ''{"cookiefile":"/cookies.txt"}''; + # }; + # }; vocechat = { image = "privoce/vocechat-server:latest"; ports = [ "3001:3000" ]; diff --git a/server/nginx.nix b/server/nginx.nix index 704c74c..2cb7f4f 100644 --- a/server/nginx.nix +++ b/server/nginx.nix @@ -22,6 +22,8 @@ let scrobblePort = 9078; malojaPort = 42010; darkwirePort = 3001; + jiraPort = 8091; + metatubePort = 8881; bazarrPort = config.services.bazarr.listenPort; kavitaPort = config.services.kavita.port; vaultPort = config.services.vaultwarden.config.ROCKET_PORT; @@ -79,6 +81,8 @@ in { "tracker.${domain}" = proxy ryotPort // { }; "scrobble.${domain}" = proxy scrobblePort // { }; "maloja.${domain}" = proxy malojaPort // { }; + "jira.${domain}" = proxy jiraPort // { }; + "bajameesta.${domain}" = proxy metatubePort // { }; "qampqwn4wprhqny8h8zj.${domain}" = proxy secretFlamePort // { }; "xfwmrle6h6skqujbeizw.${domain}" = proxy qbitPort // { }; "audiobooks.${domain}" = base { @@ -121,86 +125,86 @@ in { ''; }; }; - # "flix.${domain}" = { - # forceSSL = true; - # enableACME = true; - # http2 = true; - # extraConfig = '' - # # use a variable to store the upstream proxy - # # in this example we are using a hostname which is resolved via DNS - # # (if you aren't using DNS remove the resolver line and change the variable to point to an IP address - # resolver ${localhost} valid=30; + "flix.${domain}" = { + forceSSL = true; + enableACME = true; + http2 = true; + extraConfig = '' + # use a variable to store the upstream proxy + # in this example we are using a hostname which is resolved via DNS + # (if you aren't using DNS remove the resolver line and change the variable to point to an IP address + resolver ${localhost} valid=30; - # location = / { - # return 302 http://$host/web/; - # #return 302 https://$host/web/; - # } + location = / { + return 302 http://$host/web/; + #return 302 https://$host/web/; + } - # location = /web/ { - # # Proxy main Jellyfin traffic - # proxy_pass http://${localhost}:${ - # toString (jellyfinPort) - # }/web/index.html; - # proxy_set_header Host $host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; - # proxy_set_header X-Forwarded-Protocol $scheme; - # proxy_set_header X-Forwarded-Host $http_host; - # } - # ''; - # locations = { - # "/" = { - # proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; - # proxyWebsockets = true; - # }; - # "/socket" = { - # proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; - # extraConfig = '' - # proxy_http_version 1.1; - # proxy_set_header Upgrade $http_upgrade; - # proxy_set_header Connection "upgrade"; - # ''; - # }; - # "~ /Items/(.*)/Images" = { - # proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; - # extraConfig = '' - # proxy_cache jellyfin; - # proxy_cache_revalidate on; - # proxy_cache_lock on; - # ''; - # }; - # "~* ^/Videos/(.*)/(?!live)" = { - # proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; - # extraConfig = '' - # # Set size of a slice (this amount will be always requested from the backend by nginx) - # # Higher value means more latency, lower more overhead - # # This size is independent of the size clients/browsers can request - # # slice 2m; + location = /web/ { + # Proxy main Jellyfin traffic + proxy_pass http://${localhost}:${ + toString (jellyfinPort) + }/web/index.html; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Protocol $scheme; + proxy_set_header X-Forwarded-Host $http_host; + } + ''; + locations = { + "/" = { + proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; + proxyWebsockets = true; + }; + "/socket" = { + proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; + extraConfig = '' + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + ''; + }; + "~ /Items/(.*)/Images" = { + proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; + extraConfig = '' + proxy_cache jellyfin; + proxy_cache_revalidate on; + proxy_cache_lock on; + ''; + }; + "~* ^/Videos/(.*)/(?!live)" = { + proxyPass = "http://${localhost}:${toString (jellyfinPort)}"; + extraConfig = '' + # Set size of a slice (this amount will be always requested from the backend by nginx) + # Higher value means more latency, lower more overhead + # This size is independent of the size clients/browsers can request + # slice 2m; - # proxy_cache jellyfin-videos; - # proxy_cache_valid 200 206 301 302 30d; - # proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires; - # proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; - # proxy_connect_timeout 15s; - # proxy_http_version 1.1; - # proxy_set_header Connection ""; - # # Transmit slice range to the backend - # proxy_set_header Range 2m; + proxy_cache jellyfin-videos; + proxy_cache_valid 200 206 301 302 30d; + proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires; + proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; + proxy_connect_timeout 15s; + proxy_http_version 1.1; + proxy_set_header Connection ""; + # Transmit slice range to the backend + proxy_set_header Range 2m; - # # This saves bandwidth between the proxy and jellyfin, as a file is only downloaded one time instead of multiple times when multiple clients want to at the same time - # # The first client will trigger the download, the other clients will have to wait until the slice is cached - # # Esp. practical during SyncPlay - # proxy_cache_lock on; - # proxy_cache_lock_age 60s; + # This saves bandwidth between the proxy and jellyfin, as a file is only downloaded one time instead of multiple times when multiple clients want to at the same time + # The first client will trigger the download, the other clients will have to wait until the slice is cached + # Esp. practical during SyncPlay + proxy_cache_lock on; + proxy_cache_lock_age 60s; - # proxy_cache_key "jellyvideo$uri?MediaSourceId=$arg_MediaSourceId&VideoCodec=$arg_VideoCodec&AudioCodec=$arg_AudioCodec&AudioStreamIndex=$arg_AudioStreamIndex&VideoBitrate=$arg_VideoBitrate&AudioBitrate=$arg_AudioBitrate&SubtitleMethod=$arg_SubtitleMethod&TranscodingMaxAudioChannels=$arg_TranscodingMaxAudioChannels&RequireAvc=$arg_RequireAvc&SegmentContainer=$arg_SegmentContainer&MinSegments=$arg_MinSegments&BreakOnNonKeyFrames=$arg_BreakOnNonKeyFrames&h264-profile=$h264Profile&h264-level=$h264Level&slicerange=2m"; + proxy_cache_key "jellyvideo$uri?MediaSourceId=$arg_MediaSourceId&VideoCodec=$arg_VideoCodec&AudioCodec=$arg_AudioCodec&AudioStreamIndex=$arg_AudioStreamIndex&VideoBitrate=$arg_VideoBitrate&AudioBitrate=$arg_AudioBitrate&SubtitleMethod=$arg_SubtitleMethod&TranscodingMaxAudioChannels=$arg_TranscodingMaxAudioChannels&RequireAvc=$arg_RequireAvc&SegmentContainer=$arg_SegmentContainer&MinSegments=$arg_MinSegments&BreakOnNonKeyFrames=$arg_BreakOnNonKeyFrames&h264-profile=$h264Profile&h264-level=$h264Level&slicerange=2m"; - # # add_header X-Cache-Status $upstream_cache_status; # This is only for debugging cache - # ''; - # }; - # }; - # }; + # add_header X-Cache-Status $upstream_cache_status; # This is only for debugging cache + ''; + }; + }; + }; # ${config.services.nextcloud.hostName} = { # forceSSL = true; # enableACME = true; diff --git a/server/servers.nix b/server/servers.nix index 6af9baf..7292bd2 100644 --- a/server/servers.nix +++ b/server/servers.nix @@ -78,8 +78,9 @@ in { # sonarr = base // { package = pkgs.sonarr; }; # radarr = base // { package = pkgs.radarr; }; # bazarr = base // { }; - # jellyfin = base // { }; + jellyfin = base // { }; # prowlarr.enable = true; + jira.enable = true; microbin = { enable = true; settings = { @@ -234,19 +235,19 @@ in { }; systemd = { services = { - nextcloud-cronjob = let - jawzNextcloudCronjob = pkgs.writeScriptBin "nextcloud-cronjob" - (builtins.readFile ../scripts/nextcloud-cronjob.sh); - in { - description = "Runs various nextcloud-related cronjobs"; - wantedBy = [ "multi-user.target" ]; - path = [ pkgs.bash jawzNextcloudCronjob ]; - serviceConfig = { - Restart = "on-failure"; - RestartSec = 30; - ExecStart = "${jawzNextcloudCronjob}/bin/nextcloud-cronjob"; - }; - }; + # nextcloud-cronjob = let + # jawzNextcloudCronjob = pkgs.writeScriptBin "nextcloud-cronjob" + # (builtins.readFile ../scripts/nextcloud-cronjob.sh); + # in { + # description = "Runs various nextcloud-related cronjobs"; + # wantedBy = [ "multi-user.target" ]; + # path = [ pkgs.bash jawzNextcloudCronjob ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${jawzNextcloudCronjob}/bin/nextcloud-cronjob"; + # }; + # }; }; timers = { # nextcloud-cronjob = {