Unverified Commit d9018d87 authored by Gergő Gutyina's avatar Gergő Gutyina Committed by GitHub
Browse files

{shoko-webui,shoko,nixos/shoko}: init (#350065)

parents 349ab129 59406af6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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}

<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
+1 −0
Original line number Diff line number Diff line
@@ -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
+90 −0
Original line number Diff line number Diff line
{
  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
  ];
}
+1 −0
Original line number Diff line number Diff line
@@ -1400,6 +1400,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;

nixos/tests/shoko.nix

0 → 100644
+19 −0
Original line number Diff line number Diff line
{ 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
  ];
}
Loading