{ config, lib, ... }: with lib; let mkServiceOption = { desc, defaultEnabled ? false, extraOpts ? {} }: mkOption { description = "Configuration for the ${desc}"; default = {}; type = types.submodule { options = { enable = mkEnableOption desc // { default = defaultEnabled; }; } // extraOpts; }; }; mkPortOption = default: mkOption { type = types.port; default = default; description = "Port for the service to listen on."; }; in { imports = [ ./nginx.nix ./newt.nix ./tailscale.nix ./acme.nix ./searXNG.nix ./roundcube.nix ./vaultWarden.nix ./forgejo.nix ]; options.module = { domain = mkOption { type = types.str; default = "wateir.fr"; }; hostName = mkOption { type = types.str; default = "${config.networking.hostName}.${config.module.domain}"; description = "Global FQDN for all hosted services."; }; acme = mkServiceOption { desc = "ACME DNS Challenge"; }; roundcube = mkServiceOption { desc = "Roundcube webapp"; extraOpts = { port = mkPortOption 1984; subdomain = lib.mkOption { type = lib.types.str; default = "mail"; }; }; }; vaultwarden = mkServiceOption { desc = "Vaultwarden password manager"; extraOpts = { externalPort = mkPortOption 8000; internalPort = mkPortOption 8222; subdomain = lib.mkOption { type = lib.types.str; default = "vault"; }; }; }; forgejo = mkServiceOption { desc = "Vaultwarden password manager"; extraOpts = { externalPort = mkPortOption 3000; internalPort = mkPortOption 8500; subdomain = lib.mkOption { type = lib.types.str; default = "git"; }; }; }; searxng = mkServiceOption { desc = "SearXNG meta-search engine"; extraOpts = { port = mkPortOption 1692; subdomain = lib.mkOption { type = lib.types.str; default = "search"; }; }; }; }; }