用 Happy 在手机上控制 Claude Code:从安装到自建服务器

VibeCoding 大半年,最大的感受是:。一个需求跑大半天,高峰期 API 限速更是雪上加霜。你想走开干点别的,又怕 AI 卡在权限弹窗上等你审批——走也不是,守也不是。

实践久了之后会发现: VibeCoding 需要的不是持续盯盘,而是一种间歇性、片段化的持续注意力
AI 自己跑着就行,你只在关键节点出现——审批权限、纠正方向、拍板决策。你不是监控器,你是把关人。

Happy Coder 恰好解决了两个问题:

  • “守”——手机随时查看进度、审批、发指令,不用守在电脑前。
  • “等”——通勤路上掏出手机接着推需求,碎片时间变生产力。

这篇文章分享一下我从零开始用 Happy 的全过程,覆盖日常使用、后台常驻、开机自启、以及自建服务器。

快速上手:五分钟连上手机

安装 happy-cli

前提是你已经装好了 Claude Codeclaude 命令可用)。然后一行命令搞定:

1
npm install -g happy

下载手机端 APP

iOS 去 App Store,Android 去 Google Play,搜 “Happy Coder” 就能找到。APP 免费,下载安装即可。

扫码连接

在电脑端运行:

1
happy auth login

终端里会显示一个二维码。打开手机上的 Happy Coder APP,扫码完成配对。认证信息存储在本地 ~/.happy/ 目录下,私钥不会离开你的设备。

启动第一个会话

直接运行:

1
happy

和直接运行 claude 的区别在于,happy 启动的会话可以被手机端实时看到和控制。你在电脑终端输入的内容会同步显示在手机上,反过来也一样。手机端接管会话后,想切回电脑操作,在终端按任意键就行,切换是无缝的,会话不会中断

顺便提一句,Happy 不只支持 Claude,还支持 CodexGemini 等:

1
2
happy codex       # 启动 Codex 会话
happy gemini # 启动 Gemini CLI 会话

后台常驻:让手机随时发起会话

上面 happy 命令需要手动启动,关掉终端会话就断了。如果我想随时随地从手机发起会话,电脑上得有个常驻后台的服务。这就是 daemon(守护进程) 的作用。

daemon 在后台持续运行,手机 APP 可以随时通过它创建新的 Claude Code 会话。创建会话时 APP 会让你选择工作目录,Claude 就在那个目录下跑,读取该项目的 CLAUDE.md 和上下文。

基本操作

1
2
3
4
5
happy daemon start    # 启动守护进程
happy daemon stop # 停止守护进程
happy daemon status # 查看运行状态
happy daemon list # 列出活跃会话
happy daemon logs # 查看日志文件路径

开机自启:Linux systemd 配置

可能会高频使用 happy, 暂时设置了开机自启。
因为我的主力机是 Linux 系统,开机自启使用 systemd 用户服务来实现。

创建服务文件 ~/.config/systemd/user/happy-daemon.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Happy Coder Daemon
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/path/to/happy daemon start-sync
WorkingDirectory=/your/workspace
Restart=always
RestartSec=10
Environment=PATH=/home/xxx/.local/bin:/usr/local/bin:/usr/bin:/bin
Environment=HOME=/home/xxx

[Install]
WantedBy=default.target

这里面有几个关键细节,逐一说清楚。

start-sync 而不是 start

happy daemon start 会 spawn 一个子进程然后父进程退出,systemd 检测到主进程退出就认为服务结束了。而 start-sync 是前台阻塞模式,systemd 可以正确跟踪进程状态。用错了的话,daemon 会不断被 systemd 重启又退出,陷入死循环。

Restart=always

不要用 Restart=on-failure。daemon 收到正常关机信号时退出码是 0,on-failure 不会重启正常退出的进程。我们需要的是无论什么原因退出都自动重启。

Environment 不要包含 CLAUDECODE 变量

如果 daemon 的环境里有 CLAUDECODECLAUDE_CODE_ENTRYPOINT 这类变量,从手机发起的会话会直接失败。症状是:手机上能看到会话创建成功,但一发消息就挂。排查这类问题,这里是第一个要检查的。

loginctl enable-linger

systemd 用户服务默认只在用户登录时运行。执行 loginctl enable-linger 后,即使没有登录,用户服务也能启动。

启用服务

1
2
3
loginctl enable-linger $(whoami)
systemctl --user daemon-reload
systemctl --user enable --now happy-daemon.service

验证:

1
systemctl --user status happy-daemon.service

看到 active (running) 就对了。可以故意杀掉进程测试自动恢复:

