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