Files
nix/modules/server/default.nix
Gustavo "Guz" L. de Mello 5ce99497d7 refactor!: I went too close into the sun
Simlified everything, things were getting out of control
2024-04-08 16:37:29 -03:00

125 lines
2.9 KiB
Nix

{
config,
lib,
pkgs,
...
}: let
cfg = config.server;
server = pkgs.writeShellScriptBin "server" ''
gum="${pkgs.gum}/bin/gum";
flakeDir="${toString cfg.flakeDir}";
command="$1";
if [[ "$command" == "build" ]]; then
shift 1;
sudo nixos-rebuild switch --flake "$flakeDir" "$@"
fi
${
if cfg.forgejo.cliAlias
then ''
if [[ "$command" == "forgejo" ]]; then
shift 1;
sudo --user=${cfg.forgejo.user} ${cfg.forgejo.package}/bin/gitea --work-path ${cfg.forgejo.data.root} "$@"
fi
if [[ "$command" == "forgejo-act" ]]; then
shift 1;
sudo --user=${cfg.forgejo.user} ${cfg.forgejo.actions.package}/bin/act_runner --config /var/lib/gitea-runner/${cfg.forgejo.actions.instanceName} "$@"
fi
''
else ""
}
'';
in {
imports = [
./adguard.nix
./caddy.nix
./forgejo.nix
./jellyfin.nix
./jellyseerr.nix
./network.nix
./nextcloud.nix
./photoprism.nix
./tailscale.nix
];
options.server = with lib;
with lib.types; {
enable = mkEnableOption "";
name = mkOption {
type = str;
default = "server";
};
flakeDir = mkOption {
type = str;
};
storage = mkOption {
type = path;
default = /data + "/${cfg.name}";
description = "The Homelab central storage path";
};
domain = mkOption {
type = either str path;
default = "${cfg.name}.local";
};
localIp = mkOption {
type = str;
};
ip = mkOption {
type = str;
default = cfg.localIp;
};
handleDomains = mkOption {
type = bool;
default = true;
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [
server
];
networking.firewall.allowedTCPPorts = lib.mkIf cfg.handleDomains [80 433];
systemd.services."tailscaled" = lib.mkIf cfg.handleDomains {
serviceConfig = {
Environment = ["TS_PERMIT_CERT_UID=caddy"];
};
};
server = with lib;
mkIf cfg.handleDomains {
adguard = {
enable = true;
settings.dns.rewrites =
if hasPrefix "*." cfg.domain
then {
"${cfg.domain}" = cfg.ip;
}
else {
"${cfg.domain}" = cfg.ip;
"${"*." + cfg.domain}" = cfg.ip;
};
};
caddy = let
homelabServices = lib.filterAttrs (n: v: builtins.isAttrs v && v ? domain) cfg;
in
with lib;
mkIf cfg.handleDomains {
enable = true;
settings.virtualHosts =
mapAttrs'
(name: value:
nameValuePair (value.domain) {
extraConfig = ''
reverse_proxy ${cfg.localIp}:${toString value.port}
'';
})
homelabServices;
};
};
};
}