1
2
3
kill $(pgrep -f "happy daemon start-sync")
# 等约 10 秒
systemctl --user status happy-daemon.service

应该看到它又自动重启了。

自建 Happy Server

Happy 默认使用官方中继服务器。所有通信端到端加密,服务器只能看到加密后的数据块,无法读取代码内容。用官方服务器在安全性上没问题。
但如果有数据合规要求、想在内网部署、或者纯粹想自己掌控基础设施,自建也很简单。

主要是官网真的太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太慢了……………….

Docker 部署(推荐)

Happy Server 独立模式内置了 PGlite(嵌入式 PostgreSQL),不需要额外安装 Postgres、Redis 或 S3,一个容器搞定:

1
2
3
4
5
6
7
8
9
10
11
12
# 构建镜像(在仓库根目录执行)
docker build -t happy-server -f Dockerfile .

# 运行
docker run -d \
--name happy-server \
-p 3005:3005 \
-e HANDY_MASTER_SECRET=your-secret-here \
-e PUBLIC_URL=https://happy.example.com \
-v happy-data:/data \
--restart unless-stopped \
happy-server

几个关键说明:

  • HANDY_MASTER_SECRET 是必须设置的,用于认证和加密。务必生成一个足够长的随机字符串
  • PUBLIC_URL 设为你的公网可访问的 HTTPS 地址,影响文件链接的生成
  • 数据持久化在 Docker volume happy-data 中,容器重启不丢数据
  • 服务器本身不处理 TLS,需要配合反向代理

健康检查:访问 GET /health,返回 {"status":"ok"} 说明服务正常。

环境变量一览

必须设置:

变量 说明
HANDY_MASTER_SECRET 认证和加密的主密钥,必须设置

可选(独立部署):

变量 默认值 说明
PORT 3005 服务监听端口
PUBLIC_URL http://localhost:3005 公网访问 URL
DATA_DIR /data 数据存储目录
PGLITE_DIR /data/pglite PGlite 数据库目录
METRICS_ENABLED false 设为 true 开启 Prometheus 指标
METRICS_PORT 9090 指标服务端口

可选(扩展部署):

变量 说明
DATABASE_URL 外部 PostgreSQL 连接地址(替代 PGlite)
REDIS_URL Redis 地址(多副本扩展时使用)
S3_HOST S3/MinIO 对象存储(替代本地文件存储)

个人使用的话,设一个 HANDY_MASTER_SECRET 就够了。

TLS 配置

生产环境用 HTTPS,最省事的方式是用 Caddy 做反向代理,它会自动申请和续期 Let’s Encrypt 证书

1
2
3
happy.example.com {
reverse_proxy localhost:3005
}

两行配置,Caddy 帮你搞定证书。用 Nginx 的话需要自己配 certbot,稍微麻烦一点。

CLI 指向自建服务器

自建服务器部署好之后,通过 HAPPY_SERVER_URL 环境变量让 happy-cli 连接你的服务器:

1
2
export HAPPY_SERVER_URL=https://happy.example.com
happy

或者写到 shell 配置文件里一劳永逸。加到 ~/.zshrc~/.bashrc

1
export HAPPY_SERVER_URL=https://happy.example.com

如果前面用 systemd 管理 daemon,别忘了在 service 文件的 Environment 里也加上:

1
Environment=HAPPY_SERVER_URL=https://happy.example.com

改完之后 systemctl --user restart happy-daemon.service 让配置生效。

APP 指向自建服务器

Happy APP 内置了服务器配置页面,切换很方便:

  1. 打开 APP,进入设置
  2. 找到 Server Configuration(服务器配置)
  3. 输入自建服务器地址,比如 https://happy.example.com
  4. APP 会自动验证:访问这个 URL,检查是否返回 “Welcome to Happy Server!”
  5. 验证通过后保存,之后所有连接走你的自建服务器
  6. 想切回官方服务器?同一个页面重置即可

切换过程不需要重新登录。


Happy Coder 解决的问题很小也很具体:让你不用坐在电脑前也能用 Claude Code。但就是这个便利,改变了我跟 Claude 协作的方式。通勤路上想到什么,掏出手机就能接着聊;周末出门在外,Claude 在家里的机器上跑着任务,手机上随时查看进度。

开源、免费、端到端加密,自托管完全可选。如果你也在用 Claude Code,不妨试试。

参考文献

  • slopus/happy - GitHub
  • Happy Engineering - Documentation
  • How to build a 24/7 personal AI agent with Claude Code - Liam Darmody