Oracle Cloud Always Free ARM 实例全自动抢购教程(从零开始)

适用场景:甲骨文云 Always Free 额度中的 ARM 实例(VM.Standard.A1.Flex)经常提示 “Out of host capacity”,手动创建很难成功。本教程教你用官方 OCI CLI + 开源脚本实现全自动挂机抢购,断 SSH 后也能持续运行。

当前免费额度提醒(2026 年 6 月后):
Always Free 账户总计最多 2 OCPU + 12 GB 内存。建议直接按此规格申请。

推荐脚本:alexpua/oci-arm-catcher(轻量、基于官方 CLI、逻辑清晰)。

一、准备工作

  1. 已有甲骨文云账号并开通 Always Free。
  2. 已有一台可 SSH 登录的服务器(推荐用现有的 Always Free AMD 小机挂脚本)。
  3. 准备好 SSH 密钥对(没有的话后面会教生成)。

二、获取必要的身份信息(控制台操作)

登录 Oracle Cloud 控制台

1. 获取 Tenancy OCID(租户 ID)

点击右上角头像 → Tenancy: 你的租户名
在 Tenancy Information 区域找到 OCID,点击 Copy
格式类似:ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxx

2. 获取 User OCID(用户 ID)

点击右上角头像 → User settings
找到 OCID,点击 Copy
格式类似:ocid1.user.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxx

3. 生成并添加 API Key

仍在 User settings 页面
左侧点击 API Keys
点击 Add API Key
选择 Generate API key pair
点击 Download private key(请妥善保存 .pem 文件)
点击 Add
记录生成的 Fingerprint(指纹)

4. 确认 Region

右上角当前区域代码,例如:ap-tokyo-1ap-singapore-1 等。

三、在服务器上安装并配置 OCI CLI

SSH 登录服务器后执行:

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装 OCI CLI(官方脚本)
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

# 将 oci 加入 PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc

# 验证安装
oci --version

配置 OCI CLI

oci setup config

按提示填写:
Config 位置:直接回车(默认 ~/.oci/config
User OCID:粘贴刚才复制的
Tenancy OCID:粘贴刚才复制的
Region:输入你的区域代码(如 ap-tokyo-1
是否生成新密钥:如果已下载私钥选 n,并输入私钥路径;否则选 y

修复私钥权限(重要)

# 替换为你的实际私钥文件名
oci setup repair-file-permissions --file ~/.oci/你的私钥文件名.pem

# 或手动执行
chmod 600 ~/.oci/你的私钥文件名.pem

验证配置成功

oci iam region list

能正常输出区域列表即表示配置成功。

四、下载抢购脚本

cd ~
git clone https://github.com/alexpua/oci-arm-catcher.git
cd oci-arm-catcher
chmod +x oci-arm-catcher.sh
chmod +x scripts/get-config.sh

五、获取剩余配置信息

1. 生成 SSH 密钥(如果没有)

ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub

2. 查询 Availability Domain

oci iam availability-domain list --query "data[].name" --output table

记录输出的 AD 名称(例如 XXXX:AP-TOKYO-1-AD-1)。

3. 查询 Subnet OCID

oci network subnet list \
--compartment-id 你的Tenancy_OCID \
--all \
--query "data[].{Name:\"display-name\", OCID:id, Public:\"prohibit-public-ip-on-vnic\"}" \
--output table

选择 prohibit-public-ip-on-vnic = false 的公有子网。

4. 查询 IMAGE_ID(推荐 Ubuntu ARM)

oci compute image list \
--compartment-id 你的Tenancy_OCID \
--operating-system "Canonical Ubuntu" \
--shape "VM.Standard.A1.Flex" \
--sort-by TIMECREATED \
--sort-order DESC \
--query "data[0:5].{Name:\"display-name\", OCID:id}" \
--output table

推荐选择最新的完整版 Ubuntu aarch64 镜像(非 Minimal)。

也可查询 Oracle Linux:

oci compute image list \
--compartment-id 你的Tenancy_OCID \
--operating-system "Oracle Linux" \
--shape "VM.Standard.A1.Flex" \
--sort-by TIMECREATED \
--sort-order DESC \
--query "data[0:5].{Name:\"display-name\", OCID:id}" \
--output table

六、配置 .env 文件

cp .env.example .env
nano .env

将以下内容填入(替换为你自己的实际值):

COMPARTMENT_ID="ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxx"
DISPLAY_NAME="my-free-arm"
SSH_KEY_FILE="~/.ssh/id_ed25519.pub"
AVAILABILITY_DOMAIN="XXXX:AP-TOKYO-1-AD-1"
SUBNET_ID="ocid1.subnet.oc1.ap-tokyo-1.aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxx"
IMAGE_ID="ocid1.image.oc1.ap-tokyo-1.aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxx"
OCPUS=2
MEMORY_GB=12
RETRY_INTERVAL=300

保存退出(Ctrl+O → 回车 → Ctrl+X)。

七、后台启动抢购(断 SSH 后继续运行)

推荐使用 nohup

cd ~/oci-arm-catcher
nohup ./oci-arm-catcher.sh > catcher.log 2>&1 &

确认进程正在运行:

ps aux | grep oci-arm-catcher

八、日常监控与管理

实时查看日志:

tail -f ~/oci-arm-catcher/catcher.log

查看最新日志:

tail -n 50 ~/oci-arm-catcher/catcher.log

停止脚本:

pkill -f oci-arm-catcher.sh

正常运行时输出示例:

[日期时间] Attempt #X
-> InternalError: Out of host capacity.
⏳ XX:XX until next attempt

成功后会自动停止,日志中会出现:

SUCCESS! Instance created: ocid1.instance.oc1.xxxxxx

九、抢到后操作

  1. 登录控制台 → ComputeInstances,确认实例已创建。
  2. 使用对应私钥登录:
    ssh -i ~/.ssh/id_ed25519 ubuntu@公网IP
    (Ubuntu 默认用户为 ubuntu,Oracle Linux 通常为 opc

重要提示

重试间隔建议保持 300 秒(5 分钟),避免触发限流。
热门区域(如东京、新加坡)可能需要挂机数小时到数天。
成功后请及时停止脚本,避免重复创建。
本教程仅调用官方 API,符合正常使用规范,请勿恶意高频请求。

祝大家早日抢到!