作者用月费7美元的Hetzner VPS + Tailscale零信任VPN + Tmux持久会话 + Caddy自动HTTPS,在手机上运行Claude Code并预览应用。详细步骤覆盖5个组件的完整配置。
在私有 VPS 上运行 Claude Code:通过 Tailscale 安全组网、Tmux 会话持久化和 Caddy HTTPS 搭建,随时随地编程,甚至用手机

我想用手机写代码。不是"查看 PR"或"修改配置文件"那种——而是真的运行 Claude Code、迭代功能、在浏览器中预览效果。结果发现一个月花 7 美元的 VPS 就够了。
本指南覆盖完整技术栈:Hetzner VPS、Tailscale 零信任 SSH、Tmux 持久化会话,以及 Caddy 的 HTTPS 开发服务器访问。完成后你会得到这样一个环境:通过手机 SSH 登录,附加一个已经在运行 Claude Code 的 Tmux 会话,并在 https://dev.yourdomain.com 预览你的应用。

这套架构有 5 个组成部分:
Hetzner VPS – 便宜、快速,EU/US 机房。所有服务运行的那台机器
Tailscale – mesh VPN。SSH 流量走加密的 Tailscale 隧道,绝不经过公网
Terminus – iOS/Android/桌面 SSH 客户端。通过 Tailscale IP 连接 VPS
Tmux – 终端多路复用器。断开连接时会话依然保持。手机休眠了?Claude 继续跑
Caddy – 带自动 HTTPS 的反向代理。将 localhost:3000 暴露为 https://dev.yourdomain.com
前往 Hetzner Cloud,创建一个项目,起一台服务器:
Hetzner 会把 root 密码发送到你的邮箱。用 root 登录:
ssh root@<your-server-ip>
首次登录时会提示你立即修改 root 密码。
Claude Code 带 --dangerously-skip-permissions 参数无法以 root 运行。创建一个专用用户:
adduser agent
usermod -aG sudo agent
# 将 SSH 公钥复制到新用户
mkdir -p /home/agent/.ssh
cp ~/.ssh/authorized_keys /home/agent/.ssh/
chown -R agent:agent /home/agent/.ssh
chmod 700 /home/agent/.ssh
chmod 600 /home/agent/.ssh/authorized_keys
# 切换到 agent 用户
su - agent
从现在起,所有操作都用 agent 用户执行。
尽早安装 Claude Code——它可以帮你配置服务器上的其他一切(Tailscale、防火墙、shell、工具链等)。
# 安装 Claude Code
curl -fsSL https://claude.ai/install.sh | bash
# 首次运行——通过浏览器认证
claude
按照认证链接操作。认证完成后,你就可以用 Claude Code 辅助完成剩余的搭建步骤——当然也可以手动跟随本指南。
Tailscale 在你的设备之间建立零信任 mesh VPN。个人使用免费(最多 100 台设备)。每台设备获得一个稳定的 100.x.x.x IP,在任何地方都能用。
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
按照认证 URL 将 VPS 关联到你的 Tailscale 账户。记下那个 100.x.x.x IP——以后 SSH 就连这个地址了。
在你的手机和桌面设备上也安装 Tailscale。一旦两台设备加入同一个 Tailnet,它们就可以直接互相访问。
锁定 VPS,只暴露必要端口。
ufw 其实是内核 netfilter 防火墙的前端——许多 minimal/VPS 基础镜像没有自带,所以先安装它:
sudo apt update
sudo apt install -y ufw
其他发行版:RHEL/Fedora/CentOS/Rocky/Alma 用 sudo dnf install -y firewalld(或从 EPEL 安装 ufw),Alpine 用 sudo apk add ufw。下面的步骤默认在 Ubuntu/Debian 上执行。
锁定警告:下面这条规则只允许通过 tailscale0 接口的 SSH。如果启用防火墙时 Tailscale 没连上,你就会被锁在 VPS 外面。运行 sudo ufw enable 之前:
tailscale status然后再启用防火墙:
# 只允许通过 Tailscale 接口的 SSH
sudo ufw allow in on tailscale0 to any port 22
# 允许 HTTPS 来自任意位置(Caddy 开发服务器用)
sudo ufw allow 443/tcp
# 启用防火墙
sudo ufw enable
# 验证
sudo ufw status
结果:SSH 只能通过 Tailscale 隧道访问。443 端口开放给 HTTPS 开发服务器。其他全部阻断。
Terminus 是跨平台 SSH 客户端——支持 iOS、Android、macOS、Windows。目前我用过的移动端 SSH 体验里它是最好的。
在你的手机和/或桌面设备上安装 Terminus。
创建新主机:
这是关键的一步。没有 Tmux,关闭 SSH 连接(或者手机休眠)就会杀掉所有运行中的进程。有了 Tmux,进程在服务器上继续运行——你只是 detach,然后重新 attach。
sudo apt install -y tmux

