Unverified Commit 778f30c0 authored by Thiago Kenji Okada's avatar Thiago Kenji Okada Committed by GitHub
Browse files

porn-vault: init at 0.30.0-rc.11 (#355785)

parents dca46c1a cc671e2b
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -13078,6 +13078,13 @@
    githubId = 30698906;
    name = "Luna D Dragon";
  };
  luNeder = {
    email = "luana@luana.dev.br";
    matrix = "@luana:catgirl.cloud";
    github = "LuNeder";
    githubId = 19750714;
    name = "Luana Neder";
  };
  lunik1 = {
    email = "ch.nixpkgs@themaw.xyz";
    matrix = "@lunik1:lunik.one";
+1 −0
Original line number Diff line number Diff line
@@ -1505,6 +1505,7 @@
  ./services/web-apps/pingvin-share.nix
  ./services/web-apps/plantuml-server.nix
  ./services/web-apps/plausible.nix
  ./services/web-apps/porn-vault/default.nix
  ./services/web-apps/powerdns-admin.nix
  ./services/web-apps/pretalx.nix
  ./services/web-apps/pretix.nix
+158 −0
Original line number Diff line number Diff line
# See https://gitlab.com/porn-vault/porn-vault/-/blob/dev/config.example.json
{
  auth = {
    password = null;
  };
  binaries = {
    ffmpeg = "ffmpeg";
    ffprobe = "ffprobe";
    izzyPort = 8000;
    imagemagick = {
      convertPath = "convert";
      montagePath = "montage";
      identifyPath = "identify";
    };
  };
  import = {
    images = [
      {
        path = "/media/porn-vault/images";
        include = [ ];
        exclude = [ ];
        extensions = [
          ".jpg"
          ".jpeg"
          ".png"
          ".gif"
        ];
        enable = true;
      }
    ];
    videos = [
      {
        path = "/media/porn-vault/videos";
        include = [ ];
        exclude = [ ];
        extensions = [
          ".mp4"
          ".mov"
          ".webm"
        ];
        enable = true;
      }
    ];
    scanInterval = 10800000;
  };
  log = {
    level = "debug";
    maxSize = "20m";
    maxFiles = "5";
    writeFile = [
      {
        level = "debug";
        prefix = "errors-";
        silent = false;
      }
    ];
  };
  matching = {
    applyActorLabels = [
      "event:actor:create"
      "event:actor:find-unmatched-scenes"
      "plugin:actor:create"
      "event:scene:create"
      "plugin:scene:create"
      "event:image:create"
      "plugin:marker:create"
      "event:marker:create"
    ];
    applySceneLabels = true;
    applyStudioLabels = [
      "event:studio:create"
      "event:studio:find-unmatched-scenes"
      "plugin:studio:create"
      "event:scene:create"
      "plugin:scene:create"
    ];
    extractSceneActorsFromFilepath = true;
    extractSceneLabelsFromFilepath = true;
    extractSceneMoviesFromFilepath = true;
    extractSceneStudiosFromFilepath = true;
    matcher = {
      type = "word";
      options = {
        ignoreSingleNames = false;
        ignoreDiacritics = true;
        enableWordGroups = true;
        wordSeparatorFallback = true;
        camelCaseWordGroups = true;
        overlappingMatchPreference = "longest";
        groupSeparators = [
          "[\\s',()[\\]{}*\\.]"
        ];
        wordSeparators = [
          "[-_]"
        ];
        filepathSeparators = [
          "[/\\\\&]"
        ];
      };
    };
    matchCreatedActors = true;
    matchCreatedStudios = true;
    matchCreatedLabels = true;
  };
  persistence = {
    backup = {
      enable = true;
      maxAmount = 10;
    };
    libraryPath = "/media/porn-vault/lib";
  };
  plugins = {
    allowActorThumbnailOverwrite = false;
    allowMovieThumbnailOverwrite = false;
    allowSceneThumbnailOverwrite = false;
    allowStudioThumbnailOverwrite = false;
    createMissingActors = false;
    createMissingLabels = false;
    createMissingMovies = false;
    createMissingStudios = false;
    events = {
      actorCreated = [ ];
      actorCustom = [ ];
      sceneCreated = [ ];
      sceneCustom = [ ];
      movieCustom = [ ];
      studioCreated = [ ];
      studioCustom = [ ];
    };
    register = { };
    markerDeduplicationThreshold = 5;
  };
  processing = {
    generatePreviews = true;
    readImagesOnImport = false;
    generateImageThumbnails = true;
  };
  server = {
    https = {
      certificate = "";
      enable = false;
      key = "";
    };
  };
  transcode = {
    hwaDriver = null;
    vaapiDevice = "/dev/dri/renderD128";
    h264 = {
      preset = "veryfast";
      crf = 23;
    };
    webm = {
      deadline = "realtime";
      cpuUsed = 3;
      crf = 31;
    };
  };
}
+110 −0
Original line number Diff line number Diff line
{
  config,
  pkgs,
  lib,
  ...
}:

let
  cfg = config.services.porn-vault;
  configFormat = pkgs.formats.json { };
  defaultConfig = import ./default-config.nix;
  inherit (lib)
    mkIf
    mkEnableOption
    mkPackageOption
    mkOption
    getExe
    literalExpression
    types
    ;
in
{
  options = {
    services.porn-vault = {
      enable = lib.mkEnableOption "Porn-Vault";

      package = lib.mkPackageOption pkgs "porn-vault" { };

      autoStart = lib.mkOption {
        type = lib.types.bool;
        default = true;
        description = ''
          Whether to start porn-vault automatically.
        '';
      };

      port = lib.mkOption {
        type = lib.types.port;
        default = 3000;
        description = ''
          Which port Porn-Vault will use.
        '';
      };

      openFirewall = lib.mkOption {
        type = lib.types.bool;
        default = false;
        description = ''
          Whether to open the Porn-Vault port in the firewall.
        '';
      };

      settings = mkOption {
        type = configFormat.type;
        description = ''
          Configuration for Porn-Vault. The attributes are serialized to JSON in config.json.

          See https://gitlab.com/porn-vault/porn-vault/-/blob/dev/config.example.json
        '';
        default = defaultConfig;
        apply = lib.recursiveUpdate defaultConfig;
      };
    };
  };

  config = lib.mkIf cfg.enable {
    environment.systemPackages = [ cfg.package ];

    systemd.services.porn-vault = {
      description = "Porn-Vault server";
      environment = {
        PV_CONFIG_FOLDER = "/etc/porn-vault";
        NODE_ENV = "production";
        DATABASE_NAME = "production";
        PORT = toString cfg.port;
      };
      serviceConfig = {
        ExecStart = getExe cfg.package;
        CacheDirectory = "porn-vault";
        # Hardening options
        CapabilityBoundingSet = [ "CAP_SYS_NICE" ];
        AmbientCapabilities = [ "CAP_SYS_NICE" ];
        LockPersonality = true;
        NoNewPrivileges = true;
        PrivateTmp = true;
        ProtectControlGroups = true;
        ProtectKernelLogs = true;
        ProtectKernelModules = true;
        ProtectKernelTunables = true;
        ProtectSystem = true;
        RestrictNamespaces = true;
        RestrictSUIDSGID = true;
        Restart = "on-failure";
        RestartSec = 5;
      };
      wantedBy = mkIf cfg.autoStart [ "multi-user.target" ];
      wants = [ "network.target" ];
    };

    environment.etc = {
      "porn-vault/config.json".source = configFormat.generate "config.json" cfg.settings;
    };

    networking.firewall = lib.mkIf cfg.openFirewall {
      allowedTCPPorts = [ cfg.port ];
    };
  };

  meta.maintainers = [ lib.maintainers.luNeder ];
}
+2291 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading