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}