fix(deploy): use printf to write env file, fix SSH key setup, clean scp commands
Deploy to route.crispygoat.com / deploy (push) Has been cancelled

This commit is contained in:
openclaw
2026-06-09 13:47:34 -06:00
parent ceb061addf
commit b46e00fefd
+54 -47
View File
@@ -109,67 +109,74 @@ jobs:
set -e set -e
APP_DIR=/home/tyler/route-commerce APP_DIR=/home/tyler/route-commerce
# Setup SSH key # Setup SSH key (secret contains multiline private key)
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519 printf '%s\n' "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null || true ssh-keyscan -H route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null || true
# Test SSH connection # Test SSH connection
echo "Testing 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; } ssh -o ConnectTimeout=15 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "echo 'SSH OK' && hostname" || { echo "SSH FAILED - check SERVER_SSH_KEY secret"; exit 1; }
# Write production env file on server # Create app dir on server
ssh tyler@route.crispygoat.com "mkdir -p $APP_DIR && cat > $APP_DIR/.env.production" << 'ENVEOF' ssh tyler@route.crispygoat.com "mkdir -p $APP_DIR/.next $APP_DIR/public"
DATABASE_URL=$DATABASE_URL
NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL # Write production env file using printf (avoids heredoc quoting issues)
NEON_AUTH_BASE_URL=$NEON_AUTH_BASE_URL ENV_FILE=$(mktemp)
NEON_AUTH_COOKIE_SECRET=$NEON_AUTH_COOKIE_SECRET {
AUTH_SECRET=$AUTH_SECRET printf 'DATABASE_URL=%s\n' "$DATABASE_URL"
AUTH_URL=$AUTH_URL printf 'NEXT_PUBLIC_SITE_URL=%s\n' "$NEXT_PUBLIC_SITE_URL"
NEXT_PUBLIC_AUTH_URL=$NEXT_PUBLIC_AUTH_URL printf 'NEON_AUTH_BASE_URL=%s\n' "$NEON_AUTH_BASE_URL"
GOOGLE_CLIENT_ID=$GOOGLE_CLIENT_ID printf 'NEON_AUTH_COOKIE_SECRET=%s\n' "$NEON_AUTH_COOKIE_SECRET"
GOOGLE_CLIENT_SECRET=$GOOGLE_CLIENT_SECRET printf 'AUTH_SECRET=%s\n' "$AUTH_SECRET"
ALLOW_DEV_LOGIN=$ALLOW_DEV_LOGIN printf 'AUTH_URL=%s\n' "$AUTH_URL"
ADMIN_ALLOWED_EMAILS=$ADMIN_ALLOWED_EMAILS printf 'NEXT_PUBLIC_AUTH_URL=%s\n' "$NEXT_PUBLIC_AUTH_URL"
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY printf 'GOOGLE_CLIENT_ID=%s\n' "$GOOGLE_CLIENT_ID"
STRIPE_SECRET_KEY=$STRIPE_SECRET_KEY printf 'GOOGLE_CLIENT_SECRET=%s\n' "$GOOGLE_CLIENT_SECRET"
STRIPE_WEBHOOK_SECRET=$STRIPE_WEBHOOK_SECRET printf 'ALLOW_DEV_LOGIN=%s\n' "$ALLOW_DEV_LOGIN"
STRIPE_PRICE_STARTER=$STRIPE_PRICE_STARTER printf 'ADMIN_ALLOWED_EMAILS=%s\n' "$ADMIN_ALLOWED_EMAILS"
STRIPE_PRICE_FARM=$STRIPE_PRICE_FARM printf 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=%s\n' "$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY"
STRIPE_PRICE_ENTERPRISE=$STRIPE_PRICE_ENTERPRISE printf 'STRIPE_SECRET_KEY=%s\n' "$STRIPE_SECRET_KEY"
STRIPE_PRICE_HARVEST_REACH=$STRIPE_PRICE_HARVEST_REACH printf 'STRIPE_WEBHOOK_SECRET=%s\n' "$STRIPE_WEBHOOK_SECRET"
STRIPE_PRICE_WHOLESALE_PORTAL=$STRIPE_PRICE_WHOLESALE_PORTAL printf 'STRIPE_PRICE_STARTER=%s\n' "$STRIPE_PRICE_STARTER"
STRIPE_PRICE_WATER_LOG=$STRIPE_PRICE_WATER_LOG printf 'STRIPE_PRICE_FARM=%s\n' "$STRIPE_PRICE_FARM"
STRIPE_PRICE_AI_TOOLS=$STRIPE_PRICE_AI_TOOLS printf 'STRIPE_PRICE_ENTERPRISE=%s\n' "$STRIPE_PRICE_ENTERPRISE"
STRIPE_PRICE_SQUARE_SYNC=$STRIPE_PRICE_SQUARE_SYNC printf 'STRIPE_PRICE_HARVEST_REACH=%s\n' "$STRIPE_PRICE_HARVEST_REACH"
STRIPE_PRICE_SMS_CAMPAIGNS=$STRIPE_PRICE_SMS_CAMPAIGNS printf 'STRIPE_PRICE_WHOLESALE_PORTAL=%s\n' "$STRIPE_PRICE_WHOLESALE_PORTAL"
RESEND_API_KEY=$RESEND_API_KEY printf 'STRIPE_PRICE_WATER_LOG=%s\n' "$STRIPE_PRICE_WATER_LOG"
FROM_EMAIL=$FROM_EMAIL printf 'STRIPE_PRICE_AI_TOOLS=%s\n' "$STRIPE_PRICE_AI_TOOLS"
MINIO_ENDPOINT=$MINIO_ENDPOINT printf 'STRIPE_PRICE_SQUARE_SYNC=%s\n' "$STRIPE_PRICE_SQUARE_SYNC"
MINIO_REGION=$MINIO_REGION printf 'STRIPE_PRICE_SMS_CAMPAIGNS=%s\n' "$STRIPE_PRICE_SMS_CAMPAIGNS"
MINIO_ACCESS_KEY=$MINIO_ACCESS_KEY printf 'RESEND_API_KEY=%s\n' "$RESEND_API_KEY"
MINIO_SECRET_KEY=$MINIO_SECRET_KEY printf 'FROM_EMAIL=%s\n' "$FROM_EMAIL"
MINIO_PUBLIC_URL=$MINIO_PUBLIC_URL printf 'MINIO_ENDPOINT=%s\n' "$MINIO_ENDPOINT"
MINIO_BUCKET_PRODUCTS=$MINIO_BUCKET_PRODUCTS printf 'MINIO_REGION=%s\n' "$MINIO_REGION"
MINIO_BUCKET_BRAND_LOGOS=$MINIO_BUCKET_BRAND_LOGOS printf 'MINIO_ACCESS_KEY=%s\n' "$MINIO_ACCESS_KEY"
MINIO_BUCKET_WATER_LOGS=$MINIO_BUCKET_WATER_LOGS printf 'MINIO_SECRET_KEY=%s\n' "$MINIO_SECRET_KEY"
MINIMAX_API_KEY=$MINIMAX_API_KEY printf 'MINIO_PUBLIC_URL=%s\n' "$MINIO_PUBLIC_URL"
MINIMAX_BASE_URL=$MINIMAX_BASE_URL printf 'MINIO_BUCKET_PRODUCTS=%s\n' "$MINIO_BUCKET_PRODUCTS"
CRON_SECRET=$CRON_SECRET printf 'MINIO_BUCKET_BRAND_LOGOS=%s\n' "$MINIO_BUCKET_BRAND_LOGOS"
ENVEOF 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"
} > "$ENV_FILE"
# Upload env file and sync build output
echo "Uploading env file..."
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no "$ENV_FILE" tyler@route.crispygoat.com:$APP_DIR/.env.production
# Sync build output to server using scp (no apt install needed)
echo "Copying .next/..." echo "Copying .next/..."
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no -r .next/* tyler@route.crispygoat.com:$APP_DIR/.next/ scp -o ConnectTimeout=30 -o StrictHostKeyChecking=no -r .next tyler@route.crispygoat.com:$APP_DIR/
echo "Copying public/..." echo "Copying public/..."
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no -r public/* tyler@route.crispygoat.com:$APP_DIR/public/ scp -o ConnectTimeout=30 -o StrictHostKeyChecking=no -r public tyler@route.crispygoat.com:$APP_DIR/
echo "Copying package.json..." 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 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 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 # Install deps and restart on server
echo "Installing deps and restarting PM2..." 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" ssh -o ConnectTimeout=60 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "cd $APP_DIR && npm install --omit=dev 2>&1 | tail -5 && pm2 restart route-commerce || pm2 start npm --name route-commerce -- start -- -p 3100 && pm2 save"
echo "Deployed successfully" echo "Deployed successfully"