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 "RStudio server"; 25 26 serverWorkingDir = mkOption { 27 type = types.str; 28 default = "/var/lib/rstudio-server"; 29 description = '' 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 = '' 38 Address to listen on (www-address in rserver.conf). 39 ''; 40 }; 41 42 package = mkPackageOption pkgs "rstudio-server" { 43 example = "rstudioServerWrapper.override { packages = [ pkgs.rPackages.ggplot2 ]; }"; 44 }; 45 46 rserverExtraConfig = mkOption { 47 type = types.str; 48 default = ""; 49 description = '' 50 Extra contents for rserver.conf. 51 ''; 52 }; 53 54 rsessionExtraConfig = mkOption { 55 type = types.str; 56 default = ""; 57 description = '' 58 Extra contents for resssion.conf. 59 ''; 60 }; 61 62 }; 63 64 config = mkIf cfg.enable 65 { 66 systemd.services.rstudio-server = { 67 description = "Rstudio server"; 68 69 after = [ "network.target" ]; 70 wantedBy = [ "multi-user.target" ]; 71 restartTriggers = [ rserver-conf rsession-conf ]; 72 73 serviceConfig = { 74 Restart = "on-failure"; 75 Type = "forking"; 76 ExecStart = "${cfg.package}/bin/rserver"; 77 StateDirectory = "rstudio-server"; 78 RuntimeDirectory = "rstudio-server"; 79 }; 80 }; 81 82 environment.etc = { 83 "rstudio/rserver.conf".source = rserver-conf; 84 "rstudio/rsession.conf".source = rsession-conf; 85 "pam.d/rstudio".source = "/etc/pam.d/login"; 86 }; 87 environment.systemPackages = [ cfg.package ]; 88 89 users = { 90 users.rstudio-server = { 91 uid = config.ids.uids.rstudio-server; 92 description = "rstudio-server"; 93 group = "rstudio-server"; 94 }; 95 groups.rstudio-server = { 96 gid = config.ids.gids.rstudio-server; 97 }; 98 }; 99 100 }; 101}