# 创建命名会话(以项目名命名)
tmux new -s project1
# 从会话中 detach(保持运行)
# Ctrl+B,然后按 D
# 列出所有会话
tmux ls
# 附加到已有会话
tmux a -t project1
# 杀死会话
tmux kill-session -t project1
每个项目用一个 tmux 会话。Claude Code 自己启动开发服务器(在后台 tmux 会话中或其内置工具中),所以你只需要一个会话来交互:
# 项目 1:你的主项目
tmux new -s project1
cd ~/project1
claude
# Detach:Ctrl+B,D
# 项目 2:另一个项目
tmux new -s project2
cd ~/project2
claude
# Detach:Ctrl+B,D
# 在项目间切换:
tmux a -t project1
tmux a -t project2
每个项目独立一个会话。Claude 在会话内管理开发服务器、构建和其他进程。按需切换项目——SSH 断开后一切照旧运行。
同一个仓库需要并行改动?用 git worktrees。Worktrees 允许你把同一仓库的多个分支 checkout 到不同目录,这样两个 Claude 实例可以同时处理不同功能而不冲突:
cd ~/project1
git worktree add ../project1-feature-b feature-b
# 然后为这个 worktree 启动独立的 tmux 会话
tmux new -s project1-feature-b
cd ~/project1-feature-b
claude
推荐添加 ~/.tmux.conf:
# 鼠标支持(便于滚动)
set -g mouse on
用 tmux source-file ~/.tmux.conf 重载配置。
在 VPS 上安装你需要的工具。以下是我的推荐:
Shell 配好后,在 .zshrc 里加这个别名:
alias cc='claude --dangerously-skip-permissions'
这会让 Claude Code 以完全自主模式运行——执行命令或修改文件不再弹出审批提示。对于异步工作流更友好:发起一个任务然后稍后回来看结果。但要注意:这个模式下 Claude 可以不经询问做任何事,包括推送到 main、运行数据库迁移、删除文件等。只在你信任任务范围时使用。
设置 ~/.claude/CLAUDE.md,让 Claude Code 从一开始就理解你的偏好。这个全局配置适用于所有项目:
# Claude Code Rules
## Environment
- **Platform**: VPS accessed via SSH from multiple devices
- **Shell**: zsh
- **Session management**: tmux (always assume running inside tmux)
## Communication Style
- Concise and direct response. Sacrifice grammar for the sake of concision.
- Minimal explanation unless asked
- No emojis
## Tmux Workflow
Since this is a VPS environment with SSH access from multiple devices, use tmux sessions for process isolation:
- **Long-running processes** (dev servers, watchers, builds): Create new tmux sessions
```bash
tmux new-session -d -s <name> '<command>'
{project}-{purpose} (e.g., myapp-dev, api-build) - prefix with repo/project name to avoid collisions across parallel instancestmux capture-pane -t <session> -p to read session outputtmux list-sessionsThis allows reconnecting from any device and finding all processes still running in their respective sessions.
你可以在 Tools Available 部分调整coding环境,比如加入 Bun、UV 等。
关键的是 VPS 特有的 Tmux Workflow 部分——它告诉 Claude Code 在独立的 tmux session 中启动长期运行的进程,而不是阻塞当前终端。这样 Claude 会在 tmux session 中创建 myapp-dev 来运行开发服务器,你可以在任何设备上查看它们的输出或重新连接。
你也可以在每个仓库根目录添加 per-project CLAUDE.md 文件,用于项目特定的命令、架构笔记和模式。Claude Code 启动时会自动读取这两个文件。在 Claude Code 中进入项目文件夹后,最简单的初始化方式是调用 `/init`。
问题:Claude Code 在 localhost:3000 上启动 bun dev,但手机浏览器无法访问 localhost。解决方案:使用 Caddy 反向代理 + 自动 SSL。
在域名的 DNS 设置中,添加一条 A 记录:
Type: A Name: dev Value: <your-vps-public-ip> TTL: 300
这会将 dev.yourdomain.com 指向 VPS 的公网 IP。
Caddy 会自动处理 HTTPS——它无需配置即可从 Let's Encrypt 获取证书。
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl 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
配置 Caddyfile:
dev.yourdomain.com { reverse_proxy localhost:3000 }
这就是全部配置。Caddy 自动获取 SSL 证书并将请求反向代理到开发服务器。
sudo systemctl restart caddy
sudo systemctl status caddy
现在当 Claude 在 Tmux session 中启动 bun dev 时,在手机上打开 https://dev.yourdomain.com——就能实时预览你的应用,支持热重载。
安全提示:只有 443 端口对外暴露(用于 HTTPS 开发服务器)。SSH 始终通过 Tailscale 加密访问。如果不需要公开的 HTTPS 访问,也可以完全跳过 Caddy,直接通过 Tailscale 访问开发服务器(http://100.x.x.x:3000)。
从端到端来看,手机coding是这样的:
在手机上打开 Terminus
通过 Tailscale IP SSH 连接到 VPS
附加 Tmux session:tmux a -t project1
与 Claude Code 对话——描述要做的功能、修复或变更
可以关闭 app 并断开连接,Claude 会继续编辑文件、运行命令、迭代
预览变更:在手机浏览器中打开 https://dev.yourdomain.com
Session 持续运行——随时从任何设备回来继续
你也可以用同样的设置从桌面端操作。VPS 变成了一个持久的开发环境,你可以在任何地方访问它。
Telegram Bot 界面
我一直在构建一个 Telegram Bot,作为与 VPS 上 Claude Code 交互的聊天界面。不需要打开 SSH 客户端,只需在 Telegram 上给 Bot 发消息——它会在选定的项目目录中启动 Claude Code 并将结果流式返回。

项目切换——通过 inline keyboard 选择要操作的项目目录
语音消息——录制一段语音描述你想要什么,Bot 会(通过 Groq Whisper)转录后交给 Claude Code 处理
流式响应——Claude 工作时实时更新 Telegram 消息
对话连续性——后续消息复用同一个 Claude session
成本追踪——每次响应显示 token 消耗和耗时
工作流程变成:打开 Telegram,选择一个项目,输入或语音描述功能/修复,Claude Code 完成工作——编辑文件、运行命令、创建 PR。你会在 Telegram 消息中收到流式返回的输出。
项目使用 TypeScript、Bun 和 grammY 构建。代码开源——还处于早期阶段,有些粗糙,但我每天都在真实工作中使用。语音消息尤其让它感觉像是在直接和开发环境对话。
技巧与故障排除
Claude Code 卡顿 / OOM
4GB 内存对于大型项目来说比较紧张,需要时升级到 CX32(8GB)
关闭不用的 Tmux session 释放内存
SSH 连接频繁断开
在 SSH 配置中添加:
Host vps HostName 100.x.x.x User agent ServerAliveInterval 60 ServerAliveCountMax 3
Caddy 无法获取 SSL 证书
确认 DNS A 记录指向 VPS 公网 IP
检查 443 端口是否开放:sudo ufw status
查看 Caddy 日志:sudo journalctl -u caddy
Tmux session 滚动历史丢失
在 .tmux.conf 中增加 history-limit
使用 Ctrl+B, [ 进入滚动模式,q 退出
Terminus 支持自定义按键映射——映射 Ctrl、Escape 等
使用 Tmux 前缀 Ctrl+A(在手机键盘上比 Ctrl+B 更容易够到)
SSH 仅通过 Tailscale 访问(从不暴露在公网 IP)
保持系统更新:sudo apt update && sudo apt upgrade
如需共享 Tailnet 可用 Tailscale ACLs 做额外隔离
在 VPS 上运行 Claude Code 要花多少钱?
约 €7/月 的 Hetzner CX22 VPS + Claude Code 订阅(Pro $20/月,Max $100/月,10xMax $200/月)。Tailscale 个人使用免费。根据 Claude 方案不同,总计 $27–207/月。
我可以用 AWS、DigitalOcean 或 Linode 而不是 Hetzner 吗?
可以。任何带有 SSH 访问权限的 Ubuntu VPS 都可以。我个人使用 Hetzner,但 DigitalOcean、Linode 和 Vultr 的操作方式相同。AWS EC2 也可以,但设置更复杂,同等规格下通常更贵。
VPS SSH 必须用 Tailscale 吗,普通 SSH 不行吗?
我强烈推荐 Tailscale。将 SSH 暴露在公网 IP 上——即使使用密钥认证——也意味着服务器随时可能因一个未修补的 Ubuntu 漏洞而被入侵。使用 Tailscale,SSH 端口永远不会暴露在公共互联网上。没有任何端口可以被扫描,没有暴力破解的可能,没有攻击面。你还能获得跨网络的稳定 IP(家庭 WiFi、移动数据、咖啡馆),无需端口转发或动态 DNS。Tailscale + ufw 防火墙是我认为对开发 VPS 足够安全的基础配置。
Claude Code 需要什么 VPS 规格?(CPU、内存、存储)
2 vCPU / 4GB 内存可以流畅运行一个 Claude Code 实例和一个小到中型项目的开发服务器。大型项目或需要并行运行多个 Claude 实例时,建议 4 vCPU / 8GB 内存。磁盘很少成为瓶颈——除非运行 Docker 镜像,40GB 足够了。
我可以用 VS Code Remote SSH 配合 Claude Code 吗?
可以,VS Code Remote SSH 可以通过 Tailscale 连接。但你会失去主要优势——从手机coding的体验。终端纯命令行工作流是刻意设计的:Claude Code 负责编辑,你只需要指挥它。如果你更喜欢可视化编辑,VS Code Remote SSH + Cursor 是桌面端的有效替代方案。
使用 Claude Code --dangerously-skip-permissions 安全吗?
我所有操作都用 --dangerously-skip-permissions。对我来说可行的原因:这是 VPS,不是我的个人笔记本。如果 Claude 以某种方式破坏了这个环境,我不会丢失任何不可替代的东西——只有项目文件(有 git 备份)和开发环境变量。没有生产凭证,没有个人数据。
不过,在这个模式下 Claude 理论上可以不经询问就运行 rm -rf、git push --force 或删除数据库。为此,Claude Code 支持 hooks——在命令执行前拦截的 shell 脚本。你可以设置防护措施,比如:阻止 rm -rf / 模式、禁止 git push --force 到 main 分支、或强制使用 drizzle-kit migrate 而不是 drizzle-kit push。Hooks 让你在享有自主模式速度的同时,在关键地方有护栏保护。
如何为多个开发者搭建共享的 VPS 和 Claude Code?
创建独立的 Linux 用户,每个用户有自己的 home 目录、tmux session 和 Claude Code 认证。Tailscale ACLs 可以限制谁能 SSH 进入。每个用户的项目相互隔离。