149 lines
3.9 KiB
Bash
149 lines
3.9 KiB
Bash
#!/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 <<EOF
|
||
[Unit]
|
||
Description=Gunicorn instance to serve Luntan Forum
|
||
After=network.target
|
||
|
||
[Service]
|
||
User=$REAL_USER
|
||
Group=www-data
|
||
WorkingDirectory=$PROJECT_DIR
|
||
Environment="PATH=$VENV_DIR/bin"
|
||
ExecStart=$VENV_DIR/bin/gunicorn --workers 3 --bind unix:luntan.sock -m 007 "app:create_app()"
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 启动并启用服务
|
||
systemctl daemon-reload
|
||
systemctl start $SERVICE_NAME
|
||
systemctl enable $SERVICE_NAME
|
||
|
||
# 5. 配置 Nginx
|
||
echo -e "${YELLOW}5. 配置 Nginx 反向代理...${NC}"
|
||
NGINX_CONF="/etc/nginx/sites-available/$SERVICE_NAME"
|
||
NGINX_LINK="/etc/nginx/sites-enabled/$SERVICE_NAME"
|
||
|
||
cat > $NGINX_CONF <<EOF
|
||
server {
|
||
listen 80;
|
||
server_name _; # 请在部署后修改为您的域名
|
||
|
||
location / {
|
||
include proxy_params;
|
||
proxy_pass http://unix:$PROJECT_DIR/luntan.sock;
|
||
}
|
||
|
||
location /static {
|
||
alias $PROJECT_DIR/static;
|
||
}
|
||
|
||
location /uploads {
|
||
alias $PROJECT_DIR/uploads;
|
||
}
|
||
|
||
client_max_body_size 16M;
|
||
}
|
||
EOF
|
||
|
||
# 链接配置
|
||
if [ -e "$NGINX_LINK" ]; then
|
||
rm "$NGINX_LINK"
|
||
fi
|
||
ln -s "$NGINX_CONF" "$NGINX_LINK"
|
||
|
||
# 移除默认配置(如果有)
|
||
if [ -e "/etc/nginx/sites-enabled/default" ]; then
|
||
rm "/etc/nginx/sites-enabled/default"
|
||
fi
|
||
|
||
# 测试并重启 Nginx
|
||
nginx -t
|
||
systemctl restart nginx
|
||
|
||
# 5.1 配置防火墙 (如果有 UFW)
|
||
if command -v ufw > /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"
|