Add NixOS module and deployment guide for lidarr-mb-gap
- Introduced a new NixOS module for the lidarr-mb-gap service, allowing users to configure and manage the report generation process through NixOS. - Added a comprehensive deployment guide in `nixos/DEPLOYMENT.md`, detailing setup instructions, configuration options, and troubleshooting tips for deploying the service on NixOS and serving reports via Caddy. - Updated `flake.nix` to export the new NixOS module. - Enhanced the report generation scripts to support customizable output paths for generated reports.
This commit is contained in:
119
nixos/lidarr-mb-gap.nix
Normal file
119
nixos/lidarr-mb-gap.nix
Normal file
@@ -0,0 +1,119 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
reportDir = "/var/lib/lidarr-mb-gap/reports";
|
||||
envFile = "/var/lib/lidarr-mb-gap/.env";
|
||||
in
|
||||
{
|
||||
options.services.lidarr-mb-gap = {
|
||||
enable = lib.mkEnableOption "Lidarr MusicBrainz Gap Reporter";
|
||||
|
||||
package = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.package;
|
||||
default = null;
|
||||
description = "The lidarr-mb-gap package to use. If null, will be built from src.";
|
||||
};
|
||||
|
||||
src = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
description = "Source path for building the package. Required if package is not explicitly set.";
|
||||
};
|
||||
|
||||
reportDir = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = reportDir;
|
||||
description = "Directory where reports will be generated";
|
||||
};
|
||||
|
||||
envFile = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = envFile;
|
||||
description = "Path to .env file with LIDARR_URL and LIDARR_API_KEY";
|
||||
};
|
||||
|
||||
runInterval = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "daily";
|
||||
description = "systemd timer interval (e.g., 'daily', 'hourly', '*-*-* 02:00:00')";
|
||||
};
|
||||
|
||||
syncToVPS = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Whether to sync reports to VPS via rsync";
|
||||
};
|
||||
|
||||
vpsHost = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = "VPS hostname or IP for rsync (e.g., 'vps' or 'user@vps.example.com')";
|
||||
};
|
||||
|
||||
vpsPath = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "/var/www/html";
|
||||
description = "Path on VPS where reports should be synced";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf config.services.lidarr-mb-gap.enable {
|
||||
systemd.tmpfiles.rules = [
|
||||
"d ${config.services.lidarr-mb-gap.reportDir} 0755 lidarr-mb-gap lidarr-mb-gap -"
|
||||
];
|
||||
|
||||
users.users.lidarr-mb-gap = {
|
||||
isSystemUser = true;
|
||||
group = "lidarr-mb-gap";
|
||||
home = "/var/lib/lidarr-mb-gap";
|
||||
createHome = true;
|
||||
};
|
||||
|
||||
users.groups.lidarr-mb-gap = {};
|
||||
|
||||
systemd.services.lidarr-mb-gap = {
|
||||
description = "Generate Lidarr MusicBrainz Gap Report";
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
User = "lidarr-mb-gap";
|
||||
Group = "lidarr-mb-gap";
|
||||
WorkingDirectory = config.services.lidarr-mb-gap.reportDir;
|
||||
EnvironmentFile = config.services.lidarr-mb-gap.envFile;
|
||||
ExecStart = pkgs.writeShellScript "lidarr-mb-gap-run" ''
|
||||
set -euo pipefail
|
||||
|
||||
# Export OUTPUT_DIR to environment
|
||||
export OUTPUT_DIR=${config.services.lidarr-mb-gap.reportDir}
|
||||
|
||||
# Run the binary
|
||||
${lib.getExe lidarrMbGapPackage} || {
|
||||
echo "Failed to generate report"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Sync to VPS if enabled
|
||||
${lib.optionalString (config.services.lidarr-mb-gap.syncToVPS && config.services.lidarr-mb-gap.vpsHost != null) ''
|
||||
${pkgs.rsync}/bin/rsync -avz --delete \
|
||||
${config.services.lidarr-mb-gap.reportDir}/ \
|
||||
${config.services.lidarr-mb-gap.vpsHost}:${config.services.lidarr-mb-gap.vpsPath}/
|
||||
''}
|
||||
'';
|
||||
StandardOutput = "journal";
|
||||
StandardError = "journal";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.lidarr-mb-gap = {
|
||||
description = "Timer for Lidarr MusicBrainz Gap Report";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = config.services.lidarr-mb-gap.runInterval;
|
||||
Persistent = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user