80 lines
2.1 KiB
Nix
80 lines
2.1 KiB
Nix
{ 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;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|