diff --git a/init-db.sql b/init-db.sql index fa87c33..3c37831 100644 --- a/init-db.sql +++ b/init-db.sql @@ -1,8 +1,6 @@ -- Weibo-HotSign Database Initialization Script for MySQL --- 创建数据库和表结构 - -CREATE DATABASE IF NOT EXISTS weibo_hotsign DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -USE weibo_hotsign; +-- 创建表结构(数据库需提前创建好) +-- 如需手动建库: CREATE DATABASE weibo_hotsign DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Users table CREATE TABLE IF NOT EXISTS users ( diff --git a/init_mysql.sh b/init_mysql.sh new file mode 100644 index 0000000..a149a91 --- /dev/null +++ b/init_mysql.sh @@ -0,0 +1,137 @@ +#!/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_active) + VALUES ('${USER_ID}', 'admin', 'admin@example.com', '${HASHED_PW}', 1); + " + info "测试用户已创建: admin / 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 "" diff --git a/setup_linux.sh b/setup_linux.sh index f1e0896..73d2c77 100644 --- a/setup_linux.sh +++ b/setup_linux.sh @@ -102,47 +102,22 @@ else error "Redis 连接失败,请检查地址、端口和密码" fi -# ------ 4. 初始化 MySQL 数据库 ------ +# ------ 4. 验证 MySQL 数据库 ------ echo "" -echo "--- 初始化 MySQL 数据库 ---" +echo "--- 验证 MySQL 数据库 ---" -if $MYSQL_CMD -e "USE ${DB_NAME}" >/dev/null 2>&1; then - # 数据库已存在,检查是否需要加微信字段 - HAS_WX=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='${DB_NAME}' AND TABLE_NAME='users' AND COLUMN_NAME='wx_openid'" 2>/dev/null) - if [ "$HAS_WX" = "0" ]; then - warn "数据库已存在,正在添加微信登录字段..." - $MYSQL_CMD ${DB_NAME} -e " - ALTER TABLE users ADD COLUMN wx_openid VARCHAR(64) UNIQUE AFTER hashed_password; - ALTER TABLE users ADD COLUMN wx_nickname VARCHAR(100) AFTER wx_openid; - ALTER TABLE users ADD COLUMN wx_avatar VARCHAR(500) AFTER wx_nickname; - ALTER TABLE users MODIFY COLUMN email VARCHAR(255) NULL; - ALTER TABLE users MODIFY COLUMN hashed_password VARCHAR(255) NULL; - " 2>/dev/null || true - info "微信字段已添加" - else - info "数据库 ${DB_NAME} 已存在且结构完整" - fi -else - info "正在创建数据库和表..." - $MYSQL_CMD < "${PROJECT_DIR}/init-db.sql" - info "数据库 ${DB_NAME} 创建完成" +if ! $MYSQL_CMD -e "USE ${DB_NAME}" >/dev/null 2>&1; then + error "数据库 ${DB_NAME} 不存在,请先运行: ./init_mysql.sh" fi -# 创建测试用户(如果 users 表为空) -USER_COUNT=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM ${DB_NAME}.users" 2>/dev/null) -if [ "$USER_COUNT" = "0" ]; then - info "正在创建测试用户..." - # 用 python 生成 bcrypt 密码 - 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()))") - $MYSQL_CMD ${DB_NAME} -e " - INSERT INTO users (id, username, email, hashed_password, is_active) - VALUES ('${USER_ID}', 'admin', 'admin@example.com', '${HASHED_PW}', 1); - " - info "测试用户: admin / Admin123!" +TABLE_COUNT=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DB_NAME}'" 2>/dev/null) +if [ "$TABLE_COUNT" -lt 1 ] 2>/dev/null; then + error "数据库 ${DB_NAME} 中没有表,请先运行: ./init_mysql.sh" fi +info "数据库 ${DB_NAME} 验证通过(${TABLE_COUNT} 张表)" + # ------ 5. 构建 Redis URL ------ if [ -n "$REDIS_PASSWORD" ]; then @@ -237,9 +212,10 @@ echo "========================================" echo " 安装完成!" echo "========================================" echo "" -echo " MySQL: ${MYSQL_HOST}:${MYSQL_PORT} / ${DB_NAME}" +echo " MySQL: ${MYSQL_HOST}:${MYSQL_PORT} / ${DB_NAME} (用户: ${MYSQL_USER})" echo " Redis: ${REDIS_HOST}:${REDIS_PORT}" echo "" +echo " 首次部署请先运行: ./init_mysql.sh (root 建库建表)" echo " 启动服务: ./start_linux.sh" echo " 停止服务: ./stop_linux.sh" echo ""