diff --git a/.gitignore b/.gitignore index 99cc47e6..4b45161e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ build dist* out* -release* +release/ node_modules binaries diff --git a/ci/release-image/Dockerfile b/ci/release-image/Dockerfile index 14854e4b..9e30d30d 100644 --- a/ci/release-image/Dockerfile +++ b/ci/release-image/Dockerfile @@ -40,4 +40,4 @@ RUN cd /tmp && tar -xzf code-server*.tar.gz && rm code-server*.tar.gz && \ EXPOSE 8080 USER coder WORKDIR /home/coder -ENTRYPOINT ["dumb-init", "fixuid", "-q", "/usr/local/bin/code-server", "--host", "0.0.0.0", "."] +ENTRYPOINT ["dumb-init", "fixuid", "-q", "/usr/local/bin/code-server", "--bind-addr", "0.0.0.0:8080", "."] diff --git a/src/node/cli.ts b/src/node/cli.ts index 0bb0364e..b2e7a2a5 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -30,6 +30,7 @@ export interface Args extends VsArgs { log?: LogLevel readonly open?: boolean readonly port?: number + readonly "bind-addr"?: string readonly socket?: string readonly version?: boolean readonly force?: boolean @@ -88,11 +89,16 @@ const options: Options> = { "cert-key": { type: "string", path: true, description: "Path to certificate key when using non-generated cert." }, "disable-updates": { type: "boolean", description: "Disable automatic updates." }, "disable-telemetry": { type: "boolean", description: "Disable telemetry." }, - host: { type: "string", description: "Host for the HTTP server." }, help: { type: "boolean", short: "h", description: "Show this output." }, json: { type: "boolean" }, open: { type: "boolean", description: "Open in browser on startup. Does not work remotely." }, - port: { type: "number", description: "Port for the HTTP server." }, + + "bind-addr": { type: "string", description: "Address to bind to in host:port." }, + + // These two have been deprecated by bindAddr. + host: { type: "string", description: "" }, + port: { type: "number", description: "" }, + socket: { type: "string", path: true, description: "Path to a socket (host and port will be ignored)." }, version: { type: "boolean", short: "v", description: "Display version information." }, _: { type: "string[]" }, diff --git a/src/node/entry.ts b/src/node/entry.ts index 49fff6f4..e8e3b00b 100644 --- a/src/node/entry.ts +++ b/src/node/entry.ts @@ -35,13 +35,21 @@ const main = async (args: Args): Promise => { const auth = args.auth || AuthType.Password const originalPassword = auth === AuthType.Password && (process.env.PASSWORD || (await generatePassword())) + let host = args.host + let port = args.port + if (args["bind-addr"] !== undefined) { + const u = new URL(`http://${args["bind-addr"]}`) + host = u.hostname + port = parseInt(u.port, 10) + } + // Spawn the main HTTP server. const options: HttpServerOptions = { auth, commit, - host: args.host || (args.auth === AuthType.Password && typeof args.cert !== "undefined" ? "0.0.0.0" : "localhost"), + host: host || (args.auth === AuthType.Password && args.cert !== undefined ? "0.0.0.0" : "localhost"), password: originalPassword ? hash(originalPassword) : undefined, - port: typeof args.port !== "undefined" ? args.port : process.env.PORT ? parseInt(process.env.PORT, 10) : 8080, + port: port !== undefined ? port : process.env.PORT ? parseInt(process.env.PORT, 10) : 8080, proxyDomains: args["proxy-domain"], socket: args.socket, ...(args.cert && !args.cert.value diff --git a/test/cli.test.ts b/test/cli.test.ts index 2b222bc6..41489a03 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -19,6 +19,7 @@ describe("cli", () => { it("should parse all available options", () => { assert.deepEqual( parse([ + "--bind-addr=192.169.0.1:8080", "--auth", "none", "--extensions-dir", @@ -74,6 +75,7 @@ describe("cli", () => { "user-data-dir": path.resolve("bar"), verbose: true, version: true, + "bind-addr": "192.169.0.1:8080", }, ) }) @@ -117,6 +119,7 @@ describe("cli", () => { assert.throws(() => parse(["--auth=", "--log=debug"]), /--auth requires a value/) assert.throws(() => parse(["--auth", "--log"]), /--auth requires a value/) assert.throws(() => parse(["--auth", "--invalid"]), /--auth requires a value/) + assert.throws(() => parse(["--bind-addr"]), /--bind-addr requires a value/) }) it("should error if value is invalid", () => {