基于code-server打造私有AI编程工作站

简介
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 的代码:让
AI干完活,醒来再审批
HAPI + Code Server 的组合完美解决这些问题:
- Code Server 把
VS Code搬到浏览器里——无论你用iPad、手机还是借别人的电脑,浏览器一开就能写代码 - HAPI 让
AI CLI也能远程控制——人在外面也能手机点点,让群晖上的AI帮你写代码 - 数据完全本地化——代码存在自己的群晖上,不用担心泄露到第三方云服务
这就是你的私有 AI 编程工作站:白天出门用手机指挥 AI 干活,晚上回家在平板上审核代码,全部围绕的是你自己的群晖,而不是某个云厂商。
主要特点
- 浏览器即开发环境:
Code Server让VS Code在浏览器中运行,无需本地安装 - AI 随时可用:集成
6款主流AI CLI(Claude Code、Codex、Gemini、OpenCode、iFlow、Qwen Code) - 远程控制:通过
HAPI的Web界面或手机端远程控制AI编程任务 - 数据本地化:所有代码和数据存储在群晖上,隐私有保障
应用场景
- 在任何设备(电脑、平板、手机)上通过浏览器进行开发
- 外出时通过手机远程控制 AI 完成编程任务
- 利用群晖的大容量存储管理多个项目
- 企业内网部署,保护代码安全
hapi 功能演示
安装
在群晖上以 Docker 方式安装。
关于 code-server 可以看老苏之前写的文章,但本次结合了 HAPI,所以会有一些变化
文章传送门:在线代码编辑器code-server
准备工作
在群晖的 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可以删除
第一次启动后,或者在 code-server 变更了后,执行一次安装脚本 setup-code.sh 即可
# 进入容器(以 root 身份)运行安装脚本
docker exec -u root ai-dev-vscode /config/setup-code.sh

执行完成后,就可以开始使用了

运行
访问 Code Server
在浏览器中输入 http://群晖IP:3196
- 密码:
admin123

需要信任 workspace 目录

安装中文插件之后,可以让界面显示中文

访问 HAPI
HAPI 提供 Web 界面和远程控制功能,为了方便说明,老苏拆解后进行演示和说明
在 code-server 开启三个终端
终端1
运行下面👇的命令, 提供中心服务 HAPI Hub
# 启动 hapi hub 服务
hapi server

终端2
以 opencode 为例,在 opencode 能正常运行后,执行下面的命令,启动 AI 代理会话
# 启动 AI 代理会话
hapi opencode

如果你是用 claude 也是一样的,可以用 hapi 启动

除此之外,还支持 gemini、codex 等

终端3
执行下面的命令运行 hapi runner服务,它负责注册机器到 Hub,让网页能看到并远程启动会话
# 启动 hapi runner 服务
hapi runner start

网页
在浏览器中输入 http://群晖IP:3197
- 密码:
admin123

登录后的主界面

会看到有一个 opencode 的会话

回到 code-server

你会发现两边是同步的

通过设置,可以将 HAPI 的默认语言改为中文

移动端
跟网页端是一样的密码

也能同步看到任务的进行

小结
这是老苏为热爱自由的开发者打造的本地优先 AI 代理平台。以上只是抛砖引玉,从安全角度出发,老苏不建议暴露到公网,远程访问建议使用 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
更多推荐



所有评论(0)