{ config, lib, masterDomain, securityTemplates, ... }: let cfg = config.os.srv.i2p; in { options.os.srv.i2p = { enable = lib.mkEnableOption "enables a flexible, polymorphic i2pd deployment profile"; mode = lib.mkOption { type = lib.types.enum [ "server" "client" ]; default = "client"; description = ""; }; }; config = lib.mkIf cfg.enable ( lib.mkMerge [ { services.i2pd = { enable = true; enableIPv6 = true; reseed.verify = true; yggdrasil.enable = true; proto = { http.enable = true; httpProxy.enable = true; socksProxy = { enable = true; outproxyEnable = true; }; sam.enable = true; i2pControl.enable = true; }; }; } (lib.mkIf (cfg.mode == "server") { services.i2pd = { bandwidth = 4096; ntcp2.published = true; ssu2.published = true; #TODO add address yggdrasil.address = ""; }; os.cluster.nginxProxies."i2p.${masterDomain}" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://${config.os.core.network.ips.relay-vm}:7070"; extraConfig = securityTemplates.restrictToInternal; }; }; }) (lib.mkIf (cfg.mode == "client") { services.i2pd = { bandwidth = 512; ntcp2.published = false; ssu2.published = false; yggdrasil.address = ""; }; }) ] ); }