-- 弹性节点基建(task #14 / tsk_6u0FxmbC7Yeq) -- 厂商 API 适配层与一键更换编排所需的最小附加结构。全部为附加式变更, -- 不触碰现网生产 EC2(deploy/ 的 marzban 机器)。 -- nodes 增补:厂商实例标识与弹性 IP 标识(销毁 / 换 IP 不换机所需)。 -- 凭证仍不入库;这里只存厂商侧的资源 ID,便于幂等地销毁与换绑。 ALTER TABLE nodes ADD COLUMN provider_instance_id VARCHAR(128) NULL AFTER provider_id, ADD COLUMN elastic_ip_id VARCHAR(128) NULL AFTER provider_instance_id; -- node_events 增补 ip_rotated(换 IP 不换机的审计事件)。 ALTER TABLE node_events MODIFY COLUMN event ENUM('provisioned','probe_pass','probe_fail','marked_up','draining', 'blocked_suspect','blocked_confirmed','replaced','destroyed','ip_rotated') NOT NULL; -- 开退机幂等表:幂等键 → 已开机节点 uuid。重放同一幂等键不重复开机。 CREATE TABLE provision_idempotency ( idempotency_key VARCHAR(128) NOT NULL PRIMARY KEY, node_uuid CHAR(36) NOT NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 一键更换编排记录:make-before-break 的可恢复状态机。 -- 进程崩溃后可凭 uuid 续跑,step 标记进度,不重复开机 / 不重复销毁。 CREATE TABLE replacements ( uuid CHAR(36) NOT NULL PRIMARY KEY, old_node_id BIGINT UNSIGNED NOT NULL, new_node_id BIGINT UNSIGNED NULL, pool ENUM('consumable','premium') NOT NULL, status ENUM('running','done','failed') NOT NULL DEFAULT 'running', step VARCHAR(32) NOT NULL DEFAULT 'open_new', detail JSON NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), INDEX idx_status (status), INDEX idx_old_node (old_node_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;