Oracle 圣何塞抢机(二):oci-arm-host-capacity——Telegram 通知与 GitHub Actions
这是 Oracle 圣何塞抢机系列的第二篇。
系列目录
- (一)oci-arm-catcher——Shell 脚本轻量部署
- (二)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
- Telegram 搜索
@BotFather→ 发送/newbot→ 按提示设置名称 → 复制 Token - 向你的 Bot 发送任意消息
- 在浏览器访问
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates - 在返回 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
确认无认证错误(SignatureDoesNotMatch 或 NotAuthenticated)后,再后台启动。
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 |
系列目录
- (一)oci-arm-catcher——Shell 脚本轻量部署
- (二)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