{ config, lib, ... }: let cfg = config.os.srv.simplex; internalSmpPort = 5223; internalXftpPort = 5224; in { options.os.srv.simplex = { enable = lib.mkEnableOption "enables SimpleX SMP and XFTP containers via Podman"; tor.enable = lib.mkEnableOption "enables Tor hidden services for SimpleX"; }; config = lib.mkIf cfg.enable ( lib.mkMerge [ { assertions = [ { assertion = config.os.srv.oci.enable; message = "SimpleX requires os.srv.oci to be enabled to run containers."; } { assertion = config.os.srv.nginx.enable; message = "SimpleX requires os.srv.nginx to be enabled for clearnet proxying."; } ]; virtualisation.oci-containers.containers = { simplex-smp = { image = "simplexchat/smp-server:latest"; ports = [ "127.0.0.1:${toString internalSmpPort}:5223" ]; volumes = [ "/var/lib/simplex/smp/config:/etc/opt/simplex:rw" "/var/lib/simplex/smp/logs:/var/opt/simplex:rw" ]; }; simplex-xftp = { image = "simplexchat/xftp-server:latest"; ports = [ "127.0.0.1:${toString internalXftpPort}:443" ]; volumes = [ "/var/lib/simplex/xftp/config:/etc/opt/simplex-xftp:rw" "/var/lib/simplex/xftp/logs:/var/opt/simplex-xftp:rw" ]; }; }; services.nginx = { streamConfig = '' server { listen 5223; proxy_pass 127.0.0.1:${toString internalSmpPort}; } server { listen 5224; proxy_pass 127.0.0.1:${toString internalXftpPort}; } ''; }; systemd.tmpfiles.rules = [ "d /var/lib/simplex/smp/config 0755 root root -" "d /var/lib/simplex/smp/logs 0755 root root -" "d /var/lib/simplex/xftp/config 0755 root root -" "d /var/lib/simplex/xftp/logs 0755 root root -" ]; } (lib.mkIf cfg.tor.enable { assertions = [ { assertion = config.os.srv.tor.enable; message = "SimpleX Tor support requires os.srv.tor to be enabled."; } ]; services.tor.relay.onionServices = { simplex-smp = { version = 3; map = [ { port = 5223; target = { addr = "127.0.0.1"; port = internalSmpPort; }; } ]; }; simplex-xftp = { version = 3; map = [ { port = 5224; target = { addr = "127.0.0.1"; port = internalXftpPort; }; } ]; }; }; }) ] ); }