grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / web-apps / openvscode-server.nix
blobb3c22cd43b78e5151676ca743bf7af3c45f59e93
1 { config, lib, pkgs, ... }:
3 let
4   cfg = config.services.openvscode-server;
5   defaultUser = "openvscode-server";
6   defaultGroup = defaultUser;
7 in
9   options = {
10     services.openvscode-server = {
11       enable = lib.mkEnableOption "openvscode-server";
13       package = lib.mkPackageOption pkgs "openvscode-server" { };
15       extraPackages = lib.mkOption {
16         default = [ ];
17         description = ''
18           Additional packages to add to the openvscode-server {env}`PATH`.
19         '';
20         example = lib.literalExpression "[ pkgs.go ]";
21         type = lib.types.listOf lib.types.package;
22       };
24       extraEnvironment = lib.mkOption {
25         type = lib.types.attrsOf lib.types.str;
26         description = ''
27           Additional environment variables to pass to openvscode-server.
28         '';
29         default = { };
30         example = { PKG_CONFIG_PATH = "/run/current-system/sw/lib/pkgconfig"; };
31       };
33       extraArguments = lib.mkOption {
34         default = [ ];
35         description = ''
36           Additional arguments to pass to openvscode-server.
37         '';
38         example = lib.literalExpression ''[ "--log=info" ]'';
39         type = lib.types.listOf lib.types.str;
40       };
42       host = lib.mkOption {
43         default = "localhost";
44         description = ''
45           The host name or IP address the server should listen to.
46         '';
47         type = lib.types.str;
48       };
50       port = lib.mkOption {
51         default = 3000;
52         description = ''
53           The port the server should listen to. If 0 is passed a random free port is picked. If a range in the format num-num is passed, a free port from the range (end inclusive) is selected.
54         '';
55         type = lib.types.port;
56       };
58       user = lib.mkOption {
59         default = defaultUser;
60         example = "yourUser";
61         description = ''
62           The user to run openvscode-server as.
63           By default, a user named `${defaultUser}` will be created.
64         '';
65         type = lib.types.str;
66       };
68       group = lib.mkOption {
69         default = defaultGroup;
70         example = "yourGroup";
71         description = ''
72           The group to run openvscode-server under.
73           By default, a group named `${defaultGroup}` will be created.
74         '';
75         type = lib.types.str;
76       };
78       extraGroups = lib.mkOption {
79         default = [ ];
80         description = ''
81           An array of additional groups for the `${defaultUser}` user.
82         '';
83         example = [ "docker" ];
84         type = lib.types.listOf lib.types.str;
85       };
87       withoutConnectionToken = lib.mkOption {
88         default = false;
89         description = ''
90           Run without a connection token. Only use this if the connection is secured by other means.
91         '';
92         example = true;
93         type = lib.types.bool;
94       };
96       socketPath = lib.mkOption {
97         default = null;
98         example = "/run/openvscode/socket";
99         description = ''
100           The path to a socket file for the server to listen to.
101         '';
102         type = lib.types.nullOr lib.types.str;
103       };
105       userDataDir = lib.mkOption {
106         default = null;
107         description = ''
108           Specifies the directory that user data is kept in. Can be used to open multiple distinct instances of Code.
109         '';
110         type = lib.types.nullOr lib.types.str;
111       };
113       serverDataDir = lib.mkOption {
114         default = null;
115         description = ''
116           Specifies the directory that server data is kept in.
117         '';
118         type = lib.types.nullOr lib.types.str;
119       };
121       extensionsDir = lib.mkOption {
122         default = null;
123         description = ''
124           Set the root path for extensions.
125         '';
126         type = lib.types.nullOr lib.types.str;
127       };
129       telemetryLevel = lib.mkOption {
130         default = null;
131         example = "crash";
132         description = ''
133           Sets the initial telemetry level. Valid levels are: 'off', 'crash', 'error' and 'all'.
134         '';
135         type = lib.types.nullOr (lib.types.enum [ "off" "crash" "error" "all" ]);
136       };
138       connectionToken = lib.mkOption {
139         default = null;
140         example = "secret-token";
141         description = ''
142           A secret that must be included with all requests.
143         '';
144         type = lib.types.nullOr lib.types.str;
145       };
147       connectionTokenFile = lib.mkOption {
148         default = null;
149         description = ''
150           Path to a file that contains the connection token.
151         '';
152         type = lib.types.nullOr lib.types.str;
153       };
155     };
156   };
158   config = lib.mkIf cfg.enable {
159     systemd.services.openvscode-server = {
160       description = "OpenVSCode server";
161       wantedBy = [ "multi-user.target" ];
162       wants = [ "network-online.target" ];
163       after = [ "network-online.target" ];
164       path = cfg.extraPackages;
165       environment = cfg.extraEnvironment;
166       serviceConfig = {
167         ExecStart = ''
168           ${lib.getExe cfg.package} \
169             --accept-server-license-terms \
170             --host=${cfg.host} \
171             --port=${toString cfg.port} \
172         '' + lib.optionalString (cfg.telemetryLevel != null) ''
173           --telemetry-level=${cfg.telemetryLevel} \
174         '' + lib.optionalString (cfg.withoutConnectionToken) ''
175           --without-connection-token \
176         '' + lib.optionalString (cfg.socketPath != null) ''
177           --socket-path=${cfg.socketPath} \
178         '' + lib.optionalString (cfg.userDataDir != null) ''
179           --user-data-dir=${cfg.userDataDir} \
180         '' + lib.optionalString (cfg.serverDataDir != null) ''
181           --server-data-dir=${cfg.serverDataDir} \
182         '' + lib.optionalString (cfg.extensionsDir != null) ''
183           --extensions-dir=${cfg.extensionsDir} \
184         '' + lib.optionalString (cfg.connectionToken != null) ''
185           --connection-token=${cfg.connectionToken} \
186         '' + lib.optionalString (cfg.connectionTokenFile != null) ''
187           --connection-token-file=${cfg.connectionTokenFile} \
188         '' + lib.escapeShellArgs cfg.extraArguments;
189         ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
190         RuntimeDirectory = cfg.user;
191         User = cfg.user;
192         Group = cfg.group;
193         Restart = "on-failure";
194       };
195     };
197     users.users."${cfg.user}" = lib.mkMerge [
198       (lib.mkIf (cfg.user == defaultUser) {
199         isNormalUser = true;
200         description = "openvscode-server user";
201         inherit (cfg) group;
202       })
203       {
204         packages = cfg.extraPackages;
205         inherit (cfg) extraGroups;
206       }
207     ];
209     users.groups."${defaultGroup}" = lib.mkIf (cfg.group == defaultGroup) { };
210   };
212   meta.maintainers = [ lib.maintainers.drupol ];