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 頭像或姓名,對外顯示的暱稱是系統隨機產生的代號,以保護您的隱私。
登入即表示你同意本站的隱私權政策。