{ config, lib, pkgs, ... }: with lib; let cfg = config.services.userdata; directionArg = if cfg.direction == "" then "" else "--direction=${cfg.direction}"; in { options.services.userdata = { # General server options hostname = mkOption { description = "The hostname of the server."; type = types.nullOr types.str; }; domain = mkOption { description = '' Domain used by the server ''; type = types.nullOr types.str; }; timezone = mkOption { description = '' Timezone used by the server ''; type = types.nullOr types.str; default = "Europe/Uzhgorod"; }; autoUpgrade = { enable = mkOption { description = "Enable auto-upgrade of the server."; default = true; type = types.nullOr types.bool; }; allowReboot = mkOption { description = "Allow the server to reboot during the upgrade."; default = false; type = types.nullOr types.bool; }; }; stateVersion = mkOption { description = '' State version of the server ''; type = types.str; default = "22.11"; }; ######################## # Server admin options # ######################## username = mkOption { description = '' Username that was defined at the initial setup process ''; type = types.nullOr types.str; }; hashedMasterPassword = mkOption { description = '' Hash of the password that was defined at the initial setup process ''; type = types.nullOr types.str; }; sshKeys = mkOption { description = '' SSH keys of the user that was defined at the initial setup process ''; type = types.nullOr (types.listOf types.str); default = [ ]; }; ############### # API options # ############### api = { skippedMigrations = mkOption { default = [ ]; description = '' List of migrations that should be skipped ''; type = types.listOf types.str; }; }; ############# # Secrets # ############# dns = { provider = mkOption { description = "DNS provider that was defined at the initial setup process. Default is ClOUDFLARE"; type = types.nullOr types.str; }; useStagingACME = mkOption { description = "Use staging ACME server. Default is false"; type = types.nullOr types.bool; }; }; backup = { bucket = mkOption { description = "Bucket name used for userdata backups"; type = types.nullOr types.str; }; }; server = { provider = mkOption { description = "Server provider that was defined at the initial setup process. Default is HETZNER"; type = types.nullOr types.str; }; }; ############## # Services # ############## bitwarden = { enable = mkOption { default = false; type = types.nullOr types.bool; }; location = mkOption { default = "sda1"; type = types.nullOr types.str; }; }; email = { location = mkOption { default = "sda1"; type = types.nullOr types.str; }; }; gitea = { enable = mkOption { default = false; type = types.nullOr types.bool; }; location = mkOption { default = "sda1"; type = types.nullOr types.str; }; }; nextcloud = { enable = mkOption { default = true; type = types.nullOr types.bool; }; location = mkOption { default = "sda1"; type = types.nullOr types.str; }; }; pleroma = { enable = mkOption { default = false; type = types.nullOr types.bool; }; location = mkOption { default = "sda1"; type = types.nullOr types.str; }; }; jitsi = { enable = mkOption { default = false; type = types.nullOr types.bool; }; }; ocserv = { enable = mkOption { default = true; type = types.nullOr types.bool; }; }; ######### # SSH # ######### ssh = { enable = mkOption { default = true; type = types.nullOr types.bool; }; rootKeys = mkOption { description = '' Root SSH Keys ''; type = types.nullOr (types.listOf types.str); default = [ "" ]; }; passwordAuthentication = mkOption { description = '' Password authentication for SSH ''; default = false; type = types.nullOr types.bool; }; }; ########### # Users # ########### users = mkOption { description = '' Users that will be created on the server ''; type = types.nullOr (types.listOf (types.attrsOf types.anything)); default = [ ]; }; ############## # Volumes # ############## volumes = mkOption { description = '' Volumes that will be created on the server ''; type = types.nullOr (types.listOf (types.attrsOf types.anything)); default = [ ]; }; useBinds = mkOption { type = types.nullOr types.bool; default = false; }; }; }