优化linux建表,初始化整体业务
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
-- Weibo-HotSign Database Initialization Script for MySQL
|
-- Weibo-HotSign Database Initialization Script for MySQL
|
||||||
-- 创建数据库和表结构
|
-- 创建表结构(数据库需提前创建好)
|
||||||
|
-- 如需手动建库: CREATE DATABASE weibo_hotsign DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
CREATE DATABASE IF NOT EXISTS weibo_hotsign DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
||||||
USE weibo_hotsign;
|
|
||||||
|
|
||||||
-- Users table
|
-- Users table
|
||||||
CREATE TABLE IF NOT EXISTS users (
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
|||||||
137
init_mysql.sh
Normal file
137
init_mysql.sh
Normal file
@@ -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 ""
|
||||||
@@ -102,47 +102,22 @@ else
|
|||||||
error "Redis 连接失败,请检查地址、端口和密码"
|
error "Redis 连接失败,请检查地址、端口和密码"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ------ 4. 初始化 MySQL 数据库 ------
|
# ------ 4. 验证 MySQL 数据库 ------
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "--- 初始化 MySQL 数据库 ---"
|
echo "--- 验证 MySQL 数据库 ---"
|
||||||
|
|
||||||
if $MYSQL_CMD -e "USE ${DB_NAME}" >/dev/null 2>&1; then
|
if ! $MYSQL_CMD -e "USE ${DB_NAME}" >/dev/null 2>&1; then
|
||||||
# 数据库已存在,检查是否需要加微信字段
|
error "数据库 ${DB_NAME} 不存在,请先运行: ./init_mysql.sh"
|
||||||
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} 创建完成"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 创建测试用户(如果 users 表为空)
|
TABLE_COUNT=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DB_NAME}'" 2>/dev/null)
|
||||||
USER_COUNT=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM ${DB_NAME}.users" 2>/dev/null)
|
if [ "$TABLE_COUNT" -lt 1 ] 2>/dev/null; then
|
||||||
if [ "$USER_COUNT" = "0" ]; then
|
error "数据库 ${DB_NAME} 中没有表,请先运行: ./init_mysql.sh"
|
||||||
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!"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
info "数据库 ${DB_NAME} 验证通过(${TABLE_COUNT} 张表)"
|
||||||
|
|
||||||
# ------ 5. 构建 Redis URL ------
|
# ------ 5. 构建 Redis URL ------
|
||||||
|
|
||||||
if [ -n "$REDIS_PASSWORD" ]; then
|
if [ -n "$REDIS_PASSWORD" ]; then
|
||||||
@@ -237,9 +212,10 @@ echo "========================================"
|
|||||||
echo " 安装完成!"
|
echo " 安装完成!"
|
||||||
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 " Redis: ${REDIS_HOST}:${REDIS_PORT}"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo " 首次部署请先运行: ./init_mysql.sh (root 建库建表)"
|
||||||
echo " 启动服务: ./start_linux.sh"
|
echo " 启动服务: ./start_linux.sh"
|
||||||
echo " 停止服务: ./stop_linux.sh"
|
echo " 停止服务: ./stop_linux.sh"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
Reference in New Issue
Block a user