diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 0f365e8..8dc2aac 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -109,67 +109,74 @@ jobs: set -e APP_DIR=/home/tyler/route-commerce - # Setup SSH key + # Setup SSH key (secret contains multiline private key) mkdir -p ~/.ssh - echo "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519 + printf '%s\n' "$SERVER_SSH_KEY" > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keyscan -H route.crispygoat.com >> ~/.ssh/known_hosts 2>/dev/null || true # 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; } + 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 - 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 + # Create app dir on server + ssh tyler@route.crispygoat.com "mkdir -p $APP_DIR/.next $APP_DIR/public" + + # Write production env file using printf (avoids heredoc quoting issues) + ENV_FILE=$(mktemp) + { + 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" + } > "$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/..." - 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/..." - 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..." 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" + 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" \ No newline at end of file