1 { config, lib, pkgs, ... }:
3 cfg = config.services.pantalaimon-headless;
5 iniFmt = pkgs.formats.ini { };
7 mkConfigFile = name: instanceConfig: iniFmt.generate "pantalaimon.conf" {
9 LogLevel = instanceConfig.logLevel;
10 Notifications = false;
13 ${name} = (lib.recursiveUpdate
15 Homeserver = instanceConfig.homeserver;
16 ListenAddress = instanceConfig.listenAddress;
17 ListenPort = instanceConfig.listenPort;
18 SSL = instanceConfig.ssl;
20 # Set some settings to prevent user interaction for headless operation
21 IgnoreVerification = true;
24 instanceConfig.extraSettings
28 mkPantalaimonService = name: instanceConfig:
29 lib.nameValuePair "pantalaimon-${name}" {
30 description = "pantalaimon instance ${name} - E2EE aware proxy daemon for matrix clients";
31 wants = [ "network-online.target" ];
32 after = [ "network-online.target" ];
33 wantedBy = [ "multi-user.target" ];
36 ExecStart = ''${pkgs.pantalaimon-headless}/bin/pantalaimon --config ${mkConfigFile name instanceConfig} --data-path ${instanceConfig.dataPath}'';
37 Restart = "on-failure";
39 NoNewPrivileges = true;
40 PrivateDevices = true;
43 ProtectSystem = "strict";
44 StateDirectory = "pantalaimon-${name}";
49 options.services.pantalaimon-headless.instances = lib.mkOption {
51 type = lib.types.attrsOf (lib.types.submodule (import ./pantalaimon-options.nix));
53 Declarative instance config.
55 Note: to use pantalaimon interactively, e.g. for a Matrix client which does not
56 support End-to-end encryption (like `fractal`), refer to the home-manager module.
60 config = lib.mkIf (config.services.pantalaimon-headless.instances != { })
62 systemd.services = lib.mapAttrs' mkPantalaimonService config.services.pantalaimon-headless.instances;
66 maintainers = with lib.maintainers; [ jojosch ];