diff --git a/deploy.sh b/deploy.sh index 06fc506..d716385 100644 --- a/deploy.sh +++ b/deploy.sh @@ -359,6 +359,33 @@ do_deploy() { print_subtitle "开始部署" echo "" + # ----- 事务前钩子:备份数据库 ----- + print_step "备份数据库..." + BACKUP_DIR="${DEPLOY_DIR}/backups" + mkdir -p "$BACKUP_DIR" + + DB_FILE="$DATA_DIR/frpc-console.db" + if [ -f "$DB_FILE" ]; then + TIMESTAMP=$(date +%Y%m%d_%H%M%S) + BACKUP_FILE="$BACKUP_DIR/frpc-console.db.$TIMESTAMP" + cp "$DB_FILE" "$BACKUP_FILE" + print_info "已备份: $BACKUP_FILE" + + # 检查数据库是否有效(存在 users 表) + if command -v sqlite3 &> /dev/null; then + if ! sqlite3 "$DB_FILE" "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='users';" 2>/dev/null | grep -q "^1$"; then + print_warn "数据库文件无效,将删除,由容器全新初始化" + rm -f "$DB_FILE" + else + print_info "数据库有效,保留" + fi + else + print_warn "sqlite3 未安装,无法检查数据库有效性,保留原文件" + fi + else + print_info "数据库文件不存在,跳过备份" + fi + # ----- 安装必要工具 ----- if [ "$NEED_INSTALL_GIT" = true ] || [ "$NEED_INSTALL_CURL" = true ] || [ "$NEED_INSTALL_WGET" = true ]; then print_step "安装必要工具..." @@ -487,14 +514,10 @@ do_deploy() { mkdir -p "$DEPLOY_DIR" mkdir -p "$DATA_DIR" - DB_FILE="$DATA_DIR/frpc-console.db" - if [ "$CONTAINER_EXISTS" = true ] && [ -f "$DB_FILE" ] && [ -s "$DB_FILE" ]; then - print_info "已有有效数据库文件,保留现有数据" - elif [ -f "$DB_FILE" ] && [ -s "$DB_FILE" ]; then - print_info "检测到有效数据库文件,保留现有数据" + if [ -f "$DB_FILE" ]; then + print_info "数据库文件存在,将保留" else - touch "$DB_FILE" - print_info "新数据目录已创建" + print_info "数据库文件不存在,容器启动时将自动创建" fi cp frpc-console "$DEPLOY_DIR/" @@ -533,13 +556,29 @@ do_deploy() { exit 1 fi - # ----- 检查 frpc 子进程 ----- + # ----- 检查 frpc 子进程(增强版) ----- print_step "检查 frpc 状态..." sleep 3 - if docker exec frpc-console ps aux 2>/dev/null | grep -q "[f]rpc -c"; then - print_success "frpc 进程运行正常" + + # 先确认容器在运行 + if docker ps --format '{{.Names}}' | grep -q "^frpc-console$"; then + # 再检查 frpc 进程 + if docker exec frpc-console ps aux 2>/dev/null | grep -q "[f]rpc -c"; then + print_success "frpc 进程运行正常" + else + print_warn "frpc 进程未运行(可能配置为空,请在 WebUI 中导入 TOML)" + fi else - print_warn "frpc 进程未运行(可能配置为空,请在 WebUI 中导入 TOML)" + print_error "frpc-console 容器未运行,请检查日志" + exit 1 + fi + + # ----- 事务后钩子:检测数据库是否可用 ----- + print_step "验证数据库状态..." + if docker exec frpc-console sqlite3 /app/data/frpc-console.db "SELECT COUNT(*) FROM users;" 2>/dev/null | grep -q "^[0-9]"; then + print_success "数据库可用" + else + print_warn "数据库为空或不可用,请通过 WebUI 注册管理员账户" fi # ----- 清理临时文件 ----- @@ -555,6 +594,7 @@ do_deploy() { echo "" echo -e " ${CYAN}📍 访问地址:${NC} http://$(hostname -I | awk '{print $1}'):${PORT}" echo -e " ${CYAN}📂 数据目录:${NC} ${DATA_DIR}" + echo -e " ${CYAN}📦 备份目录:${NC} ${BACKUP_DIR}" echo -e " ${CYAN}🐳 容器名称:${NC} frpc-console" echo "" echo -e " ${CYAN}常用命令:${NC}"