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
Deploy to route.crispygoat.com / deploy (push) Has been cancelled
This commit is contained in:
+53
-46
@@ -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"
|
||||
Reference in New Issue
Block a user