nixpkgs/nixos/modules/services/misc/invidious-router.nix
2024-03-29 19:00:43 +01:00

122 lines
3.3 KiB
Nix

{
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;
};
};
};
}