Complete project files including setup.sh
This commit is contained in:
140
setup.sh
Normal file
140
setup.sh
Normal 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"
|
||||
Reference in New Issue
Block a user