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}