{ config, lib, pkgs, ... }: let cfg = config.services.minecraft-heatmap; in { options.services.minecraft-heatmap = { enable = lib.mkEnableOption ""; mclog2psqlPackage = lib.mkPackageOption pkgs "mclog2psql" { }; onCalendar = lib.mkOption { type = lib.types.str; default = "05:00:00"; description = "Systemd timer OnCalendar setting for the Minecraft Heatmap log ingester."; }; minecraftLogsDir = lib.mkOption { type = lib.types.path; default = "/var/cache/minecraft-heatmap/logs"; description = "Directory containing Minecraft server log files to be ingested."; }; database = { host = lib.mkOption { type = lib.types.str; default = "localhost"; description = "Database host for Minecraft Heatmap."; }; port = lib.mkOption { type = lib.types.port; default = 5432; description = "Database port for Minecraft Heatmap."; }; name = lib.mkOption { type = lib.types.str; default = "minecraft_heatmap"; description = "Database name for Minecraft Heatmap."; }; user = lib.mkOption { type = lib.types.str; default = "minecraft_heatmap"; description = "Database user for Minecraft Heatmap."; }; passwordFile = lib.mkOption { type = with lib.types; nullOr path; default = null; description = "Path to the file containing the database password for Minecraft Heatmap."; }; }; }; config = lib.mkIf cfg.enable { systemd.services.minecraft-heatmap-ingest-logs = { description = "Minecraft Heatmap log ingester service"; environment = { MINECRAFT_HEATMAP_DIR = cfg.minecraftLogsDir; MINECRAFT_HEATMAP_DB_HOST = cfg.database.host; MINECRAFT_HEATMAP_DB_PORT = toString cfg.database.port; MINECRAFT_HEATMAP_DB_NAME = cfg.database.name; MINECRAFT_HEATMAP_DB_USER = cfg.database.user; MINECRAFT_HEATMAP_DB_PASSWORD_FILE = lib.optionalString (cfg.database.passwordFile != null) "%d/minecraft-heatmap-db-password"; }; serviceConfig = { Type = "oneshot"; ExecStart = "${cfg.mclog2psqlPackage}/bin/mclog2psql"; Restart = "on-failure"; RestartSec = "5s"; User = "minecraft-heatmap"; Group = "minecraft-heatmap"; DynamicUser = true; LoadCredential = lib.mkIf (cfg.database.passwordFile != null) [ "minecraft-heatmap-db-password:${cfg.database.passwordFile}" ]; CacheDirectory = "minecraft-heatmap"; CacheDirectoryMode = "0700"; }; }; systemd.timers.minecraft-heatmap-ingest-logs = { description = "Minecraft Heatmap log ingester timer"; wantedBy = [ "timers.target" ]; timerConfig = { OnCalendar = cfg.onCalendar; Persistent = true; RandomizedDelaySec = "1h"; }; }; # systemd.sockets.minecraft-heatmap-rest-endpoint = {}; # systemd.sockets.minecraft-heatmap-rest-endpoint = {}; }; }