Files
LZGZ-Ph-LT/setup.sh
2026-01-11 06:21:33 +00:00

149 lines
3.9 KiB
Bash
Raw Permalink 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
# 泸州高中摄影社论坛 - 一键部署脚本 (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"