Files
xingrin/backend/apps/engine/services/deploy_service.py

78 lines
2.5 KiB
Python
Raw Normal View History

2025-12-12 18:04:57 +08:00
"""
远程节点部署脚本服务
脚本文件位置backend/scripts/worker-deploy/
- bootstrap.sh: 环境初始化安装基础依赖
- install.sh: 安装 Docker + 拉取镜像
- uninstall.sh: 卸载脚本
- start-agent.sh: 启动 agent 容器
- agent.sh: 心跳上报在容器内运行
新架构说明
- 远程节点只需安装 Docker 和运行 agent
- 扫描任务由主服务器通过 SSH docker run 执行
"""
from pathlib import Path
from django.conf import settings
2025-12-12 18:04:57 +08:00
# 脚本目录
SCRIPTS_DIR = Path(__file__).parent.parent.parent.parent / "scripts" / "worker-deploy"
def _read_script(filename: str) -> str:
"""读取脚本文件内容"""
script_path = SCRIPTS_DIR / filename
if script_path.exists():
return script_path.read_text()
else:
raise FileNotFoundError(f"脚本文件不存在: {script_path}")
def get_bootstrap_script() -> str:
"""获取环境初始化脚本"""
return _read_script("bootstrap.sh")
def get_deploy_script() -> str:
"""获取安装脚本(安装 Docker + 拉取镜像)"""
script = _read_script("install.sh")
# 注入镜像版本配置(确保远程节点使用相同版本)
docker_user = getattr(settings, 'DOCKER_USER', 'yyhuni')
image_tag = settings.IMAGE_TAG # 必须有值settings.py 启动时已校验
version_export = f'export DOCKER_USER="{docker_user}"\nexport IMAGE_TAG="{image_tag}"\n'
# 在 set -e 后插入版本配置
script = script.replace('set -e\n', f'set -e\n\n{version_export}', 1)
return script
2025-12-12 18:04:57 +08:00
def get_uninstall_script() -> str:
"""获取卸载脚本"""
return _read_script("uninstall.sh")
def get_start_agent_script(
heartbeat_api_url: str = None,
worker_id: int = None
) -> str:
"""
获取 agent 启动脚本
:param heartbeat_api_url: 心跳上报地址
:param worker_id: Worker ID
"""
script = _read_script("start-agent.sh")
# 替换变量
2025-12-12 18:04:57 +08:00
script = script.replace("{{HEARTBEAT_API_URL}}", heartbeat_api_url or '')
script = script.replace("{{WORKER_ID}}", str(worker_id) if worker_id else '')
# 注入镜像版本配置(确保远程节点使用相同版本)
docker_user = getattr(settings, 'DOCKER_USER', 'yyhuni')
image_tag = settings.IMAGE_TAG # 必须有值settings.py 启动时已校验
version_export = f'export DOCKER_USER="{docker_user}"\nexport IMAGE_TAG="{image_tag}"\n'
# 在 set -e 后插入版本配置
script = script.replace('set -e\n', f'set -e\n\n{version_export}', 1)
2025-12-12 18:04:57 +08:00
return script