Oracle Cloud 免费主机运行 Claude Code Remote Control:PAYG、Ampere A1、systemd 常驻完整教程
用 Oracle Cloud Always Free 的 Ampere A1 主机跑 Claude Code Remote Control,从升级 PAYG、创建 ARM64 VM、安装 Claude Code、设置 GitHub 权限,到用 systemd 让它在 SSH 断开后持续运行,附实际遇到的错误与解决方法。
本文目录
- 1.整体架构:Oracle 负责主机,Claude 订阅另外算
- 2.Oracle 免费额度:官方两份文档数字不同
- 3.第一步:注册 Oracle、升级 PAYG、先设预算
- 4.第二步:创建 Ampere A1 VM
- 5.第三步:SSH 连接、更新系统、创建专用用户
- 6.第四步:安装 Claude Code 并登录
- 7.第五步:GitHub 权限:SSH key 管代码,gh 管 Issues
- 8.第六步:手动启动 Remote Control 测试
- 9.第七步:用 systemd 做成常驻服务
- 9.1怎么确认真的常驻了
- 10.多个项目、多个 Remote Control
- 11.常见错误速查
- 12.安全、备份与成本
- 常见问题
我会从手机把网站和产品的工作交给 Claude Code。Claude Code 运行在一台 Oracle Cloud 的 ARM 主机上,通过 Remote Control 让我从手机或网页连过去;每个项目一个 systemd 服务,设计成 SSH 断开后继续运行、主机重启后自动启动。这篇是 2026 年 10 月实际搭建的完整步骤,包括我遇到的错误和解决方法。
先说结论:主机可以用 Oracle Always Free 的 Ampere A1,Claude Code 要另外有 Pro、Max、Team 或 Enterprise 订阅。升级 Pay As You Go(PAYG)让账户能用更多种资源,但不保证抢得到主机,也可能产生费用;“常驻”靠的是 systemd 的 user service 加上 linger,不是任何服务保证永不断线。
本文是我自己的搭建记录,不是官方教程。Oracle 的免费额度、Claude Code 的命令与支持的套餐都可能变动,官方文档于 2026 年 10 月 12 日核查,操作前请以最新官方说明和自己的账单为准。命令中的用户名、网址都是示例,请换成自己的。
整体架构:Oracle 负责主机,Claude 订阅另外算
iPhone / Mac / 浏览器
│ Claude Code Remote Control(经 Anthropic 服务连接)
▼
Oracle Cloud VM:Ubuntu 24.04 / ARM64(Ampere A1)
├─ Linux user: project-a → Git repo A → claude-project-a.service
├─ Linux user: project-b → Git repo B → claude-project-b.service
└─ Linux user: content → 独立 worktree → claude-content.service
| 组件 | 做什么 | 费用 |
|---|---|---|
| Oracle Cloud VM | 提供常驻的 Linux 主机 | 在 Always Free 额度内免费,超额收费 |
| Claude Code | 在主机上写代码、改文件、运行命令 | 需要 Claude 订阅(Remote Control 支持 Pro、Max、Team、Enterprise) |
| GitHub | 代码放在 repo,Claude Code 用 SSH key 推拉 | 依 GitHub 套餐而定 |
| systemd user service | SSH 断开后继续运行、开机自动启动、出错自动重启 | Ubuntu 内置 |
Oracle 只提供主机,不负责 Claude 的模型费用;文章里的“免费”只指主机,不是整套 AI 开发都免费。
Oracle 免费额度:官方两份文档数字不同
| 官方文档(2026 年 10 月 12 日核查) | Ampere A1 免费额度 |
|---|---|
| Always Free Resources | 每月前 1,500 OCPU 小时、9,000 GB 小时,对 Always Free 账户约等于 2 OCPU、12 GB 内存 |
| Arm-based Compute | 每月前 3,000 OCPU 小时、18,000 GB 小时(含付费和试用账户) |
两份不一致,所以我按保守的 2 OCPU / 12 GB 规划,以每月约 750 小时估算:
| 配置 | OCPU 小时 | GB 小时 | 按保守额度看 |
|---|---|---|---|
| 1 台 2 OCPU / 12 GB | 1,500 | 9,000 | 在额度内 |
| 2 台各 1 OCPU / 6 GB | 1,500 | 9,000 | 在额度内 |
| 1 台 4 OCPU / 24 GB | 3,000 | 18,000 | 可能超出,先查自己的账户 |
另外几条要知道的官方规则:
- 一定要在 Home Region:Always Free 的主机必须建在 tenancy 的 home region,home region 以外的磁盘按一般价格收费。
- 磁盘总额:boot volume 和 block volume 合计 200 GB,另有 5 个 volume backup。同一份文档对最小 boot volume 有 47 GB 和 50 GB 两种写法,以 Console 显示为准。
- 闲置可能被回收:连续 7 天内,CPU 使用率的第 95 百分位、网络使用率和内存使用率(只适用于 A1)都低于 20%,Oracle 可能回收主机。不要为了避免回收刻意制造假负载。
第一步:注册 Oracle、升级 PAYG、先设预算
- 到 Oracle Cloud 官网注册 OCI 账户,完成身份与付款方式验证。
- 选 Home Region 前先想清楚:Always Free 的主机只能建在这里,不要以为之后可以随时换。根据自己所在地、延迟和 A1 的可用性决定。
- 想升级的话,在 Console 上方找 Upgrade,选 Pay As You Go,按官方流程完成。根据 Oracle 说明,升级后符合 Always Free 条件的资源仍然免费。
- 升级后马上设预算:Billing & Cost Management → Budgets → Create Budget,设一个每月低额的预算和 Email 通知。预算只会通知,不会自动拦下收费,所以还是要定期看 Cost Analysis。
PAYG 能不能更容易创建出 A1,取决于区域、时间和实际容量,我不会写成“升级就抢得到”。
第二步:创建 Ampere A1 VM
- Compute → Instances → Create Instance,确认 Compartment、Home Region、Availability Domain。
- Image 选 Ubuntu 24.04,确认是 ARM64(aarch64)版本。
- Shape 选 VM.Standard.A1.Flex,先从 1 OCPU / 6 GB 或 2 OCPU / 12 GB 开始。
- Capacity type 选 On-demand,常驻用的主机不要选 Preemptible。
- Fault Domain 让 Oracle 自动选。
- Boot volume 用合理的最小值,先确认免费磁盘额度还有剩余。
- 网络:只对需要的来源开放 TCP 22(SSH)。Remote Control 一般不需要另外开放对外的入站端口。
- SSH key 粘贴公钥(
.pub文件)。私钥绝对不要粘贴到 Console 或任何对话里。
在 Mac 上生成 SSH key:
ssh-keygen -t ed25519 -f ~/.ssh/oci_claude -C 'oci-claude'
cat ~/.ssh/oci_claude.pub
创建时如果出现 Out of host capacity,说明在你选的条件下暂时没有主机容量,不是 SSH key、镜像或信用卡的问题。排查顺序和 PAYG 的实际作用,我另外写在《Oracle Out of host capacity 怎么办》。
第三步:SSH 连接、更新系统、创建专用用户
chmod 600 ~/.ssh/oci_claude
ssh -i ~/.ssh/oci_claude ubuntu@<YOUR_VM_PUBLIC_IP>
可以在 Mac 的 ~/.ssh/config 里设置别名,之后只要 ssh my-claude-vm:
Host my-claude-vm
HostName <YOUR_VM_PUBLIC_IP>
User ubuntu
IdentityFile ~/.ssh/oci_claude
IdentitiesOnly yes
在 VM 上更新系统、安装工具,并确认是 ARM64:
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl ca-certificates jq unzip gh
uname -m # 应该是 aarch64
free -h
不要把所有项目都跑在 ubuntu 或 root 下面。 每个需要分开权限的项目建一个 Linux 用户,并开启 linger,让它的 systemd 服务在没有登录时也能运行:
sudo adduser --disabled-password --gecos '' project-a
sudo loginctl enable-linger project-a
loginctl show-user project-a -p Linger # 应该是 Linger=yes
内存不够时可以加 swap(swap 不是 RAM,会增加磁盘读写)。运行前先用 df -h 确认磁盘空间足够,也不要重复写入 /etc/fstab:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
printf '/swapfile none swap sw 0 0\n' | sudo tee -a /etc/fstab
第四步:安装 Claude Code 并登录
切换到项目用户安装,不要用 sudo 装到 root 的主目录:
sudo -iu project-a
curl -fsSL https://claude.ai/install.sh | bash
~/.local/bin/claude --version
~/.local/bin/claude # 第一次运行,按界面提示完成登录
登录完成后退出交互式 Claude 即可。安装方式以官方安装说明为准。要注意两件事:
- Remote Control 只支持 claude.ai 订阅登录:如果环境里设置了
ANTHROPIC_API_KEY,官方文档写明会出现“Remote Control requires claude.ai subscription auth.”。 - 不要把
~/.claude/复制给其他用户:每个 Linux 用户自己登录。
第五步:GitHub 权限:SSH key 管代码,gh 管 Issues
在项目用户下生成 GitHub 专用的 SSH key,把公钥加到 GitHub(个人 SSH keys,或只给单个 repo 的 Deploy key,权限更小):
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/github -C 'project-a-github'
cat ~/.ssh/github.pub
cat >> ~/.ssh/config <<'EOF'
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github
IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config
ssh -T git@github.com
mkdir -p ~/projects && cd ~/projects
git clone git@github.com:<OWNER>/<REPO>.git
我遇到过的情况:Git 可以 push,但 Claude Code 说读不到 GitHub Issues。原因是 SSH key 只管 Git 传输,读 Issues 和 PR 要另外用 GitHub CLI 登录。步骤和权限风险写在《Claude Code 读不到 GitHub Issues》。
第六步:手动启动 Remote Control 测试
在项目的 repo 目录里运行:
sudo -iu project-a
cd ~/projects/<REPO>
~/.local/bin/claude remote-control --name 'My Project - Development' --spawn=worktree
第一次会问 Enable Remote Control? (y/n),回答 y。成功后界面会显示连接状态,到手机的 Claude App 或 claude.ai/code 确认能看到这个环境,再按 Ctrl+C 停止手动测试。
根据官方文档,claude remote-control 是 server mode,常用参数有:
| 参数 | 作用 |
|---|---|
--name "名称" |
在 claude.ai/code 列表中显示的名称 |
--spawn worktree |
每个新开的 session 有自己的 git worktree(需要 git repo);默认的 same-dir 是大家共用当前目录 |
--capacity <N> |
同时运行的 session 上限,默认 32 |
-c、--continue |
接回这个目录上一次 server 开的 session |
--debug-file <path> |
把调试日志写到文件,排查启动失败时有用 |
--spawn=worktree 只是把工作目录分开,不是操作系统层面的权限隔离。
第七步:用 systemd 做成常驻服务
在项目用户下创建 user service(把 project-a、my-repo、名称换成自己的):
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/claude-my-repo.service <<'SERVICE_UNIT'
[Unit]
Description=Claude Code Remote Control - My Repo
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/project-a/projects/my-repo
ExecStart=/home/project-a/.local/bin/claude remote-control --name "My Project - Development" --spawn=worktree
Restart=on-failure
RestartSec=15
Environment=HOME=/home/project-a
Environment=PATH=/home/project-a/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MemoryHigh=2500M
MemoryMax=3500M
NoNewPrivileges=true
UMask=0077
[Install]
WantedBy=default.target
SERVICE_UNIT
写完先检查文件是否完整,我遇到过 heredoc 没结束、少了 [Install] 段的情况:
tail -n 12 ~/.config/systemd/user/claude-my-repo.service
接着回到管理员账号 ubuntu 启动服务。在 sudo -iu 的 shell 里直接运行 systemctl --user,我遇到了 Failed to connect to bus: No medium found,要明确指定该用户的 runtime 目录和 D-Bus(原因见《systemctl –user No medium found》):
exit # 回到 ubuntu
uid=$(id -u project-a)
sudo loginctl enable-linger project-a
sudo -u project-a XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user daemon-reload
sudo -u project-a XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user enable --now claude-my-repo.service
MemoryHigh、MemoryMax 是每个服务自己的上限,运行多个服务时要根据主机实际内存调整。
怎么确认真的常驻了
sudo -u project-a XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user status claude-my-repo.service --no-pager -l
- 显示
Active: active (running)。enabled不等于running:我遇到过一个服务显示enabled,实际上是inactive (dead)。 - 日志里有连接成功的消息和你设置的名称。我的成功日志当时显示
Capacity: 1/32 · New sessions will be created in an isolated worktree,和官方默认上限 32 一致。 - 手机或网页能看到这个环境,而且可以开新任务。
- 彻底关掉 SSH 再连回来,服务仍在运行。
- 找一个没有重要任务在跑的时段,重启测试是否会自动恢复。
查看日志、重启单个服务:
sudo -u project-a XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
journalctl --user -u claude-my-repo.service -n 80 --no-pager
sudo -u project-a XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user restart claude-my-repo.service
只重启出问题的那一个,避免打断其他正在运行的 Remote Control。
多个项目、多个 Remote Control
我在同一台主机上运行好几个环境:不同产品用不同的 Linux 用户,同一个 repo 的“开发”和“写文章”则用 git worktree 分成两个工作目录、两个服务。哪些情况要分用户、worktree 怎么建、分支和 PR 要注意什么,写在《一台主机运行多个 Claude Code Remote Control》。
常见错误速查
| 症状 | 先检查 | 处理方向 |
|---|---|---|
Out of host capacity |
Availability Domain、Fault Domain、shape | 自动 Fault Domain、换 AD、缩小规格、稍后再试 |
| SSH timeout | IP、Security List、SSH key | 先修好网络和密钥,不要全面开放端口 |
claude: command not found |
PATH | 用完整路径 ~/.local/bin/claude |
systemctl --user 出现 No medium found |
linger、user bus、XDG_RUNTIME_DIR | 从 ubuntu 指定 UID 和 D-Bus 操作 |
enabled 但 inactive (dead) |
是否被手动停止、日志 | 看 journal 再 start |
一直 status=1/FAILURE |
日志、登录、工作目录 | 先停掉重启循环,用同一个用户手动运行,看真正的错误 |
| 关掉 SSH 后 Remote Control 就消失 | 是不是只手动运行 | 创建 systemd user service 并开启 linger |
| Git 能 push、读不到 Issues | Git SSH 不等于 GitHub API | 用 gh auth login 另外授权 |
exec format error |
下载的程序是不是 ARM64 版 | 换成 Linux ARM64 版本,不是改权限 |
| 账单出现费用 | 超额资源、磁盘、备份、网络 | 看 Cost Analysis,调整资源 |
status=1/FAILURE 这类启动失败,我会先停掉那个服务,读 journalctl --user -u <服务> -n 100,再切换到同一个用户和目录手动运行 claude remote-control,拿到真正的错误消息再处理,不去猜是登录、网络还是同时连接数的问题。官方文档也提到,server mode 遇到约 10 分钟的网络中断,进程会自行结束,所以服务要设置自动重启。
安全、备份与成本
- 密钥不外泄:SSH 私钥、GitHub token、
~/.claude/、~/.config/gh/都不要放进 repo、systemd 配置文件或截图。 - 最小权限:处理生产环境、数据库的项目用独立的 Linux 用户;
NoNewPrivileges=true不是完整的沙箱。 - GitHub 只保护已 push 的内容:未提交的修改、worktree、Claude 的本地设置不会自动备份,重要的修改要 commit、push。
- 每周看账单:OCPU 小时、GB 小时、磁盘、备份、网络流量。要写“每月 0 元”,就要有那个月份的账单作为依据。
- 每天的健康检查:
PROJECT_USER=project-a
uid=$(id -u "$PROJECT_USER")
loginctl show-user "$PROJECT_USER" -p Linger
sudo -u "$PROJECT_USER" XDG_RUNTIME_DIR="/run/user/$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
systemctl --user --no-pager --failed
free -h
df -h /
uptime
--failed 只列出失败的服务,重要的服务还是要确认 active (running);Restart=on-failure 也解决不了登录失效或外部服务故障。
这套环境就是 Jason Finance 每天运行的地方,网站本身怎么搭建的见《Jason Finance 从零到一》。更多文章在 AI 创业主题页。
常见问题
Oracle Cloud Always Free 真的免费吗?
符合 Always Free 条件和额度的资源免费,而且升级 Pay As You Go 之后仍然免费;超出额度的资源会收费。Ampere A1 的免费额度,Oracle 两份官方文档写法不同(每月 1,500 OCPU 小时/9,000 GB 小时,和 3,000/18,000),本文采用保守的 2 OCPU、12 GB,实际以账户的 Always Free 标示和账单为准。
升级 Pay As You Go 就一定能创建出 Ampere A1 吗?
不一定。PAYG 让账户能用更多种资源,但不会增加某个区域的物理主机容量,仍然可能遇到 Out of host capacity。PAYG 账户也可能产生真实费用,预算(Budgets)只会通知,不会自动拦下收费。
Claude Code Remote Control 需要什么套餐?
根据 Claude Code 官方文档,Remote Control 支持 Pro、Max、Team 和 Enterprise 套餐,不支持 API key。Team 和 Enterprise 默认关闭,要由 Owner 在 Claude Code 管理设置里开启。
SSH 关掉之后,Claude Code 还会继续运行吗?
如果直接在 SSH 窗口里运行,关掉连接后进程通常就会结束。用 systemd 的 user service 配合 loginctl enable-linger,进程可以在 SSH 断开后继续运行,主机重启后也会自动启动。
Permanent Remote Control 是永远不会断线吗?
不是。本文说的“常驻”是指自动启动、出错自动重启、SSH 断开后仍在运行,不是 Oracle 或 Anthropic 保证的可用性。官方文档也写明,server mode 遇到约 10 分钟的网络中断,claude remote-control 进程会结束。
Oracle 的 ARM64 主机能运行 Claude Code 吗?
可以。我的环境是 Ubuntu 24.04 aarch64(Ampere A1),用官方安装脚本装好 Claude Code 并成功启动 Remote Control。下载其他工具时要确认有 Linux ARM64 版本。
延伸阅读
- 看不懂代码也能建网站:我用 Claude Code + GitHub + Cloudflare 低成本搭建 Jason Finance 的方法与成本我看不懂代码,Jason Finance 是用 Claude Code、GitHub、Cloudflare Workers 和 Supabase 免费方案搭起来的。整理整套架构、每个服务的用途与费用、我怎么给 AI 权限,以及这种做法的限制。
- Git 可以 push,Claude Code 却读不到 GitHub Issues:SSH 与 GitHub API 权限的区别Claude Code GitHub Issues 读不到,但 git push 正常?SSH key 只授权 Git 传输,Issues 和 PR 要另外的 API 认证。用 gh CLI 登录、确认权限、保护 token,并把 Issue 串成 PR 流程。
- 一台主机运行多个 Claude Code Remote Control:Linux user、systemd 与 git worktree 分工Claude Code 多个 Remote Control 运行在同一台主机:信任边界不同就分 Linux user,每个环境一个 systemd service,同一个 repo 的开发和写文章用 git worktree 分开,并说明 --spawn=worktree 的限制。

留言
使用 Google 登录即可留言。留言“不会”使用您的 Google 头像或姓名,对外显示的昵称是系统随机生成的代号,以保护您的隐私。
登录即表示你同意本站的隐私政策。