From 19b2b8046dbefaf3e92d3ae6f9fb6119557cd44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Silas=20Sch=C3=B6ffel?= Date: Thu, 28 Mar 2024 23:56:37 +0100 Subject: [PATCH] nixos/invidious-router: init module --- nixos/modules/module-list.nix | 1 + .../services/misc/invidious-router.nix | 121 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 nixos/modules/services/misc/invidious-router.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 90b37e878312..9dd41ff8c778 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -712,6 +712,7 @@ ./services/misc/homepage-dashboard.nix ./services/misc/ihaskell.nix ./services/misc/input-remapper.nix + ./services/misc/invidious-router.nix ./services/misc/irkerd.nix ./services/misc/jackett.nix ./services/misc/jellyfin.nix diff --git a/nixos/modules/services/misc/invidious-router.nix b/nixos/modules/services/misc/invidious-router.nix new file mode 100644 index 000000000000..01ef18dad535 --- /dev/null +++ b/nixos/modules/services/misc/invidious-router.nix @@ -0,0 +1,121 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.services.invidious-router; + settingsFormat = pkgs.formats.yaml {}; + configFile = settingsFormat.generate "config.yaml" cfg.settings; +in { + meta.maintainers = [lib.maintainers.s1ls]; + + options.services.invidious-router = { + enable = lib.mkEnableOption "Enables the invidious-router service"; + port = lib.mkOption { + type = lib.types.port; + default = 8050; + description = lib.mdDoc '' + Port to bind to. + ''; + }; + address = lib.mkOption { + type = lib.types.str; + default = "127.0.0.1"; + description = lib.mdDoc '' + Address on which invidious-router should listen on. + ''; + }; + settings = lib.mkOption { + type = lib.types.submodule { + freeformType = settingsFormat.type; + }; + default = { + app = { + listen = "127.0.0.1:8050"; + enable_youtube_fallback = false; + reload_instance_list_interval = "60s"; + }; + api = { + enabled = true; + url = "https://api.invidious.io/instances.json"; + filter_regions = true; + allowed_regions = [ + "AT" + "DE" + "CH" + ]; + }; + healthcheck = { + path = "/"; + allowed_status_codes = [ + 200 + ]; + timeout = "1s"; + interval = "10s"; + filter_by_response_time = { + enabled = true; + qty_of_top_results = 3; + }; + minimum_ratio = 0.2; + remove_no_ratio = true; + text_not_present = "YouTube is currently trying to block Invidious instances"; + }; + }; + description = lib.mdDoc '' + Configuration for invidious-router. + Check https://gitlab.com/gaincoder/invidious-router#configuration + for configuration options. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.invidious-router; + defaultText = lib.literalExpression "pkgs.invidious-router"; + description = lib.mdDoc '' + The invidious-router package to use. + ''; + }; + nginx = { + enable = lib.mkEnableOption (lib.mdDoc '' + Automatic nginx proxy configuration + ''); + domain = lib.mkOption { + type = lib.types.str; + example = "invidious-router.example.com"; + description = lib.mdDoc '' + The domain on which invidious-router should be served. + ''; + }; + extraDomains = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + description = lib.mdDoc '' + Additional domains to serve invidious-router on. + ''; + }; + }; + }; + config = lib.mkIf cfg.enable { + systemd.services.invidious-router = { + wantedBy = ["multi-user.target"]; + serviceConfig = { + Restart = "on-failure"; + ExecStart = "${lib.getExe cfg.package} --configfile ${configFile}"; + DynamicUser = "yes"; + }; + }; + + services.nginx.virtualHosts = lib.mkIf cfg.nginx.enable { + ${cfg.nginx.domain} = { + locations."/" = { + recommendedProxySettings = true; + proxyPass = "http://${cfg.address}:${toString cfg.port}"; + }; + enableACME = true; + forceSSL = true; + serverAliases = cfg.nginx.extraDomains; + }; + }; + }; +}