Files
xingrin/backend/scripts/worker-deploy/bootstrap.sh

158 lines
4.1 KiB
Bash
Raw Normal View History

2025-12-12 18:04:57 +08:00
#!/bin/bash
# ============================================
# XingRin 环境初始化脚本 (通用)
# 用途安装基础依赖git, tmux, curl 等)
# 支持Ubuntu / Debian
# 适用:主机 & Worker VPS
# 特点:幂等执行,重复运行不会重复安装
# ============================================
set -e
# 版本标记(修改此版本号会触发重新安装)
BOOTSTRAP_VERSION="v1"
MARKER_DIR="/opt/xingrin"
MARKER_FILE="${MARKER_DIR}/.bootstrap_done_${BOOTSTRAP_VERSION}"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[XingRin]${NC} $1"
}
log_success() {
echo -e "${GREEN}[XingRin]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[XingRin]${NC} $1"
}
log_error() {
echo -e "${RED}[XingRin]${NC} $1"
}
# 等待 apt 锁释放(最多等待 60 秒)
wait_for_apt_lock() {
local max_wait=60
local waited=0
while sudo fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || \
sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1 || \
sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
if [ $waited -eq 0 ]; then
log_info "等待 apt 锁释放..."
fi
sleep 2
waited=$((waited + 2))
if [ $waited -ge $max_wait ]; then
log_warn "等待 apt 锁超时,继续尝试..."
break
fi
done
}
# 检查是否已完成初始化(返回 0 表示已完成,返回 1 表示需要初始化)
check_already_done() {
if [ -f "$MARKER_FILE" ]; then
log_success "环境已初始化 (${BOOTSTRAP_VERSION}),跳过"
return 0 # 不要 exit让后续脚本继续执行
fi
return 1
}
# 检查操作系统
check_os() {
if ! command -v apt-get &> /dev/null; then
log_error "仅支持 Ubuntu/Debian 系统"
exit 1
fi
log_info "检测到 Ubuntu/Debian 系统"
}
# 安装基础依赖
install_dependencies() {
log_info "安装基础依赖..."
# 等待 apt 锁释放
wait_for_apt_lock
# 更新包索引
sudo apt-get update -qq 2>/dev/null || true
# 安装 git必须
if ! command -v git &> /dev/null; then
log_info " - 安装 git..."
sudo apt-get install -y -qq git >/dev/null 2>&1
else
log_info " - git 已安装"
fi
# 安装 tmux会话持久化
if ! command -v tmux &> /dev/null; then
log_info " - 安装 tmux..."
sudo apt-get install -y -qq tmux >/dev/null 2>&1
else
log_info " - tmux 已安装"
fi
# 安装 curl网络请求
if ! command -v curl &> /dev/null; then
log_info " - 安装 curl..."
sudo apt-get install -y -qq curl >/dev/null 2>&1
else
log_info " - curl 已安装"
fi
# 安装 jqJSON 处理,可选)
if ! command -v jq &> /dev/null; then
log_info " - 安装 jq..."
sudo apt-get install -y -qq jq >/dev/null 2>&1
else
log_info " - jq 已安装"
fi
}
# 创建工作目录
create_directories() {
log_info "创建工作目录..."
sudo mkdir -p "$MARKER_DIR"
sudo mkdir -p "${MARKER_DIR}/logs"
sudo mkdir -p "${MARKER_DIR}/data"
sudo chmod 755 "$MARKER_DIR"
sudo chown -R $USER:$USER "$MARKER_DIR"
}
# 写入完成标记
write_marker() {
echo "Bootstrap completed at $(date)" | sudo tee "$MARKER_FILE" > /dev/null
log_success "环境初始化完成"
}
# 主流程
main() {
log_info "=========================================="
log_info " XingRin 环境初始化"
log_info "=========================================="
# 检查是否已初始化,如果已初始化则跳过初始化步骤(但不退出,让后续部署脚本继续执行)
if check_already_done; then
return 0 # 跳过初始化继续执行后续脚本Docker 部署、启动容器等)
fi
check_os
create_directories
install_dependencies
write_marker
log_info "=========================================="
log_success " ✓ 初始化完成"
log_info "=========================================="
}
main "$@"