From 16c8edf7e968f3b3ba4a19188ac5ae8b851773d0 Mon Sep 17 00:00:00 2001 From: openclaw Date: Tue, 9 Jun 2026 13:43:12 -0600 Subject: [PATCH] fix(deploy): use scp instead of rsync, remove apt-get step, add SSH test --- .gitea/workflows/deploy.yml | 115 ++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 770b401..0f365e8 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -66,9 +66,6 @@ jobs: MINIMAX_BASE_URL: ${{ secrets.MINIMAX_BASE_URL }} run: npm run build - - name: Install rsync - run: sudo apt-get update && sudo apt-get install -y rsync - - name: Deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }} @@ -112,61 +109,67 @@ jobs: set -e APP_DIR=/home/tyler/route-commerce - # Add server SSH host key if provided - if [ -n "$SERVER_SSH_KEY" ]; then - mkdir -p ~/.ssh - echo "$SERVER_SSH_KEY" >> ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - ssh-keyscan route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null - fi + # Setup SSH key + mkdir -p ~/.ssh + echo "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/id_ed25519 + ssh-keyscan -H route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null || true - # Write production env file - { - printf "DATABASE_URL=%s\n" "$DATABASE_URL" - printf "NEXT_PUBLIC_SITE_URL=%s\n" "$NEXT_PUBLIC_SITE_URL" - printf "NEON_AUTH_BASE_URL=%s\n" "$NEON_AUTH_BASE_URL" - printf "NEON_AUTH_COOKIE_SECRET=%s\n" "$NEON_AUTH_COOKIE_SECRET" - printf "AUTH_SECRET=%s\n" "$AUTH_SECRET" - printf "AUTH_URL=%s\n" "$AUTH_URL" - printf "NEXT_PUBLIC_AUTH_URL=%s\n" "$NEXT_PUBLIC_AUTH_URL" - printf "GOOGLE_CLIENT_ID=%s\n" "$GOOGLE_CLIENT_ID" - printf "GOOGLE_CLIENT_SECRET=%s\n" "$GOOGLE_CLIENT_SECRET" - printf "ALLOW_DEV_LOGIN=%s\n" "$ALLOW_DEV_LOGIN" - printf "ADMIN_ALLOWED_EMAILS=%s\n" "$ADMIN_ALLOWED_EMAILS" - printf "NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=%s\n" "$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY" - printf "STRIPE_SECRET_KEY=%s\n" "$STRIPE_SECRET_KEY" - printf "STRIPE_WEBHOOK_SECRET=%s\n" "$STRIPE_WEBHOOK_SECRET" - printf "STRIPE_PRICE_STARTER=%s\n" "$STRIPE_PRICE_STARTER" - printf "STRIPE_PRICE_FARM=%s\n" "$STRIPE_PRICE_FARM" - printf "STRIPE_PRICE_ENTERPRISE=%s\n" "$STRIPE_PRICE_ENTERPRISE" - printf "STRIPE_PRICE_HARVEST_REACH=%s\n" "$STRIPE_PRICE_HARVEST_REACH" - printf "STRIPE_PRICE_WHOLESALE_PORTAL=%s\n" "$STRIPE_PRICE_WHOLESALE_PORTAL" - printf "STRIPE_PRICE_WATER_LOG=%s\n" "$STRIPE_PRICE_WATER_LOG" - printf "STRIPE_PRICE_AI_TOOLS=%s\n" "$STRIPE_PRICE_AI_TOOLS" - printf "STRIPE_PRICE_SQUARE_SYNC=%s\n" "$STRIPE_PRICE_SQUARE_SYNC" - printf "STRIPE_PRICE_SMS_CAMPAIGNS=%s\n" "$STRIPE_PRICE_SMS_CAMPAIGNS" - printf "RESEND_API_KEY=%s\n" "$RESEND_API_KEY" - printf "FROM_EMAIL=%s\n" "$FROM_EMAIL" - printf "MINIO_ENDPOINT=%s\n" "$MINIO_ENDPOINT" - printf "MINIO_REGION=%s\n" "$MINIO_REGION" - printf "MINIO_ACCESS_KEY=%s\n" "$MINIO_ACCESS_KEY" - printf "MINIO_SECRET_KEY=%s\n" "$MINIO_SECRET_KEY" - printf "MINIO_PUBLIC_URL=%s\n" "$MINIO_PUBLIC_URL" - printf "MINIO_BUCKET_PRODUCTS=%s\n" "$MINIO_BUCKET_PRODUCTS" - printf "MINIO_BUCKET_BRAND_LOGOS=%s\n" "$MINIO_BUCKET_BRAND_LOGOS" - printf "MINIO_BUCKET_WATER_LOGS=%s\n" "$MINIO_BUCKET_WATER_LOGS" - printf "MINIMAX_API_KEY=%s\n" "$MINIMAX_API_KEY" - printf "MINIMAX_BASE_URL=%s\n" "$MINIMAX_BASE_URL" - printf "CRON_SECRET=%s\n" "$CRON_SECRET" - } > $APP_DIR/.env.production + # Test SSH connection + echo "Testing SSH connection..." + ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "echo 'SSH OK' && hostname" || { echo "SSH FAILED"; exit 1; } - # Sync build output and required files to server - rsync -a --delete .next/ tyler@route.crispygoat.com:$APP_DIR/.next/ - rsync -a --delete public/ tyler@route.crispygoat.com:$APP_DIR/public/ - rsync $APP_DIR/package.json tyler@route.crispygoat.com:$APP_DIR/ - rsync next.config.ts tyler@route.crispygoat.com:$APP_DIR/ 2>/dev/null || true + # Write production env file on server + ssh tyler@route.crispygoat.com "mkdir -p $APP_DIR && cat > $APP_DIR/.env.production" << 'ENVEOF' +DATABASE_URL=$DATABASE_URL +NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL +NEON_AUTH_BASE_URL=$NEON_AUTH_BASE_URL +NEON_AUTH_COOKIE_SECRET=$NEON_AUTH_COOKIE_SECRET +AUTH_SECRET=$AUTH_SECRET +AUTH_URL=$AUTH_URL +NEXT_PUBLIC_AUTH_URL=$NEXT_PUBLIC_AUTH_URL +GOOGLE_CLIENT_ID=$GOOGLE_CLIENT_ID +GOOGLE_CLIENT_SECRET=$GOOGLE_CLIENT_SECRET +ALLOW_DEV_LOGIN=$ALLOW_DEV_LOGIN +ADMIN_ALLOWED_EMAILS=$ADMIN_ALLOWED_EMAILS +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY +STRIPE_SECRET_KEY=$STRIPE_SECRET_KEY +STRIPE_WEBHOOK_SECRET=$STRIPE_WEBHOOK_SECRET +STRIPE_PRICE_STARTER=$STRIPE_PRICE_STARTER +STRIPE_PRICE_FARM=$STRIPE_PRICE_FARM +STRIPE_PRICE_ENTERPRISE=$STRIPE_PRICE_ENTERPRISE +STRIPE_PRICE_HARVEST_REACH=$STRIPE_PRICE_HARVEST_REACH +STRIPE_PRICE_WHOLESALE_PORTAL=$STRIPE_PRICE_WHOLESALE_PORTAL +STRIPE_PRICE_WATER_LOG=$STRIPE_PRICE_WATER_LOG +STRIPE_PRICE_AI_TOOLS=$STRIPE_PRICE_AI_TOOLS +STRIPE_PRICE_SQUARE_SYNC=$STRIPE_PRICE_SQUARE_SYNC +STRIPE_PRICE_SMS_CAMPAIGNS=$STRIPE_PRICE_SMS_CAMPAIGNS +RESEND_API_KEY=$RESEND_API_KEY +FROM_EMAIL=$FROM_EMAIL +MINIO_ENDPOINT=$MINIO_ENDPOINT +MINIO_REGION=$MINIO_REGION +MINIO_ACCESS_KEY=$MINIO_ACCESS_KEY +MINIO_SECRET_KEY=$MINIO_SECRET_KEY +MINIO_PUBLIC_URL=$MINIO_PUBLIC_URL +MINIO_BUCKET_PRODUCTS=$MINIO_BUCKET_PRODUCTS +MINIO_BUCKET_BRAND_LOGOS=$MINIO_BUCKET_BRAND_LOGOS +MINIO_BUCKET_WATER_LOGS=$MINIO_BUCKET_WATER_LOGS +MINIMAX_API_KEY=$MINIMAX_API_KEY +MINIMAX_BASE_URL=$MINIMAX_BASE_URL +CRON_SECRET=$CRON_SECRET +ENVEOF - # Install production deps and restart on server - ssh tyler@route.crispygoat.com "cd $APP_DIR && npm install --omit=dev && pm2 restart route-commerce || pm2 start npm --name route-commerce -- start -- -p 3100 && pm2 save" + # Sync build output to server using scp (no apt install needed) + echo "Copying .next/..." + scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no -r .next/* tyler@route.crispygoat.com:$APP_DIR/.next/ + echo "Copying public/..." + scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no -r public/* tyler@route.crispygoat.com:$APP_DIR/public/ + echo "Copying package.json..." + scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no package.json tyler@route.crispygoat.com:$APP_DIR/ + scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no next.config.ts tyler@route.crispygoat.com:$APP_DIR/ 2>/dev/null || true + + # Install deps and restart on server + echo "Installing deps and restarting PM2..." + ssh -o ConnectTimeout=15 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "cd $APP_DIR && npm install --omit=dev && pm2 restart route-commerce || pm2 start npm --name route-commerce -- start -- -p 3100 && pm2 save" echo "Deployed successfully"