#!/bin/bash set -e # ============================================================ # Weibo-HotSign MySQL 初始化脚本(需要 root 权限) # 用途: 建库、建表、创建业务用户并授权 # 使用方式: chmod +x init_mysql.sh && ./init_mysql.sh # 只需运行一次,后续用 setup_linux.sh 做业务配置 # ============================================================ # ===================== 请在此处填写配置 ===================== MYSQL_ROOT_PASSWORD="" # ← 填写 MySQL root 密码 # 业务用户配置(setup_linux.sh 中要保持一致) BIZ_USER="weibo" BIZ_PASSWORD="123456" # ← 填写业务用户密码 BIZ_HOST="%" # 允许连接的来源,% 表示任意 MYSQL_HOST="127.0.0.1" MYSQL_PORT="3306" DB_NAME="weibo_hotsign" # ===================== 配置结束 ===================== PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' info() { echo -e "${GREEN}[✓]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } error() { echo -e "${RED}[✗]${NC} $1"; exit 1; } echo "" echo "========================================" echo " Weibo-HotSign MySQL 初始化(root)" echo "========================================" echo "" # 检查 mysql 客户端 command -v mysql >/dev/null 2>&1 || error "未找到 mysql 客户端" # 构建 root 连接命令 ROOT_CMD="mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -uroot" if [ -n "$MYSQL_ROOT_PASSWORD" ]; then ROOT_CMD="$ROOT_CMD -p${MYSQL_ROOT_PASSWORD}" fi # 测试 root 连接 if $ROOT_CMD -e "SELECT 1" >/dev/null 2>&1; then info "MySQL root 连接成功" else error "MySQL root 连接失败,请检查 root 密码" fi # ------ 1. 创建数据库 ------ echo "" echo "--- 创建数据库 ---" $ROOT_CMD -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" info "数据库 ${DB_NAME} 已创建" # ------ 2. 创建业务用户并授权 ------ echo "" echo "--- 创建业务用户 ---" # 创建用户(如果已存在则忽略) $ROOT_CMD -e "CREATE USER IF NOT EXISTS '${BIZ_USER}'@'${BIZ_HOST}' IDENTIFIED BY '${BIZ_PASSWORD}';" 2>/dev/null || true # 授权 $ROOT_CMD -e "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${BIZ_USER}'@'${BIZ_HOST}';" $ROOT_CMD -e "FLUSH PRIVILEGES;" info "用户 ${BIZ_USER} 已创建并授权 ${DB_NAME} 库" # ------ 3. 建表 ------ echo "" echo "--- 创建表结构 ---" $ROOT_CMD ${DB_NAME} < "${PROJECT_DIR}/init-db.sql" info "所有表创建完成" # ------ 4. 创建测试用户(可选) ------ echo "" echo "--- 检查测试用户 ---" USER_COUNT=$($ROOT_CMD -N -e "SELECT COUNT(*) FROM ${DB_NAME}.users" 2>/dev/null) if [ "$USER_COUNT" = "0" ]; then # 检查 bcrypt 是否可用 if python3 -c "import bcrypt" 2>/dev/null; then HASHED_PW=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'Admin123', bcrypt.gensalt(12)).decode())") USER_ID=$(python3 -c "import uuid; print(str(uuid.uuid4()))") $ROOT_CMD ${DB_NAME} -e " INSERT INTO users (id, username, email, hashed_password, is_admin, is_active) VALUES ('${USER_ID}', 'admin', 'admin@example.com', '${HASHED_PW}', 1, 1); " info "管理员用户已创建: admin@example.com / Admin123 (管理员)" else warn "bcrypt 未安装,跳过管理员创建(运行 setup_linux.sh 安装依赖后可手动创建)" fi else info "已有 ${USER_COUNT} 个用户,跳过" fi # ------ 5. 验证 ------ echo "" echo "--- 验证业务用户权限 ---" BIZ_CMD="mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${BIZ_USER}" if [ -n "$BIZ_PASSWORD" ]; then BIZ_CMD="$BIZ_CMD -p${BIZ_PASSWORD}" fi TABLE_COUNT=$($BIZ_CMD -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DB_NAME}'" 2>/dev/null) if [ "$TABLE_COUNT" -gt 0 ] 2>/dev/null; then info "业务用户 ${BIZ_USER} 可正常访问 ${DB_NAME}(${TABLE_COUNT} 张表)" else error "业务用户权限验证失败" fi echo "" echo "========================================" echo " MySQL 初始化完成" echo "========================================" echo "" echo " 数据库: ${DB_NAME}" echo " 业务用户: ${BIZ_USER}" echo " 表数量: ${TABLE_COUNT}" echo "" echo " 下一步: ./setup_linux.sh" echo ""