Oracle 圣何塞抢机(二):oci-arm-host-capacity——Telegram 通知与 GitHub Actions

这是 Oracle 圣何塞抢机系列的第二篇。

系列目录

  1. (一)oci-arm-catcher——Shell 脚本轻量部署
  2. (二)oci-arm-host-capacity——PHP 版,支持 Telegram 通知与 GitHub Actions(本文)

# Oracle 圣何塞 ARM 抢机(二) ## 与脚本一的区别 - 依赖 PHP + Composer(非 OCI CLI) - 直接调用 OCI REST API 签名 - 原生 Telegram 通知 - 支持多可用域并发 - 支持多账号配置 - GitHub Actions 免费托管 ## 账号与密钥 - 控制台生成 API 密钥(下载 .pem) - 无需安装 OCI CLI - 收集 OCID、Fingerprint、Region ## 安装运行环境 - PHP 8.x + php-curl - Composer 依赖管理 - composer install ## .env 配置 - 认证:Region / UserID / TenancyID / Fingerprint / 私钥路径 - 实例:SubnetID / ImageID / OCPUS / MEMORY / Shape - SSH 公钥内容(非路径) - TOO_MANY_REQUESTS_TIME_WAIT ## Telegram 通知 - BotFather 创建 Bot,获取 Token - getUpdates 获取 Chat ID - index.php 写入推送代码 ## 运行方式 - php index.php 手动测试 - while 循环后台持续运行 - Systemd 服务持久化 - cron 每分钟执行 ## GitHub Actions 托管 - Fork 仓库 - 配置 Repository Secrets - 启用 workflow,每 5 分钟触发 ## 多账号并发 - index.php 配置多个 OciConfig - 同时监控多个账号配额

一、与脚本一的对比

对比项 oci-arm-catcher(教程一) oci-arm-host-capacity(本文)
依赖 OCI CLI + Python 3 PHP + Composer
Telegram 通知 需自行添加 原生支持
GitHub Actions 不支持 原生支持
多账号 不支持 支持
安装难度
推荐场景 快速跑起来 需要通知、多账号、无服务器托管

本文适合:希望抢机成功时立刻收到 Telegram 推送、或没有长期运行的服务器想借助 GitHub Actions 免费跑的读者。


二、账号准备

与教程一相同,注册时主区域必须选 US West (San Jose),并准备好 VISA/Mastercard 外币信用卡。

2.1 生成 OCI API 密钥(无需 OCI CLI)

flowchart LR A[登录控制台] --> B[右上角头像] B --> C[用户设置] C --> D[API 密钥 → 添加] D --> E[生成密钥对] E --> F[下载私钥 .pem] F --> G[复制弹出框配置信息]

将私钥上传到服务器并设置权限:

mkdir -p ~/.oci
mv ~/oracle_key.pem ~/.oci/
chmod 600 ~/.oci/oracle_key.pem

需要记录的四项(弹出框中全部可见):

参数名 示例
OCI_USER_ID ocid1.user.oc1..aaaaaa...
OCI_TENANCY_ID ocid1.tenancy.oc1..aaaaaa...
OCI_KEY_FINGERPRINT b3:a5:90:...:8d:1c
OCI_REGION us-sanjose-1

2.2 收集子网和镜像 OCID

  • 子网 OCID:控制台 → 网络 → VCN → 点击子网名称 → 复制 OCID
  • 镜像 OCID:控制台 → 计算 → 镜像 → 平台镜像 → 筛选 ARM + Ubuntu 22.04 → 复制 OCID

2.3 设置预算警报(必做)

控制台 → 账单与成本管理 → 预算 → 新建 → 金额 5 美元 → 开启邮件通知。


三、安装 PHP 和 Composer

# Ubuntu / Debian
sudo apt update
sudo apt install -y php8.1 php8.1-cli php8.1-curl php8.1-mbstring

# 安装 Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# 验证
php --version && composer --version

四、安装项目依赖

脚本已克隆至 /home/sdmike/oracle-arm-grabber/oci-arm-host-capacity/

cd /home/sdmike/oracle-arm-grabber/oci-arm-host-capacity
composer install

五、配置 .env

cp .env.example .env
nano .env

圣何塞完整配置:

