简介
Code Server 是什么?
Code Server 是 coder.com 开发的运行在远程服务器上的 VS Code。它将完整的 VS Code 体验搬到浏览器中,让你可以在任何设备上使用熟悉的 IDE,而无需在本地安装任何东西。
- 浏览器即开发环境:
Chromebook、平板、手机都能写代码
- 统一开发环境:团队成员无论用什么设备,都能获得一致的
VS Code 体验
- 服务器算力:编译、测试、下载等重活交给服务器,笔记本更省电
HAPI 是什么?
HAPI(GitHub: tiann/hapi)是一个让 AI 编程助手能够远程控制和协作的工具。它支持 Claude Code、Codex、Gemini、OpenCode 等主流 AI CLI,让你:
- 无缝切换:本地干一半,出门用手机继续
- AFK 审批:离开电脑?用手机一键审批
AI 的代码修改请求
- 终端随身带:通过
Web 界面或手机控制 AI 编程任务
- E2E 加密:
WireGuard + TLS 加密,数据安全有保障
HAPI 与 Happy 最大的区别,Happy 使用一个集中服务器来存储你的加密数据。HAPI 是去中心化的——每个用户运行自己的集线器,中继服务器只转发加密流量,不存储任何内容。
为什么选择 HAPI + Code Server?
相信很多开发者会遇到这些痛点:出门在外想改代码,身边只有手机;本地电脑配置不够,跑 AI CLI 时风扇狂转;甚至想躺着就能审核 AI 生成的代码。
HAPI + Code Server 的组合恰好能解决这些问题:
- Code Server 把
VS Code 搬到浏览器里——无论你用 iPad、手机还是借别人的电脑,浏览器一开就能写代码。
- HAPI 让
AI CLI 也能远程控制——人在外面也能用手机操作,让部署在服务器上的 AI 帮你写代码。
- 数据完全本地化——所有代码和项目数据都存储在你自己的设备上(如 NAS),隐私安全有保障。
这就是你的私有 AI 编程工作站:白天出门用手机指挥 AI 干活,晚上回家在平板上审核代码,全部围绕的是你自己的服务器,而不是依赖某个云厂商。对于注重数据隐私和希望构建个性化工作流的开发者而言,这无疑是一个极具吸引力的解决方案。
主要特点
- 浏览器即开发环境:
Code Server 让 VS Code 在浏览器中运行,无需本地安装
- AI 随时可用:集成
6 款主流 AI CLI(Claude Code、Codex、 Gemini、OpenCode、iFlow、Qwen Code)
- 远程控制:通过
HAPI 的 Web 界面或手机端远程控制 AI 编程任务
- 数据本地化:所有代码和数据存储在本地服务器上,隐私有保障
应用场景
- 在任何设备(电脑、平板、手机)上通过浏览器进行开发
- 外出时通过手机远程控制 AI 完成编程任务
- 利用服务器的大容量存储管理多个项目
- 企业内网部署,保护代码安全
安装
在服务器上以 Docker 方式安装。本次部署将 code-server 与 HAPI 结合,配置会有所不同。
准备工作
在服务器的 docker 文件夹中创建以下目录结构:
# 新建文件夹和子目录
mkdir -p /volume1/docker/code-server/{config,projects}
卷
| 文件夹 |
装载路径 |
说明 |
/volume1/docker/code-server/config |
/config |
配置目录 |
/volume1/docker/code-server/projects |
/config/workspace |
项目代码目录 |
端口
| 本地端口 |
容器端口 |
说明 |
3196 |
8443 |
Code Server Web UI |
3197 |
3197 |
HAPI 服务端口 |
环境变量
| 可变 |
值 |
说明 |
PUID |
1000 |
用户 UID |
PGID |
1000 |
用户 GID |
TZ |
Asia/Shanghai |
时区 |
PASSWORD |
admin123 |
Web 登录密码 |
SUDO_PASSWORD |
admin123 |
终端 sudo 密码 |
CODE_SERVER_PORT |
3196 |
Code Server 端口映射 |
DEFAULT_WORKSPACE |
/config/workspace |
默认工作目录 |
CLI_API_TOKEN |
admin123 |
HAPI API 令牌,建议使用强密码 |
HAPI_LISTEN_HOST |
0.0.0.0 |
HAPI 监听地址 |
HAPI_LISTEN_PORT |
3197 |
HAPI 监听端口 |
HAPI_PUBLIC_URL |
http://192.168.0.197:3197 |
网页分享链接 |
HAPI_API_URL |
http://192.168.0.197:3197 |
Runner 连接地址 |
⚠️ 请将 HAPI_PUBLIC_URL 和 HAPI_API_URL 中的 IP 地址替换为你的服务器实际 IP 地址
docker run 方式
如果你熟悉命令行,使用 docker cli 更快捷:
# 进入目录
cd /volume1/docker/code-server
# 运行容器
docker run -d \
--name ai-dev-vscode \
--restart unless-stopped \
-p 3196:8443 \
-p 3197:3197 \
-v $(pwd)/config:/config \
-v $(pwd)/projects:/config/workspace \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e PASSWORD=admin123 \
-e SUDO_PASSWORD=admin123 \
-e CODE_SERVER_PORT=3196 \
-e DEFAULT_WORKSPACE=/config/workspace \
-e CLI_API_TOKEN=admin123 \
-e HAPI_LISTEN_HOST=0.0.0.0 \
-e HAPI_LISTEN_PORT=3197 \
-e HAPI_PUBLIC_URL=http://192.168.0.197:3197 \
-e HAPI_API_URL=http://192.168.0.197:3197 \
linuxserver/code-server:latest
docker-compose 方式(推荐)
将以下内容保存为 docker-compose.yml 文件:
version: '3.8'
services:
code-server:
image: linuxserver/code-server:latest
container_name: ai-dev-vscode
restart: unless-stopped
shm_size: 512mb
ports:
- 3196:8443
- 3197:3197
volumes:
- ./config:/config
- ./projects:/config/workspace
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- PASSWORD=admin123
- SUDO_PASSWORD=admin123
- CODE_SERVER_PORT=3196
- DEFAULT_WORKSPACE=/config/workspace
- CLI_API_TOKEN=admin123
- HAPI_LISTEN_HOST=0.0.0.0
- HAPI_LISTEN_PORT=3197
- HAPI_PUBLIC_URL=http://192.168.0.197:3197
- HAPI_API_URL=http://192.168.0.197:3197
然后执行一键启动:
# 进入目录
cd /volume1/docker/code-server
# 一键启动
docker-compose up -d

