nixos/hosts/architect/options.nix

142 lines
4.1 KiB
Nix
Raw Normal View History

{ config, lib, ... }:
with lib;
{
options.architect = {
firewall = {
openTCP = mkOption {
type = types.listOf types.int;
default = [ ];
};
openUDP = mkOption {
type = types.listOf types.int;
default = [ ];
};
};
networks = mkOption {
type = types.attrsOf (types.submodule {
options = {
interface = mkOption {
type = types.str;
description = "The network interface name.";
};
net = mkOption {
type = types.str;
description = "The network address in CIDR format.";
};
devices = mkOption {
type = types.attrsOf (types.submodule {
options = {
address = mkOption {
type = types.str;
description = "The IP address of the device.";
};
hostname = mkOption {
type = types.str;
description = "The hostname of the device.";
};
};
});
default = { };
description = "An attribute set of devices with their configurations.";
};
};
});
default = { };
description = "An attribute set of networks with their configurations.";
};
2023-06-04 23:29:43 +01:00
vhost = mkOption {
type = types.attrsOf (types.submodule {
options = {
dnsInterfaces = mkOption {
type = types.listOf types.str;
default = [ ];
description = "List of interfaces to add extra DNS hosts for this vhost.";
};
locations = mkOption {
type = types.attrsOf (types.submodule {
options = {
2023-06-05 02:02:02 +01:00
extraConfig = mkOption {
type = types.str;
description = "Extra configuration for the location.";
default = "";
};
allowLan = mkOption {
type = types.bool;
default = false;
};
proxyWebsockets = mkOption {
type = types.bool;
default = false;
};
2023-06-05 03:44:33 +01:00
host = mkOption {
type = types.str;
description = "The host for the location.";
default = "127.0.0.1";
};
2023-06-04 23:29:43 +01:00
port = mkOption {
type = types.int;
description = "The port number for the location.";
};
2023-06-04 23:29:43 +01:00
allow = mkOption {
type = types.listOf types.str;
default = [ ];
description = "IP address or CIDR block to allow.";
};
path = mkOption {
type = types.str;
default = "";
};
2023-06-04 23:29:43 +01:00
allowWAN = mkOption {
type = types.bool;
default = false;
description = "If set to false, deny all WAN traffic.";
};
2023-06-04 23:29:43 +01:00
};
});
default = { };
description = "An attribute set of location configurations.";
};
};
});
default = { };
description = "An attribute set of domain configurations.";
};
};
2024-01-30 23:22:24 +00:00
# TODO: move to nginx
2023-06-04 23:29:43 +01:00
config = {
services.nginx.virtualHosts = mapAttrs
(domain: conf: {
forceSSL = true;
enableACME = true;
locations = mapAttrs
(path: location: {
proxyPass = "http://${location.host}:${toString location.port}${location.path}";
2023-06-05 02:02:02 +01:00
proxyWebsockets = location.proxyWebsockets;
2023-06-04 23:29:43 +01:00
extraConfig = ''
${concatMapStringsSep "\n" (allowCIDR: "allow ${allowCIDR};") location.allow}
2023-06-05 02:02:02 +01:00
${optionalString location.allowLan ''allow ${config.architect.networks."lan".net};''}
2024-01-30 23:22:24 +00:00
${optionalString (!location.allowWAN) "deny all;"}
2023-06-05 02:02:02 +01:00
'' + location.extraConfig;
2023-06-04 23:29:43 +01:00
})
conf.locations;
})
config.architect.vhost;
};
}