1{ 2 config, 3 lib, 4 pkgs, 5 ... 6}: 7let 8 9 cfg = config.services.rstudio-server; 10 11 rserver-conf = builtins.toFile "rserver.conf" '' 12 server-working-dir=${cfg.serverWorkingDir} 13 www-address=${cfg.listenAddr} 14 ${cfg.rserverExtraConfig} 15 ''; 16 17 rsession-conf = builtins.toFile "rsession.conf" '' 18 ${cfg.rsessionExtraConfig} 19 ''; 20 21in 22{ 23 meta.maintainers = with lib.maintainers; [ 24 jbedo 25 cfhammill 26 ]; 27 28 options.services.rstudio-server = { 29 enable = lib.mkEnableOption "RStudio server"; 30 31 serverWorkingDir = lib.mkOption { 32 type = lib.types.str; 33 default = "/var/lib/rstudio-server"; 34 description = '' 35 Default working directory for server (server-working-dir in rserver.conf). 36 ''; 37 }; 38 39 listenAddr = lib.mkOption { 40 type = lib.types.str; 41 default = "127.0.0.1"; 42 description = '' 43 Address to listen on (www-address in rserver.conf). 44 ''; 45 }; 46 47 package = lib.mkPackageOption pkgs "rstudio-server" { 48 example = "rstudioServerWrapper.override { packages = [ pkgs.rPackages.ggplot2 ]; }"; 49 }; 50 51 rserverExtraConfig = lib.mkOption { 52 type = lib.types.str; 53 default = ""; 54 description = '' 55 Extra contents for rserver.conf. 56 ''; 57 }; 58 59 rsessionExtraConfig = lib.mkOption { 60 type = lib.types.str; 61 default = ""; 62 description = '' 63 Extra contents for resssion.conf. 64 ''; 65 }; 66 67 }; 68 69 config = lib.mkIf cfg.enable { 70 systemd.services.rstudio-server = { 71 description = "Rstudio server"; 72 73 after = [ "network.target" ]; 74 wantedBy = [ "multi-user.target" ]; 75 restartTriggers = [ 76 rserver-conf 77 rsession-conf 78 ]; 79 80 serviceConfig = { 81 Restart = "on-failure"; 82 Type = "forking"; 83 ExecStart = "${cfg.package}/bin/rserver"; 84 StateDirectory = "rstudio-server"; 85 RuntimeDirectory = "rstudio-server"; 86 }; 87 }; 88 89 environment.etc = { 90 "rstudio/rserver.conf".source = rserver-conf; 91 "rstudio/rsession.conf".source = rsession-conf; 92 "pam.d/rstudio".source = "/etc/pam.d/login"; 93 }; 94 environment.systemPackages = [ cfg.package ]; 95 96 users = { 97 users.rstudio-server = { 98 uid = config.ids.uids.rstudio-server; 99 description = "rstudio-server"; 100 group = "rstudio-server"; 101 }; 102 groups.rstudio-server = { 103 gid = config.ids.gids.rstudio-server; 104 }; 105 }; 106 107 }; 108}