6dc051f26d
Load production env without .env override; sync-api-env targets .env.production; PM2 NODE_ENV=production; Prisma uses with-api-env.cjs on deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
80 lines
2.4 KiB
Bash
80 lines
2.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
APP_ROOT="/opt/dukang-haoke"
|
|
DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
echo "==> 1. 安装 MySQL(如未安装)"
|
|
if ! command -v mysqld &>/dev/null; then
|
|
dnf install -y mysql-server
|
|
systemctl enable --now mysqld
|
|
sleep 3
|
|
fi
|
|
|
|
echo "==> 2. 配置 MySQL 数据库"
|
|
mysql -uroot -e "CREATE DATABASE IF NOT EXISTS dukang_haoke CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null || true
|
|
mysql -uroot -e "CREATE USER IF NOT EXISTS 'dukang'@'localhost' IDENTIFIED BY 'Dukang2026!';" 2>/dev/null || \
|
|
mysql -uroot -e "ALTER USER 'dukang'@'localhost' IDENTIFIED BY 'Dukang2026!';" 2>/dev/null || true
|
|
mysql -uroot -e "GRANT ALL PRIVILEGES ON dukang_haoke.* TO 'dukang'@'localhost'; FLUSH PRIVILEGES;" 2>/dev/null || true
|
|
|
|
echo "==> 3. 启用 pnpm"
|
|
corepack enable
|
|
corepack prepare pnpm@11.2.2 --activate
|
|
|
|
echo "==> 4. 安装依赖并构建"
|
|
cd "$APP_ROOT"
|
|
pnpm install --frozen-lockfile 2>/dev/null || pnpm install
|
|
pnpm build
|
|
|
|
echo "==> 5. 写入 API 生产环境变量"
|
|
cat > "$APP_ROOT/server/dukang-api/.env.production" <<'ENV'
|
|
DATABASE_URL="mysql://dukang:Dukang2026!@localhost:3306/dukang_haoke"
|
|
REDIS_URL="redis://localhost:6379"
|
|
JWT_SECRET="dukang-prod-jwt-secret-2026"
|
|
JWT_EXPIRES_IN="7d"
|
|
PORT=8090
|
|
MOCK_SMS=true
|
|
MOCK_SMS_CODE=123456
|
|
MOCK_PAY=true
|
|
MOCK_DELIVERY_AUTO=true
|
|
AUTO_APPROVE_STORE=true
|
|
ENV
|
|
|
|
echo "==> 6. 初始化数据库"
|
|
cd "$APP_ROOT/server/dukang-api"
|
|
pnpm prisma:generate
|
|
npx prisma db push --accept-data-loss
|
|
pnpm prisma:seed
|
|
|
|
echo "==> 7. 安装 serve(静态服务)"
|
|
npm install -g serve
|
|
|
|
echo "==> 8. 启动 PM2 进程"
|
|
mkdir -p /var/log/nginx/dukang /var/www/certbot
|
|
pm2 delete dukang-api dukang-h5-user dukang-h5-shop dukang-h5-partner 2>/dev/null || true
|
|
pm2 start "$DEPLOY_DIR/ecosystem.config.cjs"
|
|
pm2 save
|
|
|
|
echo "==> 9. 申请 SSL 证书"
|
|
if [ ! -f /etc/letsencrypt/live/user.ai-mirror.xyz/fullchain.pem ]; then
|
|
certbot certonly --webroot -w /var/www/certbot \
|
|
-d user.ai-mirror.xyz \
|
|
-d shop.ai-mirror.xyz \
|
|
-d partner.ai-mirror.xyz \
|
|
--non-interactive --agree-tos -m admin@ai-mirror.xyz || \
|
|
certbot certonly --nginx \
|
|
-d user.ai-mirror.xyz \
|
|
-d shop.ai-mirror.xyz \
|
|
-d partner.ai-mirror.xyz \
|
|
--non-interactive --agree-tos -m admin@ai-mirror.xyz
|
|
fi
|
|
|
|
echo "==> 10. 配置 Nginx"
|
|
cp "$DEPLOY_DIR/nginx-ai-mirror.conf" /etc/nginx/conf.d/dukang-ai-mirror.conf
|
|
nginx -t
|
|
systemctl reload nginx
|
|
|
|
echo "==> 部署完成"
|
|
pm2 list
|
|
ss -tlnp | grep -E '809[0-3]' || true
|