# ── 认证信息 ──────────────────────────────────────
OCI_REGION=us-sanjose-1
OCI_USER_ID=ocid1.user.oc1..aaaaaaaaxxxxxxxxxx
OCI_TENANCY_ID=ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxx
OCI_KEY_FINGERPRINT=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

# 私钥绝对路径(注意是私钥,不是公钥)
OCI_PRIVATE_KEY_FILENAME="/home/sdmike/.oci/oracle_key.pem"

# ── 网络与镜像 ─────────────────────────────────────
OCI_SUBNET_ID=ocid1.subnet.oc1.us-sanjose-1.aaaaaaaaxxxxxxxxxx
OCI_IMAGE_ID=ocid1.image.oc1.us-sanjose-1.aaaaaaaaxxxxxxxxxx

# ── 实例规格 ───────────────────────────────────────
# 先抢 1核6GB,成功率高 3 倍,抢到后控制台扩容
OCI_OCPUS=1
OCI_MEMORY_IN_GBS=6
OCI_SHAPE=VM.Standard.A1.Flex
OCI_MAX_INSTANCES=1

# ── SSH 公钥内容(粘贴内容,不是路径)────────────────
# 获取方法:cat ~/.ssh/id_ed25519.pub
OCI_SSH_PUBLIC_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your@email.com"

# ── 可用域(留空自动获取圣何塞所有 AD)───────────────
OCI_AVAILABILITY_DOMAIN=
CACHE_AVAILABILITY_DOMAINS=1

# ── 限流保护 ───────────────────────────────────────
TOO_MANY_REQUESTS_TIME_WAIT=600

# ── 启动盘大小(可选,ARM 最小 50,最大 200)────────
OCI_BOOT_VOLUME_SIZE_IN_GBS=50

六、配置 Telegram 通知(可选)

flowchart LR A[Telegram 搜索 @BotFather] --> B[/newbot 创建 Bot] B --> C[复制 Bot Token] C --> D[向 Bot 发一条消息] D --> E[访问 getUpdates API] E --> F[获取 Chat ID] F --> G[写入 index.php]

6.1 获取 Bot Token 和 Chat ID

  1. Telegram 搜索 @BotFather → 发送 /newbot → 按提示设置名称 → 复制 Token
  2. 向你的 Bot 发送任意消息
  3. 在浏览器访问 https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
  4. 在返回 JSON 中找到 "chat":{"id":123456789} 的数字

6.2 在 index.php 添加推送

在文件末尾成功创建实例的逻辑后追加:

$botToken = 'YOUR_BOT_TOKEN';
$chatId   = 'YOUR_CHAT_ID';
$message  = "🎉 Oracle ARM 实例创建成功!\n区域:us-sanjose-1";

file_get_contents(
    "https://api.telegram.org/bot{$botToken}/sendMessage" .
    "?chat_id={$chatId}&text=" . urlencode($message)
);

七、运行脚本

7.1 手动测试

cd /home/sdmike/oracle-arm-grabber/oci-arm-host-capacity
php index.php

确认无认证错误(SignatureDoesNotMatchNotAuthenticated)后,再后台启动。

7.2 后台持续运行

nohup bash -c 'while true; do php index.php; sleep 3; done' \
  > /home/sdmike/oracle-arm-grabber/oci-arm-host-capacity/catcher.log 2>&1 &
echo "PID: $!"

tail -f /home/sdmike/oracle-arm-grabber/oci-arm-host-capacity/catcher.log

7.3 Systemd 服务

sudo tee /etc/systemd/system/oci-arm-host-capacity.service > /dev/null <<'EOF'
[Unit]
Description=OCI ARM Host Capacity (PHP)
After=network-online.target

[Service]
Type=simple
User=sdmike
WorkingDirectory=/home/sdmike/oracle-arm-grabber/oci-arm-host-capacity
ExecStart=/bin/bash -c 'while true; do php index.php; sleep 3; done'
Restart=always
StandardOutput=append:/home/sdmike/oracle-arm-grabber/oci-arm-host-capacity/catcher.log
StandardError=append:/home/sdmike/oracle-arm-grabber/oci-arm-host-capacity/catcher.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now oci-arm-host-capacity

八、GitHub Actions 免费托管(无服务器方案)

没有长期运行的服务器时,可以将脚本完全托管在 GitHub Actions 上,每月有 2000 分钟免费配额。

