gmnisrv.nix (2399B)
1 { config, lib, pkgs, ... }: 2 3 with lib; 4 5 let 6 cfg = config.services.gmnisrv; 7 in { 8 options.services.gmnisrv = { 9 enable = mkEnableOption "Simple Gemini protocol server"; 10 11 package = mkOption { 12 type = types.package; 13 default = pkgs.gmnisrv; 14 defaultText = "pkgs.gmnisrv"; 15 description = "Which gmnisrv package to use."; 16 }; 17 18 hostNames = mkOption { 19 type = types.listOf types.str; 20 default = [ ]; 21 example = [ "example.com" ]; 22 description = "List of hostnames to respond to requests for."; 23 }; 24 25 port = mkOption { 26 type = types.port; 27 default = 1965; 28 description = "TCP port for gmnisrv to bind to."; 29 }; 30 31 user = mkOption { 32 type = types.str; 33 default = "gmnisrv"; 34 description = "User under which gmnisrv is ran."; 35 }; 36 37 group = mkOption { 38 type = types.str; 39 default = "gmnisrv"; 40 description = "Group under which gmnisrv is ran."; 41 }; 42 43 stateDir = mkOption { 44 type = types.path; 45 default = "/var/lib/gemini"; 46 description = "The gmnisrv home directory containing certificates."; 47 }; 48 49 docBase = mkOption { 50 type = types.str; 51 default = "/srv/gemini"; 52 description = "Base directory for Gemini content."; 53 } 54 }; 55 56 config = mkIf cfg.enable { 57 systemd.services.gmnisrv = { 58 description = "Simple gemini server"; 59 after = [ "network.target" ]; 60 wantedBy = [ "multi-user.target" ]; 61 preStart = '' 62 mkdir -p "${cfg.stateDir}/certs" 63 ''; 64 serviceConfig = let 65 configFile = pkgs.writeFile "gmnisrv.ini" '' 66 listen=0.0.0.0:${cfg.port} 67 [:tls] 68 store=${cfg.stateDir}/certs 69 '' + lib.concatMapStringsSep "\n" (hostname: '' 70 [${hostname}] 71 root=${cfg.docBase}/${hostname} 72 '') cfg.hostNames; 73 in { 74 User = cfg.user; 75 Group = cfg.group; 76 LogsDirectory = "gmnisrv"; 77 ExecStart = "${cfg.package}/bin/gmnisrv -C ${configFile}"; 78 Restart = "always"; 79 }; 80 }; 81 82 users.users = optionalAttrs (cfg.user == "gmnisrv") { 83 gmnisrv = { 84 group = cfg.group; 85 home = cfg.stateDir; 86 createHome = true; 87 uid = config.ids.uids.gmnisrv; 88 }; 89 }; 90 91 users.groups = optionalAttrs (cfg.group == "gmnisrv") { 92 gmnisrv.gid = config.ids.gids.gmnisrv; 93 }; 94 }; 95 }