EternalAI/deploy/setup-server.sh

199 lines
6.5 KiB
Bash
Raw 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.

#!/usr/bin/env bash
set -euo pipefail
# ===== EternalAI 服务器初始化脚本 =====
# 首次部署时在服务器上运行,自动检测并安装所有依赖
# 用法: bash deploy/setup-server.sh
#
# 可通过环境变量自定义:
# DB_NAME=eternalai 数据库名
# DB_USER=eternalai 数据库用户
# DB_PASS=xxx 数据库密码(必填,否则自动生成)
# ---- 颜色输出 ----
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ---- 配置 ----
DB_NAME="${DB_NAME:-eternalai}"
DB_USER="${DB_USER:-eternalai}"
DB_PASS="${DB_PASS:-$(openssl rand -base64 24 | tr -d '/+=' | head -c 24)}"
APP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
NODE_VERSION="20"
info "应用目录: $APP_DIR"
info "数据库: $DB_NAME (用户: $DB_USER)"
# ---- 检测 OS ----
if [[ -f /etc/os-release ]]; then
. /etc/os-release
OS_ID="$ID"
info "检测到操作系统: $PRETTY_NAME"
else
error "无法检测操作系统,仅支持 Ubuntu/Debian/CentOS"
exit 1
fi
# ---- 安装 Node.js ----
if ! command -v node &>/dev/null; then
info "安装 Node.js $NODE_VERSION LTS..."
if [[ "$OS_ID" == "ubuntu" || "$OS_ID" == "debian" ]]; then
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | sudo -E bash -
sudo apt-get install -y nodejs
elif [[ "$OS_ID" == "centos" || "$OS_ID" == "rhel" || "$OS_ID" == "rocky" ]]; then
curl -fsSL "https://rpm.nodesource.com/setup_${NODE_VERSION}.x" | sudo -E bash -
sudo yum install -y nodejs
else
error "不支持的操作系统: $OS_ID,请手动安装 Node.js $NODE_VERSION"
exit 1
fi
info "Node.js 安装完成: $(node -v)"
else
info "Node.js 已安装: $(node -v)"
NODE_MAJOR=$(node -v | sed 's/v\([0-9]*\).*/\1/')
if [[ "$NODE_MAJOR" -lt 18 ]]; then
warn "Node.js 版本过低 (当前 $(node -v)),建议升级到 $NODE_VERSION LTS"
fi
fi
# ---- 安装 PM2 ----
if ! command -v pm2 &>/dev/null; then
info "安装 PM2..."
sudo npm install -g pm2
info "PM2 安装完成: $(pm2 -v)"
else
info "PM2 已安装: $(pm2 -v)"
fi
# ---- 安装 PostgreSQL ----
if ! command -v psql &>/dev/null; then
info "安装 PostgreSQL 15..."
if [[ "$OS_ID" == "ubuntu" || "$OS_ID" == "debian" ]]; then
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt-get update
sudo apt-get install -y postgresql-15
elif [[ "$OS_ID" == "centos" || "$OS_ID" == "rhel" || "$OS_ID" == "rocky" ]]; then
sudo yum install -y "https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm"
sudo yum install -y postgresql15-server postgresql15
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
else
error "不支持的操作系统: $OS_ID,请手动安装 PostgreSQL 15"
exit 1
fi
info "PostgreSQL 安装完成"
else
info "PostgreSQL 已安装: $(psql --version)"
fi
# ---- 启动 PostgreSQL ----
if ! sudo systemctl is-active --quiet postgresql; then
info "启动 PostgreSQL 服务..."
sudo systemctl enable postgresql
sudo systemctl start postgresql
fi
# ---- 创建数据库和用户 ----
info "创建数据库 $DB_NAME 和用户 $DB_USER..."
sudo -u postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname='$DB_USER'" | grep -q 1 || {
sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
info "数据库用户 $DB_USER 已创建"
}
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname='$DB_NAME'" | grep -q 1 || {
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;"
info "数据库 $DB_NAME 已创建"
}
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" >/dev/null
# 确保 PostgreSQL 对 pg_hba.conf 允许密码认证
PG_HBA=$(sudo -u postgres psql -t -c "SHOW hba_file" | xargs)
if [[ -f "$PG_HBA" ]]; then
if ! sudo grep -q "$DB_USER" "$PG_HBA" 2>/dev/null; then
warn "如果连接数据库失败,请检查 $PG_HBA 是否允许 md5/scram-sha-256 认证"
warn "添加: host $DB_NAME $DB_USER 127.0.0.1/32 scram-sha-256"
fi
fi
# ---- 安装 Nginx ----
if ! command -v nginx &>/dev/null; then
info "安装 Nginx..."
if [[ "$OS_ID" == "ubuntu" || "$OS_ID" == "debian" ]]; then
sudo apt-get install -y nginx
elif [[ "$OS_ID" == "centos" || "$OS_ID" == "rhel" || "$OS_ID" == "rocky" ]]; then
sudo yum install -y nginx
fi
info "Nginx 安装完成: $(nginx -v 2>&1)"
else
info "Nginx 已安装: $(nginx -v 2>&1)"
fi
if ! sudo systemctl is-active --quiet nginx; then
sudo systemctl enable nginx
sudo systemctl start nginx
fi
# ---- 创建 .env 文件 ----
ENV_FILE="$APP_DIR/.env"
if [[ ! -f "$ENV_FILE" ]]; then
info "创建 .env 文件..."
JWT_SECRET=$(openssl rand -base64 48)
cat > "$ENV_FILE" <<EOF
DATABASE_URL="postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME"
JWT_SECRET="$JWT_SECRET"
PORT=3001
EOF
chmod 600 "$ENV_FILE"
info ".env 文件已创建(权限 600请妥善保管数据库密码和 JWT 密钥)"
echo ""
echo "=============================="
echo " JWT 密钥已自动生成"
echo " 数据库密码已写入 .env 文件"
echo "=============================="
echo ""
else
info ".env 文件已存在,跳过创建"
fi
# ---- 创建日志目录 ----
mkdir -p "$APP_DIR/logs"
# ---- 安装项目依赖 ----
info "安装项目依赖..."
cd "$APP_DIR"
npm install
# ---- 生成 Prisma Client ----
info "生成 Prisma Client..."
npx prisma generate
# ---- 推送数据库 Schema ----
info "推送数据库 Schema..."
npx prisma db push
# ---- 配置 PM2 开机自启 ----
info "配置 PM2 开机自启..."
pm2 start ecosystem.config.js || true
pm2 save
pm2 startup systemd -u "$(whoami)" --hp "$HOME" 2>/dev/null | grep "sudo" | bash || true
# ---- 完成 ----
echo ""
info "============================================"
info " 服务器初始化完成!"
info "============================================"
echo ""
echo "下一步:"
echo " 1. 配置 Nginx 反向代理(参考 deploy/nginx.conf"
echo " 2. 检查应用状态: pm2 status"
echo " 3. 查看日志: pm2 logs eternalai"
echo " 4. 访问应用: http://localhost:3001"
echo ""