官网 初版
This commit is contained in:
104
deploy-remote.sh
Executable file
104
deploy-remote.sh
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/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 ""
|
||||
Reference in New Issue
Block a user