Loading...
Loading...
将本地 Next.js 项目通过 PM2 部署到阿里云 ECS。当用户想把 Next.js 应用部署或重新部署到 ECS 实例时使用。
npx skill4agent add jiangjituo8-code/skills deploy-nextjs-ecs| 变量 | 示例 |
|---|---|
| |
| |
| |
| |
| |
| |
# 确认是 Next.js 项目
test -f package.json && grep -q '"next"' package.json && echo "✓ Next.js 项目确认" || echo "✗ 非 Next.js 项目,请检查目录"
# 测试 SSH 连通性
ssh -i $SSH_KEY -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_USER@$ECS_IP "echo '✓ SSH 连接正常'"npm ci --prefer-offline 2>/dev/null || npm install
npm run buildssh -i $SSH_KEY $REMOTE_USER@$ECS_IP << 'EOF'
# 安装 Node.js(通过 nvm)
if ! command -v node &>/dev/null; then
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm" && source "$NVM_DIR/nvm.sh"
nvm install --lts && nvm alias default node
fi
echo "Node 版本: $(node -v)"
# 安装 PM2
if ! command -v pm2 &>/dev/null; then
npm install -g pm2
fi
echo "PM2 版本: $(pm2 -v)"
mkdir -p $REMOTE_DIR
EOFgrep -r "standalone" next.config.* 2>/dev/null && echo "standalone 模式" || echo "标准模式"rsync -avz --delete \
.next/standalone/ $REMOTE_USER@$ECS_IP:$REMOTE_DIR/
rsync -avz .next/static/ $REMOTE_USER@$ECS_IP:$REMOTE_DIR/.next/static/
rsync -avz public/ $REMOTE_USER@$ECS_IP:$REMOTE_DIR/public/rsync -avz --delete \
--exclude='.git' --exclude='node_modules' --exclude='.next' \
. $REMOTE_USER@$ECS_IP:$REMOTE_DIR/
rsync -avz .next/ $REMOTE_USER@$ECS_IP:$REMOTE_DIR/.next/
ssh -i $SSH_KEY $REMOTE_USER@$ECS_IP "cd $REMOTE_DIR && npm ci --only=production"if [ -f .env.production ]; then
scp -i $SSH_KEY .env.production $REMOTE_USER@$ECS_IP:$REMOTE_DIR/.env.production
echo "✓ 已上传 .env.production"
elif [ -f .env.local ]; then
echo "⚠ 发现 .env.local,这通常是本地开发配置,是否确认上传?请检查其中的变量值是否适合生产环境。"
fissh -i $SSH_KEY $REMOTE_USER@$ECS_IP << EOF
cd $REMOTE_DIR
[ -f server.js ] && START_CMD="node server.js" || START_CMD="npm start"
if pm2 list | grep -q "$APP_NAME"; then
pm2 reload $APP_NAME --update-env && echo "✓ 已热重载"
else
PORT=$APP_PORT pm2 start \$START_CMD --name "$APP_NAME"
pm2 save
echo "✓ 已启动"
fi
pm2 show $APP_NAME
EOFcurl -s -o /dev/null -w "HTTP 状态码: %{http_code}\n" http://$ECS_IP:$APP_PORT/ssh -i $SSH_KEY $REMOTE_USER@$ECS_IP "pm2 logs $APP_NAME --lines 30 --nostream"| 现象 | 解决方法 |
|---|---|
| SSH 连接超时 | 检查 ECS 安全组,开放 22 端口 |
| PM2 启动后立即退出 | 查看日志 |
| 端口无法访问 | 检查 ECS 安全组是否开放 $APP_PORT |
| 本地构建失败 | 先执行 |
✓ 部署成功:$APP_NAME
服务器:$REMOTE_USER@$ECS_IP
目录 :$REMOTE_DIR
端口 :$APP_PORT
访问 :http://$ECS_IP:$APP_PORT
日志 :pm2 logs $APP_NAME