# server_rotation **Repository Path**: self_5/server_rotation ## Basic Information - **Project Name**: server_rotation - **Description**: 自动化轮转aliyun轻量级服务器 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-12 - **Last Updated**: 2026-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 阿里云轻量应用服务器 (SWAS) 自动化轮转工具 这是一个用于自动化轮转阿里云轻量应用服务器的 Python 脚本。它能够根据现有的服务器实例自动导出镜像,创建新的更高/更低配置的服务器,自动开放防火墙端口,并同步更新 Cloudflare 上的 DNS 记录,最后自动退订旧服务器以节省成本。 ## 🌟 核心特性 - **一键轮转**:将旧的轻量应用服务器(或指定镜像)一键克隆为全新的服务器实例。 - **DNS 自动切换**:新服务器创建后,自动调用 Cloudflare API将指定域名的 A 记录切换至新 IP。 - **自动退订旧资源**:使用 BSS OpenAPI 自动提交退订申请释放旧实例,避免资源浪费。 - **断点续跑 (幂等性)**:内置 `rotation_state.json` 状态追踪机制。如果遇到网络闪断或 API 报错(如 DNS 鉴权失败),再次运行脚本将自动跳过已完成的步骤(如创建镜像、开通机器等),从中断处继续。 - **镜像配额管理**:自动识别并清理同地域下最早的自定义镜像,防止触发阿里云的“每个地域最多 5 个自定义镜像”的配额限制。 - **配置自更新**:一轮完整的轮转成功后,脚本会自动将 `config.yaml` 中的 `resource_id` 替换为新实例 ID,为下次轮转做好准备。 ## 🛠 环境依赖 要求 Python 3.8+。 安装依赖项: ```bash pip install -r requirements.txt ``` `requirements.txt` 包含: - `alibabacloud_swas_open20200601` (阿里云轻量服务器 SDK) - `alibabacloud_bssopenapi20171214` (阿里云账单与资源释放 SDK) - `cloudflare` (Cloudflare 官方 SDK) - `pyyaml` - `python-dotenv` ## ⚙️ 配置说明 配置分为敏感凭证(`.env`)和业务参数(`config.yaml`)两部分。 ### 1. 安全凭证 (`.env`) 在脚本同级目录下创建一个 `.env` 文件,填入你的 API 凭证: ```env # 阿里云 AccessKey (需要具备管理轻量服务器和提交流程的权限) ALIYUN_ACCESS_KEY_ID="LTAI..." ALIYUN_ACCESS_KEY_SECRET="xyz..." # Cloudflare API Token (需要具体对应 Zone 的 DNS:Edit 权限) CF_API_TOKEN="cf_token_..." CF_ZONE_ID="cf_zone_id_..." ``` ### 2. 业务参数 (`config.yaml`) 复制一份默认的配置文件并根据需要修改: ```yaml # 阿里云全局配置 aliyun: region: "cn-hangzhou" # 轮转目标(可以是旧的实例ID "sw-xxx" 或是镜像ID "m-xxx") resource_id: "sw-bp1xxxx" # 新服务器规格要求 server_spec: plan_id: "swas.s.c2m05s20b1.linux" # 阿里云轻量应用服务器的套餐ID period: 1 # 购买周期(月) auto_renew: false charge_type: "PrePaid" # 需要新服务器自动开放的端口列表 ports: - "22" # 单一端口 - "80" - "443" - "5000/5100" # 支持端口范围,遵循阿里云规定的斜杠格式 - "7000" # Cloudflare DNS 切换设置 cloudflare: # 支持纯字符串列表,也支持为单条域名独立覆盖 proxied 代理设置: domains: - "www.example.com" # 未指定,则继承下方的全局 proxied 设置 - name: "api.example.com" proxied: true # 独立强制开启小黄云,无视全局设置 # 全局默认:是否开启小黄云 (CDN 代理) proxied: false ttl: 60 ``` ## 🚀 使用指南 ### 1. 模拟运行 (Dry Run) 在执行任何会产生费用的真实 API 调用前,建议先验证配置文件是否正确解析: ```bash python server_rotation.py --config config.yaml --dry-run ``` ### 2. 执行完整的轮转 直接运行脚本即可: ```bash python server_rotation.py --config config.yaml ``` **执行流程:** 1. 读取 `resource_id`,若是实例则对其打快照并生成自定义镜像。 2. 使用该自定义镜像购买并开通全新实例。 3. 等待实例处于 Running 状态,写入端口放行规则。 4. 调用 Cloudflare 接口修改 DNS。 5. (如果输入是实例ID)调用 阿里云 BSS 退订接口正式释放旧实例。 6. 修改 `config.yaml`,将里面的 `resource_id` 原地替换为新的机器 ID。 ### 3. 跳过 DNS 阶段 (高级用法) 如果你只想完成服务器的克隆和端口开放,自己去其它域名平台手动改 DNS,可以使用: ```bash python server_rotation.py --config config.yaml --skip-dns ``` 这会在 DNS 步骤前停止,并保留 `rotation_state.json` 文件。等你配置好 Cloudflare 凭证后,不带 `--skip-dns` 再次运行脚本,它会直接秒跳过前三步,纯粹补充执行 DNS 更新和最后的清理工作。 ## ⚠️ 注意事项 1. **退订拦截**:由于阿里云 API 的风控限制,少部分实例的退订申请可能碰到异常(例如账户存在特殊折扣或绑定问题)。此时脚本会输出 Warning 并**继续完成剩余的配置文件更新逻辑**,你需要前往阿里云控制台手动确认退订。 2. **状态文件保留**:如果在运行期间抛出了 `TimeoutError` 或被你按 `Ctrl+C` 中断,目录下会留下一个 `rotation_state.json`。**不要手动删除它**,这保障了你重新运行脚本时不会被重复扣费。只有完整走通最后一步,脚本才会自动删掉它。