Complete project files including setup.sh

This commit is contained in:
2026-01-11 14:17:26 +08:00
commit 0bbe394cb5
29 changed files with 3060 additions and 0 deletions

140
setup.sh Normal file
View File

@@ -0,0 +1,140 @@
#!/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
# 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"