nixcfg/modules/nixos/services/homer/default.nix

80 lines
2.1 KiB
Nix
Raw Normal View History

2024-01-11 11:26:46 +01:00
{ lib, config, pkgs, ... }:
with lib;
with lib.plusultra;
let
cfg = config.plusultra.services.homer;
yaml-format = pkgs.formats.yaml { };
settings-yaml = yaml-format.generate "config.yml" cfg.settings;
settings-path =
if cfg.settings-path != null then
cfg.settings-path
else
builtins.toString settings-yaml;
in
{
options.plusultra.services.homer = {
enable = mkEnableOption "Homer";
package = mkOpt types.package pkgs.plusultra.homer "The package of Homer assets to use.";
settings = mkOpt yaml-format.type { } "Configuration for Homer's config.yml file.";
settings-path = mkOpt (types.nullOr types.path) null "A replacement for the generated config.yml file.";
host = mkOpt (types.nullOr types.str) null "The host to serve Homer on.";
nginx = {
forceSSL = mkOption {
type = types.bool;
default = false;
description = "Whether or not to force the use of SSL.";
};
};
acme = {
enable = mkOption {
type = types.bool;
default = false;
description =
"Whether or not to automatically fetch and configure SSL certs.";
};
};
};
config = mkIf cfg.enable {
assertions = [
{
assertion = cfg.host != null;
message = "plusultra.services.homer.host must be set.";
}
{
assertion = cfg.settings-path != null -> cfg.settings == { };
message = "plusultra.services.homer.settings and plusultra.services.homer.settings-path are mutually exclusive.";
}
{
assertion = cfg.nginx.forceSSL -> cfg.acme.enable;
message = "plusultra.services.homer.nginx.forceSSL requires setting plusultra.services.homer.acme.enable to true.";
}
];
services.nginx = {
enable = true;
virtualHosts."${cfg.host}" = {
enableACME = cfg.acme.enable;
forceSSL = cfg.nginx.forceSSL;
locations."/" = {
root = "${cfg.package}/share/homer";
};
locations."= /assets/config.yml" = {
alias = settings-path;
};
};
};
};
}