2026-03-17 09:41:37 +08:00
#!/bin/bash
set -e
# ============================================================
# Weibo-HotSign Linux 安装运行脚本
# 使用方式: chmod +x setup_linux.sh && ./setup_linux.sh
# ============================================================
# ===================== 请在此处填写配置 =====================
MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = "3306"
2026-03-17 09:48:02 +08:00
MYSQL_USER = "weibo"
MYSQL_PASSWORD = "123456" # ← 填写你的 MySQL 密码
2026-03-17 09:41:37 +08:00
REDIS_HOST = "127.0.0.1"
REDIS_PORT = "6379"
2026-03-17 09:48:02 +08:00
REDIS_PASSWORD = "123456" # ← 填写你的 Redis 密码(没有密码留空)
2026-03-17 09:41:37 +08:00
# JWT 密钥(生产环境请改成随机长字符串)
JWT_SECRET = "change-me-to-a-random-string-in-production"
# Cookie 加密密钥( 32 字节)
COOKIE_KEY = "change-me-to-a-32byte-key-prod!"
# 微信小程序(可选,暂时留空)
WX_APPID = ""
WX_SECRET = ""
# 服务端口
AUTH_PORT = 8001
API_PORT = 8000
FRONTEND_PORT = 5000
# ===================== 配置结束 =====================
PROJECT_DIR = " $( cd " $( dirname " $0 " ) " && pwd ) "
DB_NAME = "weibo_hotsign"
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 Linux 安装脚本"
echo "========================================"
echo ""
# ------ 1. 检查系统依赖 ------
echo "--- 检查系统依赖 ---"
command -v python3 >/dev/null 2>& 1 || error "未找到 python3, 请先安装 Python 3.8+"
PYTHON_VER = $( python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' )
info " Python $PYTHON_VER "
command -v pip3 >/dev/null 2>& 1 || command -v pip >/dev/null 2>& 1 || error "未找到 pip, 请先安装 pip"
PIP_CMD = $( command -v pip3 || command -v pip)
info " pip: $PIP_CMD "
# ------ 2. 检查 MySQL ------
echo ""
echo "--- 检查 MySQL ---"
command -v mysql >/dev/null 2>& 1 || error "未找到 mysql 客户端,请先安装 mysql-client"
MYSQL_CMD = " mysql -h ${ MYSQL_HOST } -P ${ MYSQL_PORT } -u ${ MYSQL_USER } "
if [ -n " $MYSQL_PASSWORD " ] ; then
MYSQL_CMD = " $MYSQL_CMD -p ${ MYSQL_PASSWORD } "
fi
# 测试连接
if $MYSQL_CMD -e "SELECT 1" >/dev/null 2>& 1; then
info " MySQL 连接成功 ( ${ MYSQL_HOST } : ${ MYSQL_PORT } ) "
else
error "MySQL 连接失败,请检查地址、端口和密码"
fi
# ------ 3. 检查 Redis ------
echo ""
echo "--- 检查 Redis ---"
2026-03-17 09:48:02 +08:00
command -v redis-cli >/dev/null 2>& 1 || error "未找到 redis-cli, 请先安装: yum install -y redis 或 apt install -y redis-tools"
2026-03-17 09:41:37 +08:00
REDIS_CLI = " redis-cli -h ${ REDIS_HOST } -p ${ REDIS_PORT } "
if [ -n " $REDIS_PASSWORD " ] ; then
REDIS_CLI = " $REDIS_CLI -a ${ REDIS_PASSWORD } "
fi
REDIS_PING = $( $REDIS_CLI --no-auth-warning PING 2>/dev/null || true )
if [ " $REDIS_PING " = "PONG" ] ; then
info " Redis 连接成功 ( ${ REDIS_HOST } : ${ REDIS_PORT } ) "
else
error "Redis 连接失败,请检查地址、端口和密码"
fi
# ------ 4. 初始化 MySQL 数据库 ------
echo ""
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 } 创建完成 "
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!"
fi
# ------ 5. 构建 Redis URL ------
if [ -n " $REDIS_PASSWORD " ] ; then
REDIS_URL = " redis://: ${ REDIS_PASSWORD } @ ${ REDIS_HOST } : ${ REDIS_PORT } /0 "
else
REDIS_URL = " redis:// ${ REDIS_HOST } : ${ REDIS_PORT } /0 "
fi
# ------ 6. 构建 MySQL URL ------
if [ -n " $MYSQL_PASSWORD " ] ; then
MYSQL_URL = " mysql+aiomysql:// ${ MYSQL_USER } : ${ MYSQL_PASSWORD } @ ${ MYSQL_HOST } : ${ MYSQL_PORT } / ${ DB_NAME } ?charset=utf8mb4 "
else
MYSQL_URL = " mysql+aiomysql:// ${ MYSQL_USER } @ ${ MYSQL_HOST } : ${ MYSQL_PORT } / ${ DB_NAME } ?charset=utf8mb4 "
fi
# ------ 7. 生成 .env 文件 ------
echo ""
echo "--- 生成配置文件 ---"
cat > " ${ PROJECT_DIR } /backend/.env " << EOF
# ===== 由 setup_linux.sh 自动生成 =====
# MySQL
DATABASE_URL = ${ MYSQL_URL }
# Redis
USE_REDIS = true
REDIS_URL = ${ REDIS_URL }
# JWT
JWT_SECRET_KEY = ${ JWT_SECRET }
JWT_ALGORITHM = HS256
JWT_EXPIRATION_HOURS = 24
# Cookie 加密
COOKIE_ENCRYPTION_KEY = ${ COOKIE_KEY }
# 微信小程序
WX_APPID = ${ WX_APPID }
WX_SECRET = ${ WX_SECRET }
# 环境
ENVIRONMENT = production
EOF
info "backend/.env 已生成"
cat > " ${ PROJECT_DIR } /frontend/.env " << EOF
# ===== 由 setup_linux.sh 自动生成 =====
FLASK_ENV = production
FLASK_DEBUG = False
SECRET_KEY = $( python3 -c "import secrets; print(secrets.token_hex(32))" )
API_BASE_URL = http://127.0.0.1:${ API_PORT }
AUTH_BASE_URL = http://127.0.0.1:${ AUTH_PORT }
SESSION_TYPE = filesystem
EOF
info "frontend/.env 已生成"
# ------ 8. 创建虚拟环境并安装依赖 ------
echo ""
echo "--- 安装 Python 依赖 ---"
# 后端
if [ ! -d " ${ PROJECT_DIR } /backend/venv " ] ; then
info "创建后端虚拟环境..."
python3 -m venv " ${ PROJECT_DIR } /backend/venv "
fi
source " ${ PROJECT_DIR } /backend/venv/bin/activate "
pip install -q --upgrade pip
pip install -q -r " ${ PROJECT_DIR } /backend/requirements.txt "
deactivate
info "后端依赖安装完成"
# 前端
if [ ! -d " ${ PROJECT_DIR } /frontend/venv " ] ; then
info "创建前端虚拟环境..."
python3 -m venv " ${ PROJECT_DIR } /frontend/venv "
fi
source " ${ PROJECT_DIR } /frontend/venv/bin/activate "
pip install -q --upgrade pip
pip install -q -r " ${ PROJECT_DIR } /frontend/requirements.txt "
deactivate
info "前端依赖安装完成"
echo ""
echo "========================================"
echo " 安装完成!"
echo "========================================"
echo ""
echo " MySQL: ${ MYSQL_HOST } : ${ MYSQL_PORT } / ${ DB_NAME } "
echo " Redis: ${ REDIS_HOST } : ${ REDIS_PORT } "
echo ""
echo " 启动服务: ./start_linux.sh"
echo " 停止服务: ./stop_linux.sh"
echo ""