#!/bin/bash # 泸州高中摄影社论坛 - 一键部署脚本 (Ubuntu) # 用法: sudo ./setup.sh set -e # 颜色定义 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # 检查是否以root运行 if [ "$EUID" -ne 0 ]; then echo -e "${RED}请使用 sudo 运行此脚本${NC}" exit 1 fi echo -e "${GREEN}=== 开始部署流程 ===${NC}" # 1. 更新系统并安装依赖 echo -e "${YELLOW}1. 更新系统并安装必要的软件包...${NC}" apt-get update # 安装 Python3, pip, venv, nginx apt-get install -y python3 python3-pip python3-venv nginx git # 2. 设置项目目录 echo -e "${YELLOW}2. 设置项目环境...${NC}" # 获取当前脚本所在目录作为项目根目录 PROJECT_DIR=$(pwd) VENV_DIR="$PROJECT_DIR/venv" # 创建必要的上传目录 mkdir -p "$PROJECT_DIR/uploads/posts" mkdir -p "$PROJECT_DIR/uploads/student_ids" # 设置权限 (假设运行 Nginx 的也是当前用户或 www-data,这里简单设置为当前文件夹所有者) # 获取当前非root用户 REAL_USER=${SUDO_USER:-$(whoami)} chown -R $REAL_USER:$REAL_USER "$PROJECT_DIR" # 给 uploads 目录写入权限 chmod -R 755 "$PROJECT_DIR/uploads" # 3. 创建虚拟环境并安装依赖 echo -e "${YELLOW}3. 配置 Python 虚拟环境...${NC}" if [ ! -d "$VENV_DIR" ]; then python3 -m venv "$VENV_DIR" fi # 激活虚拟环境并安装依赖 source "$VENV_DIR/bin/activate" pip install --upgrade pip # 确保安装了 gunicorn pip install gunicorn if [ -f "requirements.txt" ]; then pip install -r requirements.txt else echo -e "${RED}错误: 未找到 requirements.txt${NC}" exit 1 fi # 4. 配置 Systemd 服务 (Gunicorn) echo -e "${YELLOW}4. 配置 Gunicorn 服务...${NC}" SERVICE_NAME="luntan" SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service" cat > $SERVICE_FILE < $NGINX_CONF < /dev/null; then echo -e "${YELLOW}5.1 配置防火墙允许 HTTP (80)...${NC}" ufw allow 'Nginx Full' ufw allow 80 # 不强制启用 ufw,以免锁住 SSH,只开放端口 fi # 6. 初始化数据库 echo -e "${YELLOW}6. 初始化数据库...${NC}" # 我们需要在虚拟环境中运行一个简单的脚本来触发 create_all # 注意:app.py 启动时会自动创建,所以只要服务启动了,数据库就会创建。 # 但为了保险,我们手动触发一次 PYTHON_SCRIPT="from app import create_app; from models import db; app = create_app(); app.app_context().push(); db.create_all(); print('Database initialized.')" $VENV_DIR/bin/python -c "$PYTHON_SCRIPT" echo -e "${GREEN}=== 部署完成! ===${NC}" echo -e "您的应用现在应该可以通过服务器 IP 访问了。" echo -e "默认管理员: admin / adminlg"