Files
Foundry/hosts/nixos/merope/services/media/kavita.nix
T
Gabriel Fontes 4ad5343165 fix(merope/kavita): avoid JellySearch port collision
Move Kavita to port 5001 because JellySearch already occupies its default
port 5000, which left Kavita restarting against JellySearch's listener.

Assisted-by: pi (gpt-5.6-sol)
2026-08-17 01:25:23 -03:00

66 lines
1.6 KiB
Nix

{
config,
pkgs,
...
}: let
cfg = config.services.kavita;
tokenKeyFile = "${cfg.dataDir}/token-key";
in {
services = {
kavita = {
enable = true;
inherit tokenKeyFile;
# JellySearch already occupies Kavita's default port 5000.
settings.Port = 5001;
};
nginx.virtualHosts."books.m7.rs" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://localhost:${toString cfg.settings.Port}";
proxyWebsockets = true;
};
};
};
# Kavita needs a stable, machine-local signing key. Generate it once in the
# persisted data directory before systemd loads it as a credential.
systemd.services = {
kavita-token = {
description = "Generate Kavita token key";
before = ["kavita.service"];
requiredBy = ["kavita.service"];
unitConfig.RequiresMountsFor = cfg.dataDir;
serviceConfig = {
Type = "oneshot";
User = cfg.user;
Group = cfg.user;
ExecStart = pkgs.writeShellScript "generate-kavita-token" ''
set -eu
if [[ ! -s ${tokenKeyFile} ]]; then
umask 077
${pkgs.coreutils}/bin/head -c 64 /dev/urandom \
| ${pkgs.coreutils}/bin/base64 --wrap=0 > ${tokenKeyFile}
fi
'';
};
};
kavita.serviceConfig = {
CPUWeight = 50;
IOWeight = 50;
ReadOnlyPaths = ["/srv/media/books"];
};
};
environment.persistence."/persist".directories = [
{
directory = cfg.dataDir;
user = cfg.user;
group = cfg.user;
mode = "0700";
}
];
}