跳到主要內容
Jason Finance
AI 創業

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. 1.整體架構:Oracle 負責主機,Claude 訂閱另外算
  2. 2.Oracle 免費額度:官方兩份文件數字不同
  3. 3.第一步:註冊 Oracle、升級 PAYG、先設預算
  4. 4.第二步:建立 Ampere A1 VM
  5. 5.第三步:SSH 連線、更新系統、建立專用使用者
  6. 6.第四步:安裝 Claude Code 並登入
  7. 7.第五步:GitHub 權限:SSH key 管程式碼,gh 管 Issues
  8. 8.第六步:手動啟動 Remote Control 測試
  9. 9.第七步:用 systemd 做成常駐服務
  10. 9.1怎麼確認真的常駐了
  11. 10.多個專案、多個 Remote Control
  12. 11.常見錯誤速查
  13. 12.安全、備份與成本
  14. 常見問題

我會從手機把網站和產品的工作交代給 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、先設預算

  1. 到 Oracle Cloud 官網註冊 OCI 帳戶,完成身分與付款方式驗證。
  2. 選 Home Region 前先想清楚:Always Free 的主機只能建在這裡,不要當成之後可以隨時換。依自己所在地、延遲和 A1 的可用性決定。
  3. 想升級的話,在 Console 上方找 Upgrade,選 Pay As You Go,照官方流程完成。依 Oracle 說明,升級後符合 Always Free 條件的資源仍然免費。
  4. 升級後馬上設預算:Billing & Cost Management → Budgets → Create Budget,設一個每月低額的預算和 Email 通知。預算只會通知,不會自動擋下收費,所以還是要定期看 Cost Analysis。

PAYG 能不能比較容易建出 A1,取決於區域、時間和實際容量,我不會寫成「升級就搶得到」。

第二步:建立 Ampere A1 VM

  1. Compute → Instances → Create Instance,確認 Compartment、Home Region、Availability Domain。
  2. Image 選 Ubuntu 24.04,確認是 ARM64(aarch64)版本。
  3. Shape 選 VM.Standard.A1.Flex,先從 1 OCPU / 6 GB 或 2 OCPU / 12 GB 開始。
  4. Capacity type 選 On-demand,常駐用的主機不要選 Preemptible。
  5. Fault Domain 讓 Oracle 自動選。
  6. Boot volume 用合理的最小值,先確認免費磁碟額度還有剩。
  7. 網路:只對需要的來源開 TCP 22(SSH)。Remote Control 一般不需要另外開對外的連入埠。
  8. 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
  1. 顯示 Active: active (running)。enabled 不等於 running:我遇過一個服務顯示 enabled,實際上是 inactive (dead)。
  2. 日誌裡有連線成功的訊息和你設定的名稱。我的成功日誌當時顯示 Capacity: 1/32 · New sessions will be created in an isolated worktree,和官方預設上限 32 一致。
  3. 手機或網頁看得到這個環境,而且可以開新工作。
  4. 完全關掉 SSH 再連回來,服務仍在運作。
  5. 找一個沒有重要工作在跑的時段,重開機測試會不會自動恢復。

看日誌、重啟單一服務:

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 版本。

延伸閱讀

關於作者

Jason 的照片

Jason

Google 大客戶銷售客戶經理、哥倫比亞大學 MBA 錄取,分享自己實際用過的理財工具與經驗。

留言

使用 Google 登入即可留言。留言「不會」使用您的 Google 頭像或姓名,對外顯示的暱稱是系統隨機產生的代號,以保護您的隱私。

登入即表示你同意本站的隱私權政策。

  1. 載入留言中…