Files
xingrin/backend/scripts/worker-deploy/bootstrap.sh
2025-12-12 18:04:57 +08:00

158 lines
4.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"