安装 AI 编程环境
首次运行容器后,需要在容器内执行初始化脚本安装 AI CLI 和 HAPI。
采用脚本方式而非重写 Dockerfile 是为了保持灵活性,这样可以使用标准的 code-server 镜像,并能根据需要单独升级某个 AI CLI。
setup-code.sh
将下面的内容保存为安装脚本 setup-code.sh,放入到 config 目录中。

#!/usr/bin/env bash
set -euo pipefail
echo "🚀 [AI Dev Setup] 安装 Node.js + 6 个 AI CLI + HAPI (code-server 专用)..."
if [ "$(id -u)" -ne 0 ]; then
echo "❌ 请用 root 运行:docker exec -u root ai-dev-vscode /config/setup-code.sh"
exit 1
fi
have_cmd() {
command -v "$1" >/dev/null 2>&1
}
have_global_npm_pkg() {
local pkg="$1"
npm list -g "$pkg" --depth=0 >/dev/null 2>&1
}
echo "🔧 安装基础系统工具..."
apt-get update -y
apt-get install -y \
git curl vim tmux htop jq wget unzip \
build-essential ca-certificates \
python3 python3-pip
echo "🧹 清理系统中可能冲突的 nodejs/npm..."
apt-get purge -y nodejs npm || true
rm -rf /usr/bin/node /usr/bin/npm /usr/local/bin/node* /usr/local/bin/npm* || true
echo "🟦 用 NodeSource 安装 Node.js 22.x..."
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs
if ! have_cmd node; then
echo "❌ node 安装失败"
exit 1
fi
if ! have_cmd npm; then
echo "❌ npm 安装失败"
exit 1
fi
# npm cache 放在 /config/.npm,后面统一 chown 给 abc
mkdir -p /config/.npm
npm config set cache /config/.npm
echo "✅ Node: $(node -v)"
echo "✅ npm: $(npm -v)"
if have_cmd npx; then
echo "✅ npx: $(npx -v)"
else
echo "⚠️ 警告:npx 不在 PATH,后续使用 npx 相关命令可能失败。"
fi
echo "🛠 配置 npm 全局目录为 /usr/local..."
mkdir -p /usr/local/lib/node_modules /usr/local/bin
npm config set prefix /usr/local
npm config set audit false
npm config set fund false
echo "💾 安装 AI CLI(检测已安装则跳过)..."
# 1. Claude Code (@anthropic-ai/claude-code)
if have_cmd claude || have_global_npm_pkg "@anthropic-ai/claude-code"; then
echo " → Claude Code 已安装,跳过 (@anthropic-ai/claude-code)"
else
echo " → 安装 Claude Code (@anthropic-ai/claude-code)"
if ! npm install -g @anthropic-ai/claude-code@latest; then
echo "⚠️ Claude Code 安装失败,请稍后重试。"
fi
fi
# 2. Gemini CLI (@google/gemini-cli)
if have_cmd gemini || have_global_npm_pkg "@google/gemini-cli"; then
echo " → Gemini CLI 已安装,跳过 (@google/gemini-cli)"
else
echo " → 安装 Gemini CLI (@google/gemini-cli)"
if ! npm install -g @google/gemini-cli@latest; then
echo "⚠️ Gemini CLI 安装失败,请检查网络或包名。"
fi
fi
# 3. OpenAI Codex (@openai/codex)
if have_cmd codex || have_global_npm_pkg "@openai/codex"; then
echo " → OpenAI Codex 已安装,跳过 (@openai/codex)"
else
echo " → 安装 OpenAI Codex (@openai/codex)"
if ! npm install -g @openai/codex@latest; then
echo "⚠️ Codex 安装失败,请检查网络或包名。"
fi
fi
# 4. OpenCode (opencode-ai) - 修正包名为 opencode-ai(无 @)
if have_cmd opencode || have_global_npm_pkg "opencode-ai"; then
echo " → OpenCode 已安装,跳过 (opencode-ai)"
else
echo " → 安装 OpenCode CLI (opencode-ai)"
if npm install -g opencode-ai@latest; then
echo " → OpenCode npm 安装成功"
else
echo " → npm 安装失败,尝试官方一键脚本..."
curl -fsSL https://opencode.ai/install | bash || echo "⚠️ OpenCode 一键安装也失败,请手动检查网络/权限"
fi
fi
# 5. iFlow CLI (@iflow-ai/iflow-cli)
if have_cmd iflow || have_global_npm_pkg "@iflow-ai/iflow-cli"; then
echo " → iFlow CLI 已安装,跳过 (@iflow-ai/iflow-cli)"
else
echo " → 安装 iFlow CLI (@iflow-ai/iflow-cli)"
if ! npm install -g @iflow-ai/iflow-cli@latest; then
echo "⚠️ iFlow 安装失败,请检查网络或包名。"
fi
fi
# 6. Qwen Code (@qwen-code/qwen-code)
if have_cmd qwen-code || have_global_npm_pkg "@qwen-code/qwen-code"; then
echo " → Qwen Code 已安装,跳过 (@qwen-code/qwen-code)"
else
echo " → 安装 Qwen Code (@qwen-code/qwen-code)"
if ! npm install -g @qwen-code/qwen-code@latest; then
echo "⚠️ Qwen Code 安装失败,请检查网络或包名。"
fi
fi
echo "💾 安装 HAPI(全局)..."
# 7. HAPI (@twsxtd/hapi) - 你已经验证这条命令可用
if have_cmd hapi || have_global_npm_pkg "@twsxtd/hapi"; then
echo " → HAPI 已安装,跳过 (@twsxtd/hapi)"
else
echo " → 安装 HAPI (@twsxtd/hapi)"
if ! npm install -g @twsxtd/hapi@latest; then
echo "⚠️ HAPI 安装失败,请检查网络或包名。"
fi
fi
echo "📁 创建工作目录..."
mkdir -p /config/workspace/{go,node,python,rust,web}
echo "🧩 写入 /config/ai-init.sh..."
cat > /config/ai-init.sh << 'EOL'
#!/bin/bash
echo "🔧 AI Dev 环境加载..."
# AI CLI 别名
alias claude='claude'
alias gemini='gemini'
alias codex='codex'
alias opencode='opencode'
alias iflow='iflow'
alias qwen='qwen'
alias ll='ls -lah'
alias ws='cd /config/workspace && ls -la'
# HAPI 快捷命令(使用全局 hapi)
alias hapi-server='hapi hub --relay'
# 如果你更喜欢 server 模式,可以改成:
# alias hapi-server='hapi server --relay'
alias hapi='hapi'
# AI 状态检查
ai-status() {
echo "📁 当前目录: $(pwd)"
echo "🔧 AI CLI:"
command -v claude >/dev/null && echo " ✅ claude" || echo " ❌ claude"
command -v gemini >/dev/null && echo " ✅ gemini" || echo " ❌ gemini"
command -v codex >/dev/null && echo " ✅ codex" || echo " ❌ codex"
command -v opencode >/dev/null && echo " ✅ opencode" || echo " ❌ opencode"
command -v iflow >/dev/null && echo " ✅ iflow" || echo " ❌ iflow"
command -v qwen >/dev/null && echo " ✅ qwen" || echo " ❌ qwen"
command -v hapi >/dev/null && echo " ✅ hapi" || echo " ❌ hapi"
}
echo "✅ 运行 ai-status 测试!"
EOL
chmod +x /config/ai-init.sh
# ⚠️ 这里假设 abc 的 uid/gid 是 1000:1000,如不同请替换
chown -R 1000:1000 \
/config/workspace \
/usr/local/bin \
/usr/local/lib/node_modules \
/config/.npm
echo "✅ 安装完成!访问 http://192.168.0.197:3196"
echo "📋 密码: admin123"
echo "📋 终端: source /config/ai-init.sh && ai-status"
echo "📋 如需 HAPI: hapi server # 或直接 hapi"
⚠️ setup-code.sh 可以根据需要进行调整,用不上的 AI CLI 可以删除
容器首次启动后,执行一次安装脚本 setup-code.sh 即可完成环境初始化。
# 进入容器(以 root 身份)运行安装脚本
docker exec -u root ai-dev-vscode /config/setup-code.sh

