{ pkgs, config, lib, ... }: let cfg = config.homelab; in { options.homelab = { enable = lib.mkEnableOption "enable homelab services and configuration"; media_user = lib.mkOption { default = "media"; type = lib.types.str; description = "user for media file permissions"; }; media_group = lib.mkOption { default = "media"; type = lib.types.str; description = "group for media file permissions"; }; tz = lib.mkOption { default = "America/Chicago"; type = lib.types.str; description = "set timezone"; }; base_domain = lib.mkOption { default = "snowbelle.lan"; type = lib.types.str; description = "base domain used for reverse proxy"; }; public_domain = lib.mkOption { default = "blakedheld.xyz"; type = lib.types.str; description = "base domain used for reverse proxy"; }; host_ip = lib.mkOption { default = "10.10.0.10"; type = lib.types.str; description = "base domain used for reverse proxy"; }; baks = lib.mkOption { type = lib.types.attrsOf (lib.types.attrsOf (lib.types.listOf lib.types.path)); default = {}; description = "backup jobs, nested attribute sets should be = paths []"; }; backup_repo = lib.mkOption { type = lib.types.path; default = "/holocron/archives/homelab"; description = "path to take daily backups to with borg!"; }; }; # the order determines the order in glance :3 imports = [ ./motd ./glance ./caddy ./home/zigbee2mqtt ./vaultwarden ./gitea ./home/homeassistant ./immich ./arr/bazarr ./arr/prowlarr ./arr/radarr ./qbittorrent ./arr/sonarr ./yacreader ./audiobookshelf ./jellyfin ./arr/flaresolverr ./home/mosquitto ./uptime-kuma ]; config = lib.mkIf cfg.enable { users = { groups.${cfg.media_group} = { gid = 700; }; users.${cfg.media_user} = { uid = 700; isSystemUser = true; group = cfg.media_group; }; }; # backups homelab with borg services.borgbackup.jobs.homelab = { archiveBaseName = "homelab"; repo = cfg.backup_repo; paths = lib.flatten (lib.attrsets.mapAttrsToList (_: arg: arg.paths) config.system.backups.baks); compression = "auto,zstd"; startAt = "daily"; group = "archives"; encryption.mode = "repokey-blake2"; encryption.passCommand = "cat ${config.sops.secrets."borg_passwd".path}"; extraArgs = ["--verbose" "--show-rc" "--umask" "0007"]; extraCreateArgs = ["--list" "--stats" "--filter" "AME"]; prune.keep = { within = "1d"; # Keep all archives from the last day daily = 7; weekly = 12; monthly = -1; # Keep at least one archive for each month }; }; sops.secrets = { "borg_passwd" = { owner = "root"; group = "root"; }; }; }; }