trivionomicon: soju: add soju to the trivionomicon #5

Merged
soto merged 1 commit from trivionomicon/soju into master 2025-09-15 00:49:58 +02:00
3 changed files with 76 additions and 0 deletions

13
modules/soju/default.nix Normal file
View file

@ -0,0 +1,13 @@
{
config,
lib,
pkgs,
doctrine,
...
}:
doctrine.lib.mkModule {
inherit config;
name = "soju";
sys = ./sys.nix;
options = ./options.nix;
}

16
modules/soju/options.nix Normal file
View file

@ -0,0 +1,16 @@
{lib, ...}:
with lib.types; {
sys = {
fullyQualifiedDomain = lib.mkOption {
type = str;
example = "soju.trivionomicon.com";
description = "fully qualified domain name to be used by soju";
};
port = lib.mkOption {
type = port;
default = 6697;
description = "port to be used by soju";
};
};
}

47
modules/soju/sys.nix Normal file
View file

@ -0,0 +1,47 @@
{
config,
pkgs,
lib,
cfg,
doctrine,
...
}:
with lib; {
security.acme.certs."${cfg.fullyQualifiedDomain}" = {
reloadServices = ["soju.service"];
group = "soju";
};
networking.firewall.allowedTCPPorts = [cfg.port];
services.soju = let
sojuCertDir = config.security.acme.certs."${cfg.fullyQualifiedDomain}".directory;
in {
enable = true;
hostName = "${cfg.fullyQualifiedDomain}";
listen = ["ircs://[::]:${toString cfg.port}"];
tlsCertificate = "${sojuCertDir}/fullchain.pem";
tlsCertificateKey = "${sojuCertDir}/key.pem";
};
systemd.services.soju = {
after = ["acme-${cfg.fullyQualifiedDomain}.service"];
serviceConfig = {
DynamicUser = mkForce false; # fuck dynamic users
User = "soju";
Group = "soju";
ProtectSystem = "strict";
ProtectHome = "read-only";
PrivateTmp = true;
RemoveIPC = true;
};
};
users = {
users.soju = {
isSystemUser = true;
group = "soju";
};
groups.soju = {};
};
}