脚本执行完成后,会输出安装成功的信息,此时你的私有 AI 编程 环境就准备就绪了。

运行
访问 Code Server
在浏览器中输入 http://服务器IP:3196

首次打开需要信任 workspace 目录,以获得完整功能。

你可以在扩展市场中搜索并安装中文语言包,让界面显示为简体中文。

访问 HAPI
HAPI 提供 Web 界面和远程控制功能。为了清晰演示其工作流程,我们通过在 code-server 中开启多个终端来模拟。
终端1:启动 HAPI Hub 服务
运行下面的命令,启动中心化的 HAPI Hub 服务。这为后续的远程连接和控制提供了基础。
# 启动 hapi hub 服务
hapi server

终端2:启动 AI 代理会话
以 opencode 为例,执行下面的命令来启动一个 AI 代理会话。这个会话将会注册到上一步启动的 Hub 中。
# 启动 AI 代理会话
hapi opencode

同样的方式也适用于 claude、gemini、codex 等其他集成的 AI CLI。hapi --help 命令可以查看所有支持的启动模式。

终端3:启动 HAPI Runner 服务
执行下面的命令运行 hapi runner 服务。它的作用是注册当前“机器”(即这个容器环境)到 Hub,使得网页端能够发现并远程启动或接入已有的 AI 会话。
# 启动 hapi runner 服务
hapi runner start

