vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / web-apps / code-server.nix
blobf94a1a8b53fa4bb83ec2b9032874e372ce1db994
1 { config, lib, pkgs, ... }:
3 let
4   cfg = config.services.code-server;
5   defaultUser = "code-server";
6   defaultGroup = defaultUser;
7 in {
8   options = {
9     services.code-server = {
10       enable = lib.mkEnableOption "code-server";
12       package = lib.mkPackageOption pkgs "code-server" {
13         example = ''
14           pkgs.vscode-with-extensions.override {
15             vscode = pkgs.code-server;
16             vscodeExtensions = with pkgs.vscode-extensions; [
17               bbenoist.nix
18               dracula-theme.theme-dracula
19             ];
20           }
21         '';
22       };
24       extraPackages = lib.mkOption {
25         default = [ ];
26         description = ''
27           Additional packages to add to the code-server {env}`PATH`.
28         '';
29         example = lib.literalExpression "[ pkgs.go ]";
30         type = lib.types.listOf lib.types.package;
31       };
33       extraEnvironment = lib.mkOption {
34         type = lib.types.attrsOf lib.types.str;
35         description = ''
36           Additional environment variables to pass to code-server.
37         '';
38         default = { };
39         example = { PKG_CONFIG_PATH = "/run/current-system/sw/lib/pkgconfig"; };
40       };
42       extraArguments = lib.mkOption {
43         default = [ ];
44         description = ''
45           Additional arguments to pass to code-server.
46         '';
47         example = lib.literalExpression ''[ "--log=info" ]'';
48         type = lib.types.listOf lib.types.str;
49       };
51       host = lib.mkOption {
52         default = "localhost";
53         description = ''
54           The host name or IP address the server should listen to.
55         '';
56         type = lib.types.str;
57       };
59       port = lib.mkOption {
60         default = 4444;
61         description = ''
62           The port the server should listen to.
63         '';
64         type = lib.types.port;
65       };
67       auth = lib.mkOption {
68         default = "password";
69         description = ''
70           The type of authentication to use.
71         '';
72         type = lib.types.enum [ "none" "password" ];
73       };
75       hashedPassword = lib.mkOption {
76         default = "";
77         description = ''
78           Create the password with: `echo -n 'thisismypassword' | npx argon2-cli -e`.
79         '';
80         type = lib.types.str;
81       };
83       user = lib.mkOption {
84         default = defaultUser;
85         example = "yourUser";
86         description = ''
87           The user to run code-server as.
88           By default, a user named `${defaultUser}` will be created.
89         '';
90         type = lib.types.str;
91       };
93       group = lib.mkOption {
94         default = defaultGroup;
95         example = "yourGroup";
96         description = ''
97           The group to run code-server under.
98           By default, a group named `${defaultGroup}` will be created.
99         '';
100         type = lib.types.str;
101       };
103       extraGroups = lib.mkOption {
104         default = [ ];
105         description = ''
106           An array of additional groups for the `${defaultUser}` user.
107         '';
108         example = [ "docker" ];
109         type = lib.types.listOf lib.types.str;
110       };
112       socket = lib.mkOption {
113         default = null;
114         example = "/run/code-server/socket";
115         description = ''
116           Path to a socket (bind-addr will be ignored).
117         '';
118         type = lib.types.nullOr lib.types.str;
119       };
121       socketMode = lib.mkOption {
122         default = null;
123         description = ''
124            File mode of the socket.
125         '';
126         type = lib.types.nullOr lib.types.str;
127       };
129       userDataDir = lib.mkOption {
130         default = null;
131         description = ''
132           Path to the user data directory.
133         '';
134         type = lib.types.nullOr lib.types.str;
135       };
137       extensionsDir = lib.mkOption {
138         default = null;
139         description = ''
140           Path to the extensions directory.
141         '';
142         type = lib.types.nullOr lib.types.str;
143       };
145       proxyDomain = lib.mkOption {
146         default = null;
147         example = "code-server.lan";
148         description = ''
149           Domain used for proxying ports.
150         '';
151         type = lib.types.nullOr lib.types.str;
152       };
154       disableTelemetry = lib.mkOption {
155         default = false;
156         example = true;
157         description = ''
158           Disable telemetry.
159         '';
160         type = lib.types.bool;
161       };
163       disableUpdateCheck = lib.mkOption {
164         default = false;
165         example = true;
166         description = ''
167           Disable update check.
168           Without this flag, code-server checks every 6 hours against the latest github release and
169           then notifies you once every week that a new release is available.
170         '';
171         type = lib.types.bool;
172       };
174       disableFileDownloads = lib.mkOption {
175         default = false;
176         example = true;
177         description = ''
178           Disable file downloads from Code.
179         '';
180         type = lib.types.bool;
181       };
183       disableWorkspaceTrust = lib.mkOption {
184         default = false;
185         example = true;
186         description = ''
187           Disable Workspace Trust feature.
188         '';
189         type = lib.types.bool;
190       };
192       disableGettingStartedOverride = lib.mkOption {
193         default = false;
194         example = true;
195         description = ''
196           Disable the coder/coder override in the Help: Getting Started page.
197         '';
198         type = lib.types.bool;
199       };
201     };
202   };
204   config = lib.mkIf cfg.enable {
205     systemd.services.code-server = {
206       description = "Code server";
207       wantedBy = [ "multi-user.target" ];
208       wants = [ "network-online.target" ];
209       after = [ "network-online.target" ];
210       path = cfg.extraPackages;
211       environment = {
212         HASHED_PASSWORD = cfg.hashedPassword;
213       } // cfg.extraEnvironment;
214       serviceConfig = {
215         ExecStart = ''
216           ${lib.getExe cfg.package} \
217             --auth=${cfg.auth} \
218             --bind-addr=${cfg.host}:${toString cfg.port} \
219           '' + lib.optionalString (cfg.socket != null) ''
220             --socket=${cfg.socket} \
221           '' + lib.optionalString (cfg.userDataDir != null) ''
222             --user-data-dir=${cfg.userDataDir} \
223           '' + lib.optionalString (cfg.extensionsDir != null) ''
224             --extensions-dir=${cfg.extensionsDir} \
225           '' + lib.optionalString (cfg.disableTelemetry == true) ''
226             --disable-telemetry \
227           '' + lib.optionalString (cfg.disableUpdateCheck == true) ''
228             --disable-update-check \
229           '' + lib.optionalString (cfg.disableFileDownloads == true) ''
230             --disable-file-downloads \
231           '' + lib.optionalString (cfg.disableWorkspaceTrust == true) ''
232             --disable-workspace-trust \
233           '' + lib.optionalString (cfg.disableGettingStartedOverride == true) ''
234             --disable-getting-started-override \
235           '' + lib.escapeShellArgs cfg.extraArguments;
236         ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
237         RuntimeDirectory = cfg.user;
238         User = cfg.user;
239         Group = cfg.group;
240         Restart = "on-failure";
241       };
242     };
244     users.users."${cfg.user}" = lib.mkMerge [
245       (lib.mkIf (cfg.user == defaultUser) {
246         isNormalUser = true;
247         description = "code-server user";
248         inherit (cfg) group;
249       })
250       {
251         packages = cfg.extraPackages;
252         inherit (cfg) extraGroups;
253       }
254     ];
256     users.groups."${defaultGroup}" = lib.mkIf (cfg.group == defaultGroup) { };
257   };
259   meta.maintainers = [ lib.maintainers.stackshadow ];