105 lines
3.2 KiB
Bash
Executable File
105 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
CONFIG_FILE="$SCRIPT_DIR/.deploy-config"
|
||
|
||
if [ ! -f "$CONFIG_FILE" ]; then
|
||
echo "❌ 缺少配置文件 .deploy-config"
|
||
exit 1
|
||
fi
|
||
|
||
source "$CONFIG_FILE"
|
||
|
||
if ! command -v sshpass &> /dev/null; then
|
||
echo "❌ 未安装 sshpass,请先运行: brew install hudochenkov/sshpass/sshpass"
|
||
exit 1
|
||
fi
|
||
|
||
PASS_FILE=$(mktemp)
|
||
echo "$SERVER_PASS" > "$PASS_FILE"
|
||
trap "rm -f $PASS_FILE /tmp/nanami-web-deploy.tar.gz" EXIT
|
||
|
||
SSH_OPTS="-o StrictHostKeyChecking=no"
|
||
|
||
run_ssh() {
|
||
sshpass -f "$PASS_FILE" ssh $SSH_OPTS "${SERVER_USER}@${SERVER_HOST}" "source /etc/profile 2>/dev/null; source ~/.bashrc 2>/dev/null; source ~/.bash_profile 2>/dev/null; $*"
|
||
}
|
||
|
||
run_scp() {
|
||
sshpass -f "$PASS_FILE" scp $SSH_OPTS "$@"
|
||
}
|
||
|
||
echo ""
|
||
echo "========================================="
|
||
echo " 部署到 ${SERVER_HOST}"
|
||
echo "========================================="
|
||
echo ""
|
||
|
||
echo "=> [1/6] 本地安装依赖..."
|
||
cd "$SCRIPT_DIR"
|
||
npm install --silent
|
||
|
||
echo ""
|
||
echo "=> [2/6] 本地同步 Prisma..."
|
||
npx prisma generate
|
||
|
||
echo ""
|
||
echo "=> [3/6] 本地构建项目..."
|
||
npm run build
|
||
|
||
echo ""
|
||
echo "=> [4/6] 打包构建产物..."
|
||
TAR_FILE="/tmp/nanami-web-deploy.tar.gz"
|
||
STAGE_DIR="/tmp/nanami-web-stage"
|
||
rm -rf "$STAGE_DIR"
|
||
|
||
STANDALONE_ROOT="$SCRIPT_DIR/.next/standalone/gitLib/nanami-web"
|
||
if [ ! -f "$STANDALONE_ROOT/server.js" ]; then
|
||
STANDALONE_ROOT="$SCRIPT_DIR/.next/standalone"
|
||
fi
|
||
|
||
mkdir -p "$STAGE_DIR/.next/standalone"
|
||
cp -r "$STANDALONE_ROOT/"* "$STAGE_DIR/.next/standalone/"
|
||
cp -r "$STANDALONE_ROOT/.next" "$STAGE_DIR/.next/standalone/"
|
||
mkdir -p "$STAGE_DIR/.next/standalone/.next/static"
|
||
cp -r "$SCRIPT_DIR/.next/static/"* "$STAGE_DIR/.next/standalone/.next/static/"
|
||
cp -r "$SCRIPT_DIR/public" "$STAGE_DIR/.next/standalone/"
|
||
|
||
cp -r "$SCRIPT_DIR/prisma" "$STAGE_DIR/"
|
||
cp "$SCRIPT_DIR/package.json" "$STAGE_DIR/"
|
||
cp "$SCRIPT_DIR/package-lock.json" "$STAGE_DIR/"
|
||
cp "$SCRIPT_DIR/ecosystem.config.js" "$STAGE_DIR/"
|
||
|
||
tar -czf "$TAR_FILE" -C "$STAGE_DIR" .
|
||
rm -rf "$STAGE_DIR"
|
||
|
||
echo " 打包完成: $(du -h "$TAR_FILE" | cut -f1)"
|
||
|
||
echo ""
|
||
echo "=> [5/6] 上传到服务器..."
|
||
run_ssh "mkdir -p ${REMOTE_DIR} && rm -rf ${REMOTE_DIR}/.next"
|
||
run_scp "$TAR_FILE" "${SERVER_USER}@${SERVER_HOST}:/tmp/nanami-web-deploy.tar.gz"
|
||
run_ssh "cd ${REMOTE_DIR} && tar -xzf /tmp/nanami-web-deploy.tar.gz && rm -f /tmp/nanami-web-deploy.tar.gz"
|
||
|
||
echo ""
|
||
echo "=> [6/6] 服务器安装生产依赖 & 同步数据库 & 重启..."
|
||
run_ssh "cd ${REMOTE_DIR} && \
|
||
npm install --omit=dev --registry=https://registry.npmjs.org && \
|
||
npx prisma generate && \
|
||
npx prisma db push && \
|
||
mkdir -p uploads && \
|
||
ln -sf ${REMOTE_DIR}/uploads ${REMOTE_DIR}/.next/standalone/uploads && \
|
||
ln -sf ${REMOTE_DIR}/.env ${REMOTE_DIR}/.next/standalone/.env && \
|
||
ln -sf ${REMOTE_DIR}/src/generated ${REMOTE_DIR}/.next/standalone/src/generated 2>/dev/null; \
|
||
cd ${REMOTE_DIR} && (pm2 delete nanami-web 2>/dev/null; pm2 start ecosystem.config.js)"
|
||
|
||
echo ""
|
||
echo "========================================="
|
||
echo " ✅ 部署完成!"
|
||
echo "========================================="
|
||
echo ""
|
||
echo "网站地址: http://${SERVER_HOST}:3000"
|
||
echo "管理后台: http://${SERVER_HOST}:3000/admin/login"
|
||
echo ""
|