diff --git a/nixos/modules/virtualisation/incus.nix b/nixos/modules/virtualisation/incus.nix index 1b8908d0d3d6..cd49fc870e0f 100644 --- a/nixos/modules/virtualisation/incus.nix +++ b/nixos/modules/virtualisation/incus.nix @@ -7,6 +7,9 @@ let cfg = config.virtualisation.incus; + + acmeHostDir = config.security.acme.certs."${cfg.useACMEHost}".directory; + preseedFormat = pkgs.formats.yaml { }; nvidiaEnabled = (lib.elem "nvidia" config.services.xserver.videoDrivers); @@ -292,6 +295,17 @@ in package = lib.mkPackageOption pkgs [ "incus-ui-canonical" ] { }; }; + useACMEHost = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + example = "incus.example.com"; + description = '' + Host of an existing Let's Encrypt certificate to use for TLS. + *Note that this option does not create any certificates and it + doesn't add subdomains to existing ones – you will need to create + them manually using {option}`security.acme.certs`.* + ''; + }; }; }; @@ -391,6 +405,10 @@ in ''; }; + security.acme.certs = lib.mkIf (cfg.useACMEHost != null) { + "${cfg.useACMEHost}".reloadServices = [ "incus.service" ]; + }; + systemd.services.incus = { description = "Incus Container and Virtual Machine Management Daemon"; @@ -402,7 +420,8 @@ in "lxcfs.service" "incus.socket" ] - ++ lib.optionals config.virtualisation.vswitch.enable [ "ovs-vswitchd.service" ]; + ++ lib.optionals config.virtualisation.vswitch.enable [ "ovs-vswitchd.service" ] + ++ lib.optionals (cfg.useACMEHost != null) [ "acme-${cfg.useACMEHost}.service" ]; requires = [ "lxcfs.service" @@ -410,7 +429,10 @@ in ] ++ lib.optionals config.virtualisation.vswitch.enable [ "ovs-vswitchd.service" ]; - wants = [ "network-online.target" ]; + wants = [ + "network-online.target" + ] + ++ lib.optionals (cfg.useACMEHost != null) [ "acme-${cfg.useACMEHost}.service" ]; serviceConfig = { ExecStart = "${cfg.package}/bin/incusd --group incus-admin"; @@ -427,6 +449,11 @@ in Restart = "on-failure"; TimeoutStartSec = "${cfg.startTimeout}s"; TimeoutStopSec = "30s"; + + BindReadOnlyPaths = lib.mkIf (cfg.useACMEHost != null) [ + "${acmeHostDir}/fullchain.pem:/var/lib/incus/server.crt" + "${acmeHostDir}/key.pem:/var/lib/incus/server.key" + ]; }; };