用 Happy 在手机上控制 Claude Code:从安装到自建服务器
VibeCoding 大半年,最大的感受是:慢。一个需求跑大半天,高峰期 API 限速更是雪上加霜。你想走开干点别的,又怕 AI 卡在权限弹窗上等你审批——走也不是,守也不是。
实践久了之后会发现: VibeCoding 需要的不是持续盯盘,而是一种间歇性、片段化的持续注意力。
AI 自己跑着就行,你只在关键节点出现——审批权限、纠正方向、拍板决策。你不是监控器,你是把关人。
Happy Coder 恰好解决了两个问题:
- “守”——手机随时查看进度、审批、发指令,不用守在电脑前。
- “等”——通勤路上掏出手机接着推需求,碎片时间变生产力。
这篇文章分享一下我从零开始用 Happy 的全过程,覆盖日常使用、后台常驻、开机自启、以及自建服务器。
快速上手:五分钟连上手机
安装 happy-cli
前提是你已经装好了 Claude Code(claude 命令可用)。然后一行命令搞定:
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,还支持 Codex、Gemini 等:
1 | happy codex # 启动 Codex 会话 |
后台常驻:让手机随时发起会话
上面 happy 命令需要手动启动,关掉终端会话就断了。如果我想随时随地从手机发起会话,电脑上得有个常驻后台的服务。这就是 daemon(守护进程) 的作用。
daemon 在后台持续运行,手机 APP 可以随时通过它创建新的 Claude Code 会话。创建会话时 APP 会让你选择工作目录,Claude 就在那个目录下跑,读取该项目的 CLAUDE.md 和上下文。
基本操作
1 | happy daemon start # 启动守护进程 |
开机自启:Linux systemd 配置
可能会高频使用 happy, 暂时设置了开机自启。
因为我的主力机是 Linux 系统,开机自启使用 systemd 用户服务来实现。
创建服务文件 ~/.config/systemd/user/happy-daemon.service:
1 | [Unit] |
这里面有几个关键细节,逐一说清楚。
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 的环境里有 CLAUDECODE 或 CLAUDE_CODE_ENTRYPOINT 这类变量,从手机发起的会话会直接失败。症状是:手机上能看到会话创建成功,但一发消息就挂。排查这类问题,这里是第一个要检查的。
loginctl enable-linger
systemd 用户服务默认只在用户登录时运行。执行 loginctl enable-linger 后,即使没有登录,用户服务也能启动。
启用服务
1 | loginctl enable-linger $(whoami) |
验证:
1 | systemctl --user status happy-daemon.service |
看到 active (running) 就对了。可以故意杀掉进程测试自动恢复:
1 | kill $(pgrep -f "happy daemon start-sync") |
应该看到它又自动重启了。
自建 Happy Server
Happy 默认使用官方中继服务器。所有通信端到端加密,服务器只能看到加密后的数据块,无法读取代码内容。用官方服务器在安全性上没问题。
但如果有数据合规要求、想在内网部署、或者纯粹想自己掌控基础设施,自建也很简单。
主要是官网真的太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太慢了……………….
Docker 部署(推荐)
Happy Server 独立模式内置了 PGlite(嵌入式 PostgreSQL),不需要额外安装 Postgres、Redis 或 S3,一个容器搞定:
1 | 构建镜像(在仓库根目录执行) |
几个关键说明:
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 | happy.example.com { |
两行配置,Caddy 帮你搞定证书。用 Nginx 的话需要自己配 certbot,稍微麻烦一点。
CLI 指向自建服务器
自建服务器部署好之后,通过 HAPPY_SERVER_URL 环境变量让 happy-cli 连接你的服务器:
1 | export HAPPY_SERVER_URL=https://happy.example.com |
或者写到 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 内置了服务器配置页面,切换很方便:
- 打开 APP,进入设置
- 找到 Server Configuration(服务器配置)
- 输入自建服务器地址,比如
https://happy.example.com - APP 会自动验证:访问这个 URL,检查是否返回 “Welcome to Happy Server!”
- 验证通过后保存,之后所有连接走你的自建服务器
- 想切回官方服务器?同一个页面重置即可
切换过程不需要重新登录。
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