网页端访问
在浏览器中输入 http://服务器IP:3197
- 密码:
admin123 (即环境变量中设置的 CLI_API_TOKEN)

登录后,你会在主界面看到当前活跃的会话。例如,之前启动的 opencode 会话会显示在这里。

点击会话即可进入聊天界面,你可以在这里直接与远程的 AI 助手对话,下达编程指令。

此时,在 code-server 的终端里,你会看到两边是同步的,AI 在终端中执行任务,其输出和状态也会实时反馈到 Web 界面。

在 HAPI 的设置中,你还可以将默认语言更改为中文,以获得更好的本地化体验。

移动端访问
移动端的访问方式与网页端完全一致。在手机浏览器中输入相同的地址 http://服务器IP:3197,使用相同的密码登录。

登录后,你同样可以查看所有活跃的 AI 会话,并进行远程交互,真正实现“随时随地”的 vibe coding。

小结
这套方案为注重隐私和掌控感的开发者打造了一个本地优先的 AI 代理平台。它成功地将强大的云端 VS Code 体验和多种 AI 编程助手整合到你自己掌控的 Docker容器 中。
从安全角度出发,不建议将服务直接暴露到公网。对于远程访问需求,更安全的做法是使用 tailscale、zerotier 等工具组建虚拟内网,或者通过反向代理配置严格的访问控制。
现在,你已经拥有了一台可以随时随地进行 Vibe Coding 的个人工作站。它不仅能在电脑浏览器里提供完整的 Visual Studio Code 开发体验,更能让你在手机上轻松接入同一套 云原生开发环境,无缝继续你的创作。欢迎在 云栈社区 分享你的搭建经验和更多玩法。
参考文档
linuxserver/docker-code-server
地址:https://github.com/linuxserver/docker-code-server
tiann/hapi: App for Claude Code / Codex / Gemini / OpenCode, vibe coding anytime, anywhere
地址:https://github.com/tiann/hapi
HAPI - Vibe Coding Anytime, Anywhere
地址:https://hapi.run/
Quick Start | HAPI
地址:https://hapi.run/docs/guide/quick-start