我用workbuddy连接我的Linux 腾讯云服务器安装了workbuddy,编写了自动签到脚本,然后让它输出了部署脚本


WorkBuddy 服务器部署教程(通用版 · 从零开始)
适用对象:任何人拿到一台已装 Docker 的 Linux 服务器,照本教程即可部署 WorkBuddy 桌面端,并通过浏览器远程登录使用;可选再加"每日自动签到"。
本教程不依赖任何已有环境,所有脚本均内嵌,复制即可用。
测试基线:WorkBuddy 5.5.6,容器基于 ubuntu:22.04(glibc 2.35,规避老系统 glibc 过低问题)。
⚠️ 先读:本文含两部分,可独立使用
- 【核心 · 必装】第 1~5 节:在服务器用 Docker 跑起 WorkBuddy 桌面,并通过浏览器 noVNC 登录使用。全程不需要任何 token,用你自己的 WorkBuddy 账号正常登录即可。
- 【可选 · 附加】第 6 节(附录):若想再加"每天 00:05 自动签到",脚本直接读取已登录容器里的 token,你无需手动导出/粘贴任何明文 token。
一句话:装来用 = 不用 token;要自动签到 = 也不用手动给 token(容器登录后自动就有,脚本自己去拿)。
第一部分:核心部署
0. 前置条件
- 一台已安装 Docker 的 Linux 服务器(CentOS 7 / Ubuntu 等均可;WorkBuddy 跑在容器内,不受宿主机 glibc 限制)。
- 在云厂商防火墙/安全组放行 8000/TCP(noVNC 网页用)。
- 你自己的 WorkBuddy 账号(登录用,无需导出 token)。
- 文档中 <你的服务器公网IP> / <VNC密码> 为占位符,请替换为实际值。
1. 建工作目录并下载官方 deb
mkdir -p /opt/wb-build && cd /opt/wb-build
# 动态获取最新 deb 下载地址
DEB_URL=$(curl -s "https://copilot.tencent.com/v2/update?platform=workbuddy-linux-x64-deb" \\
| grep -o '"url":"[^"]*"' | head -1 | sed 's/"url":"//; s/"$//')
echo "deb url: $DEB_URL"
curl -L -o WorkBuddy.deb "$DEB_URL"
ls -lh WorkBuddy.deb # 约 400MB+ 属正常
若 curl -o 被环境限制,改用:python3 -c "import urllib.request;urllib.request.urlretrieve('$DEB_URL','WorkBuddy.deb')"
2. Dockerfile(依赖一次装全)
cat > Dockerfile <<'DOCKERFILE'
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
# WorkBuddy 运行依赖 + 桌面/VNC 桥接组件(官方 .deb 漏了 libasound2/libpulse0,必须补)
RUN apt-get update && apt-get install -y \\
libgtk-3-0 libnotify4 libnss3 libxss1 libxtst6 xdg-utils \\
libatspi2.0-0 libuuid1 libsecret-1-0 libappindicator3-1 \\
libgbm1 libdrm2 libxkbcommon0 libxshmfence1 \\
libasound2 libpulse0 ca-certificates \\
xvfb x11vnc novnc websockify \\
&& rm -rf /var/lib/apt/lists/*
COPY WorkBuddy.deb /tmp/wb.deb
RUN dpkg -i /tmp/wb.deb || apt-get install -f -y
RUN rm -f /tmp/wb.deb
COPY start.sh /start.sh
RUN chmod +x /start.sh
CMD ["/start.sh"]
DOCKERFILE
3. 启动脚本 start.sh
cat > start.sh <<'SCRIPT'
#!/bin/bash
set -e
VNC_PASS="${VNC_PASS:-wbvnc2026}"
# 关键:清掉上一次残留的 X 锁/socket,否则 docker restart 后 Xvfb 会拒启动
rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock
# 首次运行生成 VNC 密码文件(可用 -e VNC_PASS=xxx 覆盖)
if [ ! -f /root/.x11vnc.pass ]; then
x11vnc -storepasswd "$VNC_PASS" /root/.x11vnc.pass
fi
# 起虚拟显示器
Xvfb :99 -screen 0 1280x800x24 >/dev/null 2>&1 &
# 等 X socket 真正就绪
for i in $(seq 1 30); do
[ -e /tmp/.X11-unix/X99 ] && break
sleep 0.5
done
sleep 1
# 起 WorkBuddy 桌面 + VNC 桥接
/opt/WorkBuddy/workbuddy –no-sandbox >/wb.log 2>&1 &
x11vnc -display :99 -forever -rfbport 5900 -rfbauth /root/.x11vnc.pass -shared >/x11vnc.log 2>&1 &
websockify –web /usr/share/novnc 8000 localhost:5900 >/websockify.log 2>&1 &
wait
SCRIPT
chmod +x start.sh
4. 构建并启动容器
docker build -t workbuddy:latest .
docker run –rm workbuddy:latest /opt/WorkBuddy/workbuddy –no-sandbox –version # 退出码 0 即通过
docker run -d \\
–name workbuddy \\
–restart unless-stopped \\
-p 8000:8000 \\
-e DISPLAY=:99 \\
-e VNC_PASS=<你的VNC密码> \\
workbuddy:latest
sleep 5
docker ps –filter name=workbuddy
docker exec workbuddy bash -c "(ss -ltnp || netstat -ltnp) | grep -E '5900|8000'"
docker exec workbuddy bash -c "ps aux | grep -E 'Xvfb|x11vnc|websockify|WorkBuddy' | grep -v grep"
- -p 8000:8000:把容器 8000(websockify/noVNC) 发布到宿主机。
- –restart unless-stopped:服务器/容器重启后自动拉起(配合 start.sh 清锁,VNC 也会恢复)。
- VNC_PASS:换成你自己的强密码。
5. 浏览器登录 WorkBuddy(无头环境)
若登录卡在 Signing In…(容器里没浏览器,xdg-open 失败),用无头登录兜底法:
在 noVNC 里点登录后,App 会把登录链接打印到 /wb.log,回到服务器终端抓最新一条:
把输出的 URL 复制到你本地电脑的浏览器打开 → 登录/扫码授权 → noVNC 里的 WorkBuddy 自动完成登录。链接过期就点 Retry Sign In 再抓一次。
docker exec workbuddy grep -oE 'https://www.workbuddy.cn/login[^ ]+' /wb.log | tail -1
6. 日常运维
docker restart workbuddy # 重启,~6s 后 VNC 自动恢复
docker logs -f workbuddy # 看容器日志
docker stop workbuddy / docker start workbuddy
# 重新抓登录链接(兜底登录用)
docker exec workbuddy grep -oE 'https://www.workbuddy.cn/login[^ ]+' /wb.log | tail -1
第二部分:可选附加 —— 每日 00:05 自动签到(直接读容器里的 token)
仅当你想要"无人值守自动签到"时才做本节。 仅为了用 WorkBuddy 桌面,跳过本节即可。
核心改进:容器里 WorkBuddy 登录成功后,token 已经是明文 JWT 存在容器内
/root/.local/share/CodeBuddyExtension/Data/Public/auth/workbuddy-desktop.info。
自动签到脚本直接用 docker exec 从容器读这个文件即可,无需你手动导出/粘贴任何明文 token。
A. 前提
- 第一部分已完成,且你已在 noVNC 里登录过 WorkBuddy 桌面(容器里已有有效 token)。
- 宿主机上 docker 命令可用(cron 脚本会调用 docker exec)。
B. 部署签到脚本(读容器 token,无需 cred.json)
mkdir -p /opt/workbuddy-signin
cat > /opt/workbuddy-signin/signin_server.py <<'PYEOF'
#!/usr/bin/env python3
# 从已登录的 WorkBuddy 容器内直接读取 token 并签到(无需手动导出明文 token)
import json, subprocess, urllib.request, urllib.error, sys
CONTAINER = "workbuddy"
AUTH_FILE = "/root/.local/share/CodeBuddyExtension/Data/Public/auth/workbuddy-desktop.info"
BASE = "https://copilot.tencent.com/v2/billing/meter"
UA = "WorkBuddy"
def load_token():
out = subprocess.check_output(["docker", "exec", CONTAINER, "cat", AUTH_FILE], text=True)
d = json.loads(out)
auth = d.get("auth", {})
token = auth.get("accessToken")
if not token or token.startswith("$wbEncrypted"):
sys.exit("NOT_LOGGED_IN: 容器内 WorkBuddy 尚未登录,请先在 noVNC 登录")
return {"token": token,
"uid": d.get("account", {}).get("uid", ""),
"domain": auth.get("domain", "www.codebuddy.cn")}
def post(path, cred):
req = urllib.request.Request(
BASE + path, data=b"{}",
headers={
"Authorization": "Bearer " + cred["token"],
"X-User-Id": cred.get("uid", ""),
"User-Agent": UA,
"Content-Type": "application/json",
},
method="POST")
try:
with urllib.request.urlopen(req, timeout=20) as r:
return json.loads(r.read().decode())
except urllib.error.HTTPError as e:
try:
return json.loads(e.read().decode())
except Exception:
return {"_error": e.reason}
def dig(o, k):
if isinstance(o, dict):
if k in o:
return o[k]
for v in o.values():
r = dig(v, k)
if r is not None:
return r
elif isinstance(o, list):
for v in o:
r = dig(v, k)
if r is not None:
return r
return None
def main():
cred = load_token()
st = post("/checkin-activity-status", cred)
if dig(st, "today_checked_in") is True:
print("ALREADY_CHECKED_IN")
return
r = post("/daily-checkin", cred)
if dig(r, "today_checked_in") is True or dig(r, "code") == 10001:
print("CHECKIN_OK credit=%s" % dig(r, "credit"))
else:
print("CHECKIN_FAILED", json.dumps(r, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
PYEOF
chmod +x /opt/workbuddy-signin/signin_server.py
# 写入 cron:每天 00:05
(crontab -l 2>/dev/null | grep -v workbuddy-signin; \\
echo "5 0 * * * /usr/bin/python3 /opt/workbuddy-signin/signin_server.py >> /opt/workbuddy-signin/cron.log 2>&1") | crontab –
C. 验证
python3 /opt/workbuddy-signin/signin_server.py
# 期望输出 ALREADY_CHECKED_IN 或 CHECKIN_OK credit=…
若输出 NOT_LOGGED_IN:说明容器里 WorkBuddy 还没登录,先去 noVNC 登录一次即可。token 随登录自动刷新,脚本每次实时读取,无需任何手动维护。
常见问题(FAQ)
Q1:docker restart 后 noVNC 打不开/黑屏?
A:几乎都是 Xvfb 没起来。确认 start.sh 开头有 rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock(清残留锁)。这是 docker restart 复用容器文件系统层导致的经典坑,脚本已处理。
Q2:点登录卡在 Signing In…?
A:容器无浏览器,xdg-open 失败。按第 5 节"无头登录兜底法"从 /wb.log 抓链接到本地浏览器授权即可(核心使用无需 token,这只是登录通道问题)。
Q3:只装 WorkBuddy 桌面、不要自动签到,可以吗?
A:完全可以。只做第一部分(第 1~6 节),跳过第二部分的自动签到即可,两者无关。
Q4:自动签到输出 NOT_LOGGED_IN / CHECKIN_FAILED?
A:NOT_LOGGED_IN = 容器里 WorkBuddy 还没登录,先去 noVNC 登录一次;CHECKIN_FAILED 多半是接口返回字段名变了,按完整响应微调脚本里 dig() 的取值键。脚本每次实时读容器 token,不需要你手动维护 token。
Q5:升级 WorkBuddy 版本?
A:重新执行第 1 节下载新 deb → docker build -t workbuddy:latest . → docker rm -f workbuddy && docker run …(命令同第 4 节)。
Q6:安全加固?
A:8000 默认公网开放 + 仅 VNC 密码。长期暴露建议:① 改强 VNC_PASS;② 改用 SSH 隧道 ssh -L 8000:localhost:8000 root@<服务器IP>(不开公网端口);③ 或在防火墙关掉 8000 公网暴露。
一句话流程
用 WorkBuddy:下载 deb → Dockerfile 装全依赖+Xvfb/VNC 构建镜像 → docker run -p 8000:8000 –restart unless-stopped → 浏览器开 noVNC → 用自己的账号直接登录(无 token)。
要自动签到(可选):登录后容器里已有明文 token → 部署读容器 token 的 signin_server.py + cron,脚本自己 docker exec 去拿,无需手动给 token。
两个坑:/tmp/.X99-lock 残留锁导致 restart 后 Xvfb 起不来(start.sh 已清)、无头环境 xdg-open 无浏览器(从 /wb.log 抓登录链接本地授权)。

