diff --git a/nixos/doc/manual/release-notes/rl-2605.section.md b/nixos/doc/manual/release-notes/rl-2605.section.md index fc7801aa0c1c..b5207e064161 100644 --- a/nixos/doc/manual/release-notes/rl-2605.section.md +++ b/nixos/doc/manual/release-notes/rl-2605.section.md @@ -32,6 +32,8 @@ - [Komodo Periphery](https://github.com/moghtech/komodo), a multi-server Docker and Git deployment agent by Komodo. Available as [services.komodo-periphery](#opt-services.komodo-periphery.enable). +- [Shoko](https://shokoanime.com), an anime management system. Available as [services.shoko](#opt-services.shoko.enable). + ## Backward Incompatibilities {#sec-release-26.05-incompatibilities} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index f0beafd77364..116f82098f35 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -942,6 +942,7 @@ ./services/misc/servarr/sonarr.nix ./services/misc/servarr/whisparr.nix ./services/misc/serviio.nix + ./services/misc/shoko.nix ./services/misc/sickbeard.nix ./services/misc/snapper.nix ./services/misc/soft-serve.nix diff --git a/nixos/modules/services/misc/shoko.nix b/nixos/modules/services/misc/shoko.nix new file mode 100644 index 000000000000..9183e14a5919 --- /dev/null +++ b/nixos/modules/services/misc/shoko.nix @@ -0,0 +1,90 @@ +{ + lib, + config, + pkgs, + ... +}: +let + inherit (lib) + mkOption + types + mkIf + mkEnableOption + mkPackageOption + getExe + optionalString + ; + + cfg = config.services.shoko; +in +{ + options = { + services.shoko = { + enable = mkEnableOption "Shoko"; + + package = mkPackageOption pkgs "shoko" { }; + webui = mkPackageOption pkgs "shoko-webui" { nullable = true; }; + plugins = mkOption { + type = types.listOf types.package; + default = [ ]; + description = '' + The plugins to install. + + Note that if there are plugins installed imperatively when this + option is used, they will be deleted. + ''; + }; + + openFirewall = mkOption { + type = types.bool; + default = false; + description = '' + Open ports in the firewall for the ShokoAnime api and web interface. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ 8111 ]; + + systemd.services.shoko = { + description = "Shoko Server"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + # Not that it should be done, but this makes it easier to override the + # StateDirectory option, if the user really wants to. + environment.SHOKO_HOME = "/var/lib/${config.systemd.services.shoko.serviceConfig.StateDirectory}"; + + # The rm calls are here, because it's pretty easy to get into a situation + # where those directories are created imperatively, in which case the ln + # calls (along with the service) would just fail. + preStart = + optionalString (cfg.webui != null) '' + rm -rf "$STATE_DIRECTORY/webui" + ln -s '${cfg.webui}' "$STATE_DIRECTORY/webui" + '' + + optionalString (cfg.plugins != [ ]) '' + rm -rf "$STATE_DIRECTORY/plugins" + ln -s '${pkgs.linkFarmFromDrvs cfg.plugins}' "$STATE_DIRECTORY/plugins" + ''; + + serviceConfig = { + Type = "simple"; + + DynamicUser = true; + StateDirectory = "shoko"; + StateDirectoryMode = 750; + + ExecStart = getExe cfg.package; + Restart = "on-failure"; + }; + }; + }; + + meta.maintainers = with lib.maintainers; [ + diniamo + nanoyaki + ]; +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 58cddfabe0b7..a07f5887f72f 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1401,6 +1401,7 @@ in sharkey = runTest ./web-apps/sharkey.nix; shattered-pixel-dungeon = runTest ./shattered-pixel-dungeon.nix; shiori = runTest ./shiori.nix; + shoko = runTest ./shoko.nix; signal-desktop = runTest ./signal-desktop.nix; silverbullet = runTest ./silverbullet.nix; simple = runTest ./simple.nix; diff --git a/nixos/tests/shoko.nix b/nixos/tests/shoko.nix new file mode 100644 index 000000000000..2d464d45d8ab --- /dev/null +++ b/nixos/tests/shoko.nix @@ -0,0 +1,19 @@ +{ lib, ... }: +{ + name = "Shoko"; + + nodes.machine = { + services.shoko.enable = true; + }; + + testScript = '' + machine.wait_for_unit("shoko.service") + machine.wait_for_open_port(8111) + machine.succeed("curl --fail http://localhost:8111") + ''; + + meta.maintainers = with lib.maintainers; [ + diniamo + nanoyaki + ]; +}