From 2c95ebadf3d0c607921920a6ee1a64a492168dd9 Mon Sep 17 00:00:00 2001 From: Pol Dellaiera Date: Wed, 17 May 2023 08:22:11 +0200 Subject: [PATCH] nixos/code-server: add more command line options --- .../modules/services/web-apps/code-server.nix | 222 +++++++++++++----- 1 file changed, 166 insertions(+), 56 deletions(-) diff --git a/nixos/modules/services/web-apps/code-server.nix b/nixos/modules/services/web-apps/code-server.nix index 24e34e0c5833..fa7d4a348c23 100644 --- a/nixos/modules/services/web-apps/code-server.nix +++ b/nixos/modules/services/web-apps/code-server.nix @@ -1,107 +1,199 @@ { config, lib, pkgs, ... }: -with lib; let - cfg = config.services.code-server; defaultUser = "code-server"; defaultGroup = defaultUser; - in { - ###### interface options = { services.code-server = { - enable = mkEnableOption (lib.mdDoc "code-server"); + enable = lib.mkEnableOption (lib.mdDoc "code-server"); - package = mkOption { - default = pkgs.code-server; - defaultText = lib.literalExpression "pkgs.code-server"; - description = lib.mdDoc "Which code-server derivation to use."; - type = types.package; - }; + package = lib.mkPackageOptionMD pkgs "code-server" { }; - extraPackages = mkOption { + extraPackages = lib.mkOption { default = [ ]; - description = lib.mdDoc "Packages that are available in the PATH of code-server."; - example = "[ pkgs.go ]"; - type = types.listOf types.package; + description = lib.mdDoc '' + Additional packages to add to the code-server {env}`PATH`. + ''; + example = lib.literalExpression "[ pkgs.go ]"; + type = lib.types.listOf lib.types.package; }; - extraEnvironment = mkOption { - type = types.attrsOf types.str; - description = - lib.mdDoc "Additional environment variables to passed to code-server."; + extraEnvironment = lib.mkOption { + type = lib.types.attrsOf lib.types.str; + description = lib.mdDoc '' + Additional environment variables to pass to code-server. + ''; default = { }; example = { PKG_CONFIG_PATH = "/run/current-system/sw/lib/pkgconfig"; }; }; - extraArguments = mkOption { - default = [ "--disable-telemetry" ]; - description = lib.mdDoc "Additional arguments that passed to code-server"; - example = ''[ "--verbose" ]''; - type = types.listOf types.str; + extraArguments = lib.mkOption { + default = [ ]; + description = lib.mdDoc '' + Additional arguments to pass to code-server. + ''; + example = lib.literalExpression ''[ "--log=info" ]''; + type = lib.types.listOf lib.types.str; }; - host = mkOption { - default = "127.0.0.1"; - description = lib.mdDoc "The host-ip to bind to."; - type = types.str; + host = lib.mkOption { + default = "localhost"; + description = lib.mdDoc '' + The host name or IP address the server should listen to. + ''; + type = lib.types.str; }; - port = mkOption { + port = lib.mkOption { default = 4444; - description = lib.mdDoc "The port where code-server runs."; - type = types.port; + description = lib.mdDoc '' + The port the server should listen to. + ''; + type = lib.types.port; }; - auth = mkOption { + auth = lib.mkOption { default = "password"; - description = lib.mdDoc "The type of authentication to use."; - type = types.enum [ "none" "password" ]; + description = lib.mdDoc '' + The type of authentication to use. + ''; + type = lib.types.enum [ "none" "password" ]; }; - hashedPassword = mkOption { + hashedPassword = lib.mkOption { default = ""; - description = - lib.mdDoc "Create the password with: `echo -n 'thisismypassword' | npx argon2-cli -e`."; - type = types.str; + description = lib.mdDoc '' + Create the password with: `echo -n 'thisismypassword' | npx argon2-cli -e`. + ''; + type = lib.types.str; }; - user = mkOption { + user = lib.mkOption { default = defaultUser; example = "yourUser"; description = lib.mdDoc '' The user to run code-server as. By default, a user named `${defaultUser}` will be created. ''; - type = types.str; + type = lib.types.str; }; - group = mkOption { + group = lib.mkOption { default = defaultGroup; example = "yourGroup"; description = lib.mdDoc '' The group to run code-server under. By default, a group named `${defaultGroup}` will be created. ''; - type = types.str; + type = lib.types.str; }; - extraGroups = mkOption { + extraGroups = lib.mkOption { default = [ ]; - description = - lib.mdDoc "An array of additional groups for the `${defaultUser}` user."; + description = lib.mdDoc '' + An array of additional groups for the `${defaultUser}` user. + ''; example = [ "docker" ]; - type = types.listOf types.str; + type = lib.types.listOf lib.types.str; + }; + + socket = lib.mkOption { + default = null; + example = "/run/code-server/socket"; + description = lib.mdDoc '' + Path to a socket (bind-addr will be ignored). + ''; + type = lib.types.nullOr lib.types.str; + }; + + socketMode = lib.mkOption { + default = null; + description = lib.mdDoc '' + File mode of the socket. + ''; + type = lib.types.nullOr lib.types.str; + }; + + userDataDir = lib.mkOption { + default = null; + description = lib.mdDoc '' + Path to the user data directory. + ''; + type = lib.types.nullOr lib.types.str; + }; + + extensionsDir = lib.mkOption { + default = null; + description = lib.mdDoc '' + Path to the extensions directory. + ''; + type = lib.types.nullOr lib.types.str; + }; + + proxyDomain = lib.mkOption { + default = null; + example = "code-server.lan"; + description = lib.mdDoc '' + Domain used for proxying ports. + ''; + type = lib.types.nullOr lib.types.str; + }; + + disableTelemetry = lib.mkOption { + default = false; + example = true; + description = lib.mdDoc '' + Disable telemetry. + ''; + type = lib.types.bool; + }; + + disableUpdateCheck = lib.mkOption { + default = false; + example = true; + description = lib.mdDoc '' + Disable update check. + Without this flag, code-server checks every 6 hours against the latest github release and + then notifies you once every week that a new release is available. + ''; + type = lib.types.bool; + }; + + disableFileDownloads = lib.mkOption { + default = false; + example = true; + description = lib.mdDoc '' + Disable file downloads from Code. + ''; + type = lib.types.bool; + }; + + disableWorkspaceTrust = lib.mkOption { + default = false; + example = true; + description = lib.mdDoc '' + Disable Workspace Trust feature. + ''; + type = lib.types.bool; + }; + + disableGettingStartedOverride = lib.mkOption { + default = false; + example = true; + description = lib.mdDoc '' + Disable the coder/coder override in the Help: Getting Started page. + ''; + type = lib.types.bool; }; }; }; - ###### implementation - config = mkIf cfg.enable { + config = lib.mkIf cfg.enable { systemd.services.code-server = { - description = "VSCode server"; + description = "Code server"; wantedBy = [ "multi-user.target" ]; after = [ "network-online.target" ]; path = cfg.extraPackages; @@ -109,18 +201,37 @@ in { HASHED_PASSWORD = cfg.hashedPassword; } // cfg.extraEnvironment; serviceConfig = { - ExecStart = "${cfg.package}/bin/code-server --bind-addr ${cfg.host}:${toString cfg.port} --auth ${cfg.auth} " + lib.escapeShellArgs cfg.extraArguments; + ExecStart = '' + ${lib.getExe cfg.package} \ + --auth=${cfg.auth} \ + --bind-addr=${cfg.host}:${toString cfg.port} \ + '' + lib.optionalString (cfg.socket != null) '' + --socket=${cfg.socket} \ + '' + lib.optionalString (cfg.userDataDir != null) '' + --user-data-dir=${cfg.userDataDir} \ + '' + lib.optionalString (cfg.extensionsDir != null) '' + --extensions-dir=${cfg.extensionsDir} \ + '' + lib.optionalString (cfg.disableTelemetry == true) '' + --disable-telemetry \ + '' + lib.optionalString (cfg.disableUpdateCheck == true) '' + --disable-update-check \ + '' + lib.optionalString (cfg.disableFileDownloads == true) '' + --disable-file-downloads \ + '' + lib.optionalString (cfg.disableWorkspaceTrust == true) '' + --disable-workspace-trust \ + '' + lib.optionalString (cfg.disableGettingStartedOverride == true) '' + --disable-getting-started-override \ + '' + lib.escapeShellArgs cfg.extraArguments; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; RuntimeDirectory = cfg.user; User = cfg.user; Group = cfg.group; Restart = "on-failure"; }; - }; - users.users."${cfg.user}" = mkMerge [ - (mkIf (cfg.user == defaultUser) { + users.users."${cfg.user}" = lib.mkMerge [ + (lib.mkIf (cfg.user == defaultUser) { isNormalUser = true; description = "code-server user"; inherit (cfg) group; @@ -131,9 +242,8 @@ in { } ]; - users.groups."${defaultGroup}" = mkIf (cfg.group == defaultGroup) { }; - + users.groups."${defaultGroup}" = lib.mkIf (cfg.group == defaultGroup) { }; }; - meta.maintainers = with maintainers; [ stackshadow ]; + meta.maintainers = [ lib.maintainers.stackshadow ]; }