nur-packages

My NUR packages
git clone git://git.sikmir.ru/nur-packages
Log | Files | Refs | README | LICENSE

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 }