Files
weibo_signin/setup_linux.sh
2026-03-17 09:48:02 +08:00

246 lines
7.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -e
# ============================================================
# Weibo-HotSign Linux 安装运行脚本
# 使用方式: chmod +x setup_linux.sh && ./setup_linux.sh
# ============================================================
# ===================== 请在此处填写配置 =====================
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="weibo"
MYSQL_PASSWORD="123456" # ← 填写你的 MySQL 密码
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASSWORD="123456" # ← 填写你的 Redis 密码(没有密码留空)
# 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 ---"
command -v redis-cli >/dev/null 2>&1 || error "未找到 redis-cli请先安装: yum install -y redis 或 apt install -y redis-tools"
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 ""