flowchart LR A[Fork 仓库] --> B[Settings → Secrets] B --> C[填入所有 OCID 和密钥] C --> D[Actions → 启用 Workflow] D --> E[每 5 分钟自动触发] E --> F{结果} F -->|成功| G[实例创建 + 通知] F -->|容量不足| E

8.1 Fork 仓库

https://github.com/hitrov/oci-arm-host-capacity Fork 到自己的 GitHub 账号。

8.2 配置 Repository Secrets

仓库 → Settings → Secrets and variables → Actions → New repository secret,依次添加:

Secret 名
OCI_REGION us-sanjose-1
OCI_USER_ID 用户 OCID
OCI_TENANCY_ID 租户 OCID
OCI_KEY_FINGERPRINT 密钥指纹
OCI_PRIVATE_KEY 私钥文件完整内容(含 -----BEGIN... 行)
OCI_SUBNET_ID 子网 OCID
OCI_IMAGE_ID 镜像 OCID
OCI_SSH_PUBLIC_KEY SSH 公钥内容
OCI_OCPUS 1
OCI_MEMORY_IN_GBS 6

8.3 启用 Workflow

仓库 → Actions → 找到 launch.yml → 启用 → 手动触发测试一次,之后按 cron 自动运行。


九、多账号并发(高级)

index.php 中配置多个 OciConfig 实例,同时监控多个账号:

$configs = [
    new OciConfig(
        region: 'us-sanjose-1',
        userId: 'ocid1.user.oc1..账号A',
        // ...
    ),
    new OciConfig(
        region: 'us-sanjose-1',
        userId: 'ocid1.user.oc1..账号B',
        // ...
    ),
];

十、常见问题

错误 原因 处理
Out of host capacity 无可用资源 正常,继续运行
SignatureDoesNotMatch 私钥路径或权限错误 检查路径,确认 chmod 600
NotAuthenticated UserID 或 Fingerprint 填错 重新核对控制台值
Composer not found 依赖未安装 重新执行 composer install
429 Too Many Requests 请求频率过高 增大 TOO_MANY_REQUESTS_TIME_WAIT 或加大 sleep 间隔

相关链接

用途 地址
注册免费账号 https://www.oracle.com/cloud/free/
云控制台 https://cloud.oracle.com/
Always Free 资源说明 https://docs.oracle.com/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm
LaunchInstance API 文档 https://docs.oracle.com/en-us/iaas/api/#/en/iaas/20160918/Instance/LaunchInstance
oci-arm-host-capacity 项目 https://github.com/hitrov/oci-arm-host-capacity

系列目录

  1. (一)oci-arm-catcher——Shell 脚本轻量部署
  2. (二)oci-arm-host-capacity——PHP 版,支持 Telegram 通知与 GitHub Actions(本文)

实操清单

账号与密钥

  • 注册 Oracle 账号,主区域选 US West (San Jose)
  • 控制台 → 用户设置 → API 密钥 → 生成并下载私钥 .pem
  • mkdir -p ~/.oci && chmod 600 ~/.oci/*.pem
  • 记录 User OCID、Tenancy OCID、Key Fingerprint
  • 生成 SSH 密钥:ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

控制台配置

  • 创建 VCN,记录公共子网 OCID
  • 获取 ARM Ubuntu 22.04 镜像 OCID
  • 设置 5 美元预算警报(必做)

安装环境

  • sudo apt install -y php8.1 php8.1-cli php8.1-curl
  • 安装 Composer 并全局可用
  • cd oci-arm-host-capacity && composer install

脚本配置与启动

  • cp .env.example .env && nano .env(填入所有 OCID)
  • php index.php 手动测试,确认无认证错误
  • 后台启动循环:nohup bash -c 'while true; do php index.php; sleep 3; done' > catcher.log 2>&1 &
  • tail -f catcher.log 确认正常输出
  • (可选)配置 Telegram Bot Token 和 Chat ID

抢到实例后

  • 控制台安全列表开放 TCP 22 端口
  • ssh -i ~/.ssh/id_ed25519 ubuntu@<公网IP> 验证登录
  • ARM 实例上配置保活 cron:(crontab -l 2>/dev/null; echo "*/20 * * * * uptime > /dev/null") | crontab -
  • sudo systemctl stop oci-arm-host-capacity 停止抢机脚本
  • (可选)控制台调整规格至 4核24GB