refactor: Hub二进制改为Docker构建时下载,优化部署流程与worker初始化

- Dockerfile: 移除COPY预编译二进制,改为构建时通过HUB_TAG从GitHub Release下载
- CI: 移除artifact上传/下载步骤,通过build-args传递Hub tag
- deploy.sh: 重构参数解析,支持--hub-tag指定版本,跟踪tag变化触发重建
- build.sh: 新增--image模式支持构建并推送Hub Docker镜像
- hub.rs: worker连接时同步所有节点在线状态,避免状态不一致
- proxy_nodes: 启动时主动建立Hub worker连接,消除懒连接窗口期
- docker-compose.yml: app镜像支持APP_IMAGE环境变量配置
- README: 更新部署文档,推荐本地构建方式
This commit is contained in:
fawney19
2026-03-02 11:24:14 +08:00
parent c9dbe7936b
commit 0564893c4f
12 changed files with 540 additions and 231 deletions

View File

@@ -258,7 +258,8 @@ impl HubRouter {
pub fn register_worker(&self, conn: Arc<WorkerConn>) {
info!(worker_id = conn.id, "worker connected");
self.worker_conns.insert(conn.id, conn);
self.worker_conns.insert(conn.id, conn.clone());
self.sync_node_status_to_worker(&conn);
}
pub fn unregister_worker(&self, conn_id: u64) {
@@ -667,6 +668,28 @@ impl HubRouter {
);
}
/// When a worker connects, sync all current node statuses so worker state
/// is consistent even if proxies connected before this worker came online.
fn sync_node_status_to_worker(&self, worker: &Arc<WorkerConn>) {
let snapshot: Vec<(String, usize)> = {
let map = self.proxy_conns.read();
map.iter()
.map(|(node_id, conns)| (node_id.clone(), conns.len()))
.collect()
};
for (node_id, conn_count) in &snapshot {
let frame = protocol::encode_node_status(node_id, *conn_count > 0, *conn_count);
let _ = worker.send(Message::Binary(frame.into()));
}
debug!(
worker_id = worker.id,
nodes_synced = snapshot.len(),
"synced NODE_STATUS snapshot to worker"
);
}
// -----------------------------------------------------------------------
// Stats
// -----------------------------------------------------------------------