自建 Happy Server¶
几分钟内搭建自己的中继服务器,完全掌控你的 Claude Code 移动端。
为什么要自建?¶
自建意味着完全隐私、无限制、团队可控、零依赖。
当你自建 Happy Server,你获得:
- 完全隐私 — 加密数据留在你自己的硬件上
- 无限制 — 自定义速率限制和存储
- 团队可控 — 一台服务器服务整个团队
- 零依赖 — 永远不用担心服务下线
整个服务端只有 1,293 行 TypeScript。你可以自己读一遍来验证它只是转发加密消息。
快速开始¶
第一步:克隆并构建¶
# 获取代码
git clone https://github.com/slopus/happy-server
cd happy-server
# 用 Docker 构建
docker build -t happy-server:latest .
第二步:运行服务器¶
docker run -d \
--name happy-server \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/happy-server" \
-e REDIS_URL="redis://localhost:6379" \
-e SEED="your-seed-for-token-generation" \
-e PORT=3005 \
--restart unless-stopped \
happy-server:latest
重要:用你的实际配置替换环境变量值:
- DATABASE_URL:你的 PostgreSQL 连接字符串
- REDIS_URL:你的 Redis 连接字符串
- SEED:用于 token 生成的安全随机种子
- PORT:应用监听的端口(3005)
第三步:配置你的设备¶
手机端:
1. 打开 Happy App
2. 进入 Settings
3. 将 "Relay Server URL" 设为 http://your-server:3000
4. 保存
电脑端:
export HAPPY_SERVER_URL="http://your-server:3000"
# 配置你的 CLI 使用你的服务器
就这样!你的 Happy 现在通过自己的服务器运行了。
生产环境 HTTPS 配置¶
用 Caddy 是最简单的方式,自动管理 SSL 证书。
正式使用建议上 HTTPS。用 Caddy 最简单:
# 安装 Caddy(自动管理 SSL 证书)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
# 配置反向代理
sudo tee /etc/caddy/Caddyfile <<EOF
your-domain.com {
reverse_proxy localhost:3000
}
EOF
# 启动 Caddy
sudo systemctl restart caddy
然后在 Happy Coder 设置中使用 https://your-domain.com。
Docker Compose 配置¶
用 Docker Compose 更易管理,一次拉起 Server + PostgreSQL + Redis。
# docker-compose.yml
version: '3.8'
services:
happy-server:
image: happy-server:latest
ports:
- "3000:3000"
restart: unless-stopped
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:postgres@localhost:5432/happy-server
- REDIS_URL=redis://localhost:6379
- SEED=your-seed-for-token-generation
- PORT=3005
depends_on:
- postgres
- redis
postgres:
image: postgres:15
environment:
- POSTGRES_DB=happy-server
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
运行:docker-compose up -d
这个配置包含了 Happy Server 依赖的 PostgreSQL 和 Redis 容器。
托管选择¶
选项 1:家庭服务器(免费)¶
在家里任何一台电脑上运行:
- 树莓派(一次性 $35)
- 旧笔记本
- Mac Mini
- 一直开着的台式机
选项 2:云 VPS($5-10/月)¶
| 服务商 | 价格 | 备注 |
|---|---|---|
| DigitalOcean | $6/月 | Droplet 够用 |
| Linode | $5/月 | 共享 CPU |
| Vultr | $6/月 | 常规性能 |
| Hetzner | 4 欧/月 | 欧洲性价比之王 |
选项 3:企业内网¶
在公司网络内部署供团队使用。服务器可以在防火墙和代理后面正常工作。
系统要求¶
Happy Server 非常轻量。
| 规模 | RAM | CPU | 存储 | 网络 |
|---|---|---|---|---|
| 1-10 个开发者 | 512MB | 1 核 | 10GB | 100Mbps |
| 10-100 个开发者 | 2GB | 2 核 | 100GB | 1Gbps |
监控你的服务器¶
# 查看日志
docker logs -f happy-server
# 检查健康端点
curl http://your-server:3000/health
# 查看连接数
curl http://your-server:3000/stats
备份数据¶
服务器存储的是加密 blob,没有设备密钥谁也读不了。
服务器把加密 blob 存储在 /data。备份方法:
# 简单备份
tar -czf backup-$(date +%Y%m%d).tar.gz ./data
# 或同步到其他位置
rsync -av ./data/ backup-location/
记住:这些备份是加密的。没有你的设备密钥,谁也读不了。
安全说明¶
Happy Server 的设计从根本上保护你的数据安全。
- 服务器无法读取你的数据 — 发送前一切已加密
- 不需要账号 — 认证使用密码学证明
- 不记录你的代码 — 服务器只记录连接元数据
- 开源 — 自己审计代码
额外安全建议:
- 生产环境使用 HTTPS
- 团队部署时放在 VPN 后面
- 配置 fail2ban 防暴力破解
成本对比¶
| 方案 | 费用 |
|---|---|
| 自建(家庭硬件) | 免费 |
| 自建(VPS) | $5-10/月,无限使用 |
| Omnara | $9/月/用户 |
| Cursor Mobile | 跑在他们的 VM 上 |
| Terragon/Siteboon | 按用量计费 |
| Conductor | 免费层之后 $29/月 |
自建省钱又掌控在手。
进阶:Kubernetes 部署¶
给使用 Kubernetes 的团队准备的生产配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: happy-server
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
replicas: 1
selector:
matchLabels:
app: happy-server
template:
metadata:
labels:
app: happy-server
spec:
containers:
- name: happy-server
image: happy-server:latest # 替换为你实际的镜像仓库
ports:
- containerPort: 3005
envFrom:
- secretRef:
name: happy-secrets
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: happy-server-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: happy-server
---
apiVersion: v1
kind: Service
metadata:
name: happy-server
spec:
selector:
app: happy-server
ports:
- port: 3005
targetPort: 3005
type: ClusterIP
配置说明:
- 所有端口统一使用 3005(应用实际监听端口)
- 使用上面创建的 happy-secrets Secret
- 更新 image 名称为你实际的容器仓库地址
Kubernetes Secrets¶
创建环境变量的 Secret 文件:
# happy-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: happy-secrets
type: Opaque
stringData:
DATABASE_URL: "postgresql://postgres:postgres@postgres-service:5432/happy-server"
REDIS_URL: "redis://redis-service:6379"
SEED: "your-secure-seed-for-token-generation"
PORT: "3005"
NODE_ENV: "production"
应用 Secret:
kubectl apply -f happy-secrets.yaml
安全提示:替换为你的实际配置。生产环境建议:
- 使用强随机的 SEED 值
- 使用正确的数据库凭据
- 考虑使用外部 Secret 管理工具如 external-secrets-operator 配合 Vault
下一步¶
服务器设置完成后:
自建 Happy Server 只需 3 分钟,让你永久掌控 Claude Code 移动端访问。无订阅、无锁定、无意外。