297 lines
8.2 KiB
Bash
297 lines
8.2 KiB
Bash
#!/bin/bash
|
||
# Neural Sync 腾讯云一键部署脚本
|
||
|
||
set -e
|
||
|
||
echo "========================================"
|
||
echo " Neural Sync 腾讯云部署脚本"
|
||
echo "========================================"
|
||
|
||
# 颜色定义
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
RED='\033[0;31m'
|
||
NC='\033[0m'
|
||
|
||
# 配置变量
|
||
PROJECT_DIR="/opt/neural-sync"
|
||
DB_PASSWORD=${1:-"neural_sync_2024"}
|
||
GIT_REPO=${2:-""}
|
||
|
||
# 检查是否为 root 用户
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo -e "${RED}❌ 请使用 root 用户运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✅ 开始部署...${NC}"
|
||
|
||
# ========== 1. 安装系统依赖 ==========
|
||
echo -e "${YELLOW}[1/8] 安装系统依赖...${NC}"
|
||
|
||
apt update
|
||
apt upgrade -y
|
||
|
||
apt install -y curl wget git nginx software-properties-common
|
||
|
||
apt install -y python3.9 python3-pip python3-venv python3-dev libpq-dev
|
||
|
||
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
|
||
apt install -y nodejs
|
||
|
||
python3 --version
|
||
node --version
|
||
npm --version
|
||
|
||
echo -e "${GREEN}✅ 系统依赖安装完成${NC}"
|
||
|
||
# ========== 2. 配置 PostgreSQL ==========
|
||
echo -e "${YELLOW}[2/8] 配置 PostgreSQL 数据库...${NC}"
|
||
|
||
apt install -y postgresql postgresql-contrib
|
||
|
||
systemctl start postgresql
|
||
systemctl enable postgresql
|
||
|
||
su - postgres -c "psql -c \"CREATE DATABASE neural_sync;\"" 2>/dev/null || true
|
||
su - postgres -c "psql -c \"CREATE USER neuraluser WITH PASSWORD '$DB_PASSWORD';\"" 2>/dev/null || true
|
||
su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE neural_sync TO neuraluser;\"" 2>/dev/null || true
|
||
su - postgres -c "psql -d neural_sync -c \"CREATE EXTENSION IF NOT EXISTS vector;\"" 2>/dev/null || true
|
||
|
||
echo -e "${GREEN}✅ PostgreSQL 配置完成${NC}"
|
||
|
||
# ========== 3. 拉取项目代码 ==========
|
||
echo -e "${YELLOW}[3/8] 拉取项目代码...${NC}"
|
||
|
||
cd /opt
|
||
|
||
if [ -d "$PROJECT_DIR" ]; then
|
||
mv "$PROJECT_DIR" "${PROJECT_DIR}_backup_$(date +%Y%m%d_%H%M%S)"
|
||
fi
|
||
|
||
if [ -n "$GIT_REPO" ]; then
|
||
echo "从 Git 仓库拉取: $GIT_REPO"
|
||
git clone "$GIT_REPO" neural-sync
|
||
else
|
||
echo -e "${YELLOW}请选择代码获取方式:${NC}"
|
||
echo " 1) 从 GitHub 拉取"
|
||
echo " 2) 从 Gitee (码云) 拉取"
|
||
echo " 3) 使用默认示例仓库"
|
||
echo ""
|
||
read -p "请输入选项 [1-3]: " choice
|
||
|
||
case $choice in
|
||
1)
|
||
echo -e "${YELLOW}请输入 GitHub 仓库地址:${NC}"
|
||
echo " 格式: https://github.com/用户名/仓库名.git"
|
||
read -p "仓库地址: " GIT_REPO
|
||
if [ -n "$GIT_REPO" ]; then
|
||
git clone "$GIT_REPO" neural-sync
|
||
else
|
||
echo -e "${RED}❌ 未输入仓库地址${NC}"
|
||
exit 1
|
||
fi
|
||
;;
|
||
2)
|
||
echo -e "${YELLOW}请输入 Gitee 仓库地址:${NC}"
|
||
echo " 格式: https://gitee.com/用户名/仓库名.git"
|
||
read -p "仓库地址: " GIT_REPO
|
||
if [ -n "$GIT_REPO" ]; then
|
||
git clone "$GIT_REPO" neural-sync
|
||
else
|
||
echo -e "${RED}❌ 未输入仓库地址${NC}"
|
||
exit 1
|
||
fi
|
||
;;
|
||
3)
|
||
echo -e "${YELLOW}克隆官方示例仓库...${NC}"
|
||
git clone https://github.com/anomalyco/neural-sync.git neural-sync 2>/dev/null || \
|
||
git clone https://gitee.com/ai-tools/neural-sync.git neural-sync 2>/dev/null || {
|
||
echo -e "${RED}❌ 无法拉取示例仓库,请手动配置仓库地址${NC}"
|
||
exit 1
|
||
}
|
||
;;
|
||
*)
|
||
echo -e "${RED}❌ 无效选项${NC}"
|
||
exit 1
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
if [ ! -d "$PROJECT_DIR" ]; then
|
||
echo -e "${RED}❌ 项目代码拉取失败${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✅ 项目代码拉取完成${NC}"
|
||
|
||
# ========== 4. 配置后端 ==========
|
||
echo -e "${YELLOW}[4/8] 配置后端服务...${NC}"
|
||
|
||
cd "$PROJECT_DIR/backend"
|
||
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
|
||
pip install --upgrade pip
|
||
pip install -r requirements.txt
|
||
|
||
cp .env.example .env 2>/dev/null || true
|
||
|
||
if [ -f .env ]; then
|
||
cat > .env << EOF
|
||
DATABASE_URL=postgresql+asyncpg://neuraluser:${DB_PASSWORD}@localhost:5432/neural_sync
|
||
OLLAMA_HOST=http://127.0.0.1:11434
|
||
BUSINESS_CONTEXT=Pixelle-Video: An AI-powered automated short video generation platform.
|
||
EOF
|
||
fi
|
||
|
||
alembic upgrade head 2>/dev/null || echo "迁移完成或跳过"
|
||
|
||
deactivate
|
||
|
||
echo -e "${GREEN}✅ 后端配置完成${NC}"
|
||
|
||
# ========== 5. 构建前端 ==========
|
||
echo -e "${YELLOW}[5/8] 构建前端...${NC}"
|
||
|
||
cd "$PROJECT_DIR/frontend"
|
||
|
||
npm install
|
||
|
||
npm run build
|
||
|
||
if [ ! -d "dist" ]; then
|
||
echo -e "${RED}❌ 前端构建失败${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✅ 前端构建完成${NC}"
|
||
|
||
# ========== 6. 配置 Nginx ==========
|
||
echo -e "${YELLOW}[6/8] 配置 Nginx...${NC}"
|
||
|
||
cat > /etc/nginx/sites-available/neural-sync << 'EOF'
|
||
server {
|
||
listen 80;
|
||
server_name _;
|
||
|
||
location / {
|
||
root /opt/neural-sync/frontend/dist;
|
||
index index.html;
|
||
try_files $uri $uri/ /index.html;
|
||
|
||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
||
expires 1y;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
}
|
||
|
||
location /api {
|
||
proxy_pass http://127.0.0.1:8000;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection 'upgrade';
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_cache_bypass $http_upgrade;
|
||
}
|
||
|
||
location /ws {
|
||
proxy_pass http://127.0.0.1:8000;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
ln -sf /etc/nginx/sites-available/neural-sync /etc/nginx/sites-enabled/
|
||
rm -f /etc/nginx/sites-enabled/default
|
||
|
||
nginx -t
|
||
systemctl reload nginx
|
||
|
||
echo -e "${GREEN}✅ Nginx 配置完成${NC}"
|
||
|
||
# ========== 7. 配置 Systemd 服务 ==========
|
||
echo -e "${YELLOW}[7/8] 配置 Systemd 服务...${NC}"
|
||
|
||
cat > /etc/systemd/system/neural-sync.service << EOF
|
||
[Unit]
|
||
Description=Neural Sync Backend API
|
||
After=network.target postgresql.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=root
|
||
WorkingDirectory=$PROJECT_DIR/backend
|
||
Environment="PATH=$PROJECT_DIR/backend/venv/bin"
|
||
Environment="PYTHONPATH=$PROJECT_DIR/backend"
|
||
EnvironmentFile=$PROJECT_DIR/backend/.env
|
||
ExecStart=$PROJECT_DIR/backend/venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000
|
||
Restart=always
|
||
RestartSec=10
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable neural-sync
|
||
systemctl restart neural-sync
|
||
|
||
sleep 3
|
||
|
||
if systemctl is-active --quiet neural-sync; then
|
||
echo -e "${GREEN}✅ 后端服务启动成功${NC}"
|
||
else
|
||
echo -e "${RED}❌ 后端服务启动失败,查看日志:${NC}"
|
||
journalctl -u neural-sync -n 20
|
||
fi
|
||
|
||
# ========== 8. 开放防火墙端口 ==========
|
||
echo -e "${YELLOW}[8/8] 开放防火墙端口...${NC}"
|
||
|
||
# Ubuntu ufw
|
||
if command -v ufw &> /dev/null; then
|
||
ufw allow 80/tcp 2>/dev/null || true
|
||
ufw allow 443/tcp 2>/dev/null || true
|
||
ufw allow 8000/tcp 2>/dev/null || true
|
||
fi
|
||
|
||
echo -e "${GREEN}✅ 防火墙配置完成${NC}"
|
||
|
||
# 获取服务器 IP
|
||
SERVER_IP=$(hostname -I | awk '{print $1}')
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo " 🎉 部署完成!"
|
||
echo "========================================"
|
||
echo ""
|
||
echo -e "${GREEN}访问地址:${NC}"
|
||
echo " - 前端: http://$SERVER_IP"
|
||
echo " - API: http://$SERVER_IP/api"
|
||
echo " - API文档: http://$SERVER_IP/api/docs"
|
||
echo ""
|
||
echo -e "${YELLOW}常用命令:${NC}"
|
||
echo " - 查看后端日志: journalctl -u neural-sync -f"
|
||
echo " - 重启后端: systemctl restart neural-sync"
|
||
echo " - 重载 Nginx: nginx -s reload"
|
||
echo ""
|
||
echo -e "${YELLOW}配置信息:${NC}"
|
||
echo " - 数据库: neural_sync"
|
||
echo " - 数据库用户: neuraluser"
|
||
echo " - 数据库密码: $DB_PASSWORD"
|
||
echo ""
|
||
echo -e "${YELLOW}后续步骤:${NC}"
|
||
echo " 1. 如需 HTTPS,请配置 SSL 证书 (使用 Let's Encrypt)"
|
||
echo " 2. 如需 AI 功能,请安装 Ollama"
|
||
echo " 3. 修改 .env 文件中的 BUSINESS_CONTEXT 为你的业务描述"
|
||
echo ""
|