fix(deploy): use scp instead of rsync, remove apt-get step, add SSH test
This commit is contained in:
+57
-54
@@ -66,9 +66,6 @@ jobs:
|
|||||||
MINIMAX_BASE_URL: ${{ secrets.MINIMAX_BASE_URL }}
|
MINIMAX_BASE_URL: ${{ secrets.MINIMAX_BASE_URL }}
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|
||||||
- name: Install rsync
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y rsync
|
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
env:
|
env:
|
||||||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||||||
@@ -112,61 +109,67 @@ jobs:
|
|||||||
set -e
|
set -e
|
||||||
APP_DIR=/home/tyler/route-commerce
|
APP_DIR=/home/tyler/route-commerce
|
||||||
|
|
||||||
# Add server SSH host key if provided
|
# Setup SSH key
|
||||||
if [ -n "$SERVER_SSH_KEY" ]; then
|
|
||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
echo "$SERVER_SSH_KEY" >> ~/.ssh/id_ed25519
|
echo "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519
|
||||||
chmod 600 ~/.ssh/id_ed25519
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
ssh-keyscan route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null
|
ssh-keyscan -H route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null || true
|
||||||
fi
|
|
||||||
|
|
||||||
# Write production env file
|
# Test SSH connection
|
||||||
{
|
echo "Testing SSH connection..."
|
||||||
printf "DATABASE_URL=%s\n" "$DATABASE_URL"
|
ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "echo 'SSH OK' && hostname" || { echo "SSH FAILED"; exit 1; }
|
||||||
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
|
|
||||||
|
|
||||||
# Sync build output and required files to server
|
# Write production env file on server
|
||||||
rsync -a --delete .next/ tyler@route.crispygoat.com:$APP_DIR/.next/
|
ssh tyler@route.crispygoat.com "mkdir -p $APP_DIR && cat > $APP_DIR/.env.production" << 'ENVEOF'
|
||||||
rsync -a --delete public/ tyler@route.crispygoat.com:$APP_DIR/public/
|
DATABASE_URL=$DATABASE_URL
|
||||||
rsync $APP_DIR/package.json tyler@route.crispygoat.com:$APP_DIR/
|
NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
|
||||||
rsync next.config.ts tyler@route.crispygoat.com:$APP_DIR/ 2>/dev/null || true
|
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
|
# Sync build output to server using scp (no apt install needed)
|
||||||
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"
|
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"
|
echo "Deployed successfully"
|
||||||
|
|||||||
Reference in New Issue
Block a user