菜单

架构

相关源文件

本文档概述了 code-server 的架构,解释了它如何实现 VS Code 在远程服务器上运行并通过 Web 浏览器访问。它涵盖了系统的核心组件及其交互,描述了从 CLI 参数到 HTTP 服务器初始化、VS Code 集成和代理功能的数据流。

概述

code-server 的架构围绕几个关键组件设计

  1. CLI 和配置:处理命令行参数、环境变量和配置文件
  2. 服务器初始化:创建 HTTP 服务器并初始化必要的中间件
  3. VS Code 集成:加载并集成 VS Code 以通过 Web 提供服务
  4. 身份验证:管理用户身份验证(基于密码或无)
  5. 代理:允许通过同一个 code-server 实例访问本地运行的服务

高层架构

来源:src/node/cli.ts src/node/entry.ts src/node/http.ts src/node/routes/index.ts src/node/routes/vscode.ts src/node/routes/pathProxy.ts src/node/routes/domainProxy.ts

启动流程

启动流程展示了 code-server 如何初始化,从解析命令行参数到启动服务器或连接到现有实例。

来源:src/node/entry.ts7-67 src/node/main.ts17-214 src/node/routes/index.ts31-180

CLI 和配置系统

CLI 系统负责处理命令行参数、配置文件和环境变量,以生成一组一致的配置选项。

CLI 处理流程

CLI 处理包括

  1. 解析参数:命令行参数通过 parse() 函数进行解析
  2. 读取配置:配置文件通过 readConfigFile() 读取
  3. 设置默认值:默认值通过 setDefaults() 应用
  4. 环境变量:处理 PASSWORDHASHED_PASSWORD 等环境变量

来源:src/node/cli.ts322-459 src/node/cli.ts501-631 src/node/entry.ts7-67

认证配置

Code-server 支持两种身份验证模式

身份验证类型描述配置
password基于密码的身份验证通过 --password--hashed-password$PASSWORD$HASHED_PASSWORD 配置
none无身份验证使用 --auth none 设置

来源:src/node/cli.ts8-16 src/node/routes/login.ts src/node/http.ts98-139

HTTP 服务器和路由

HTTP 服务器基于 Express.js 构建,同时处理 HTTP 和 WebSocket 连接。

路由架构

Express 路由器处理各种路由

  • 静态文件:从 /_static 路径提供静态资源
  • VS Code:在 //vscode 路径提供 VS Code
  • 身份验证:在 /login/logout 处理登录和登出
  • 代理:通过 /proxy/:port/* 和基于域名的代理管理代理
  • 健康检查:在 /healthz 提供健康检查

来源:src/node/routes/index.ts31-180 src/node/http.ts25-425

VS Code 集成

Code-server 通过动态加载其服务器模块并为其代理请求来与 VS Code 集成。

VS Code 加载和请求处理

VS Code 集成包括

  1. 加载 VS Code:动态加载 VS Code 服务器模块
  2. 创建服务器:创建 VS Code 服务器实例
  3. 请求处理:将 HTTP 和 WebSocket 请求代理到 VS Code 服务器

来源:src/node/routes/vscode.ts27-248 src/node/routes/index.ts164-167

代理系统

code-server 的一个独特功能是其代理能力,允许通过相同的身份验证层访问服务器上运行的 Web 服务。

基于路径的代理

基于路径的代理工作方式如下:

  1. 请求捕获:捕获对 /proxy/:port/* 的请求
  2. 身份验证检查:验证用户是否已通过身份验证
  3. 代理:将请求转发到指定端口上运行的本地服务

来源:src/node/routes/pathProxy.ts8-73 src/node/http.ts80-95

基于域名的代理

基于域名的代理使用 code-8080.domain.tld 这样的模式来代理到本地端口。

来源:src/node/routes/domainProxy.ts8-108

认证系统

身份验证系统通过基于密码的身份验证来保护 code-server 的访问。

登录流程

身份验证系统

  1. 登录处理:通过各种方法(明文、SHA256、Argon2)验证密码
  2. 会话管理:使用安全 cookie 来维护身份验证状态
  3. 速率限制:限制登录尝试次数以防止暴力破解攻击

来源: src/node/routes/login.ts11-121 src/node/http.ts98-139 src/node/util.ts134-291

可扩展性和自定义

Code-server 支持多种自定义,包括:

功能描述配置
自定义域名代理到特定服务--proxy-domain
自定义区域设置设置 UI 语言--locale
自定义欢迎文本自定义登录页面--welcome-text
自定义应用名称更改应用名称--app-name
遥测启用/禁用遥测--disable-telemetry

来源: src/node/cli.ts63-291 patches/telemetry.diff patches/display-language.diff

通信架构

下图显示了 code-server 的不同组件如何相互通信

来源: src/node/routes/index.ts31-180 src/node/wsRouter.ts7-83 src/node/routes/vscode.ts27-248

数据流

此图说明了用户与 code-server 交互时的数据流

来源: src/node/main.ts120-214 src/node/routes/vscode.ts27-248

结论

Code-server 的架构巧妙地结合了几个关键组件,可在浏览器中提供无缝的 VS Code 体验

  1. 强大的 CLI 和配置系统,提供广泛的自定义选项
  2. 基于 Express 的 HTTP 服务器,负责路由和中间件
  3. 无缝的 VS Code 集成,加载并提供 VS Code 的 Web 客户端
  4. 灵活的代理系统,用于通过 code-server 访问 Web 服务
  5. 安全的身份验证系统,用于保护访问

这种架构使开发人员能够随时随地访问其开发环境,同时保持完整的 VS Code 体验,包括扩展、终端访问和调试功能。