Railway.app es una plataforma moderna de despliegue que ofrece una alternativa más simple a Fly.io, con precios transparentes y una interfaz intuitiva basada en web.
Comparación: Railway vs Fly.io
Sección titulada «Comparación: Railway vs Fly.io»| Característica | Railway | Fly.io |
|---|---|---|
| Pricing | $5/mes por servicio | $0 gratis, pago por uso |
| Base de datos | Railway Postgres incluida | Requiere Neon externo |
| Interfaz | Dashboard web intuitivo | CLI principalmente |
| Despliegue | Git push automático | wasp deploy fly manual |
| Custom domains | Incluido | Incluido |
| SSL | Automático | Automático |
| Rollbacks | Un clic | CLI |
| Logs | Dashboard en tiempo real | CLI |
Prerequisitos
Sección titulada «Prerequisitos»Antes de comenzar, asegúrate de tener:
- ✅ Cuenta en Railway.app (acepta GitHub OAuth)
- ✅ Cuenta en Neon para PostgreSQL (gratuita)
- ✅ Wasp CLI instalado:
curl -sSL https://get.wasp-lang.dev/installer.sh | sh - ✅ Cuenta en Stripe configurada
- ✅ Cuenta en SendGrid con API key
- ✅ (Opcional) AWS S3 + CloudFront para videos
Fase 1: Configurar Base de Datos (Neon)
Sección titulada «Fase 1: Configurar Base de Datos (Neon)»Railway puede proporcionar PostgreSQL, pero recomendamos Neon para mejor rendimiento y separación de servicios.
1.1. Crear Proyecto en Neon
Sección titulada «1.1. Crear Proyecto en Neon»- Ir a console.neon.tech
- Click en New Project
- Configurar:
- Project name:
talentbricksai-prod - Postgres version: 16 (más reciente)
- Region:
US East (Ohio)o el más cercano a tus usuarios
- Project name:
- Click Create Project
1.2. Obtener Connection String
Sección titulada «1.2. Obtener Connection String»- En el dashboard del proyecto, click en Connection Details
- Copiar el Connection string completo:
postgresql://user:pass@ep-xxx-123456.us-east-2.aws.neon.tech/neondb?sslmode=require
- Guardar este valor - lo necesitarás para
DATABASE_URL
1.3. Configurar Pooling (Recomendado)
Sección titulada «1.3. Configurar Pooling (Recomendado)»Para mejor rendimiento bajo carga:
- En Neon dashboard, ir a Connection pooling
- Habilitar pooling
- Copiar la Pooled connection string:
postgresql://user:pass@ep-xxx-123456-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require
Fase 2: Crear Proyecto en Railway
Sección titulada «Fase 2: Crear Proyecto en Railway»2.1. Nuevo Proyecto desde GitHub
Sección titulada «2.1. Nuevo Proyecto desde GitHub»- Ir a railway.app/new
- Click en Deploy from GitHub repo
- Autorizar Railway a acceder a tus repositorios
- Seleccionar tu repositorio:
tu-usuario/talentbricksai - Railway detectará automáticamente el proyecto Wasp
2.2. Configurar Build Settings
Sección titulada «2.2. Configurar Build Settings»Railway debería detectar automáticamente el proyecto, pero verifica:
- En el proyecto, click en Settings
- Sección Build:
- Build Command:
wasp build - Start Command:
cd .wasp/build && npm start - Root Directory:
/(raíz del proyecto)
- Build Command:
2.3. Configurar Environment
Sección titulada «2.3. Configurar Environment»- En Settings → Environment
- Seleccionar Production
Fase 3: Configurar Variables de Entorno
Sección titulada «Fase 3: Configurar Variables de Entorno»3.1. Variables Obligatorias
Sección titulada «3.1. Variables Obligatorias»En Railway, ir a tu proyecto → Variables y agregar:
Base de Datos
Sección titulada «Base de Datos»DATABASE_URL=postgresql://user:pass@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=requireAutenticación
Sección titulada «Autenticación»# Generar con: openssl rand -base64 32JWT_SECRET=tu_secreto_generado_aqui
# URL de tu app (Railway te da un dominio temporal)CLIENT_URL=https://talentbricksai-production.up.railway.appStripe (Producción)
Sección titulada «Stripe (Producción)»# Obtener de: https://dashboard.stripe.com/apikeysSTRIPE_API_KEY=sk_live_...
# Obtener de: https://dashboard.stripe.com/webhooksSTRIPE_WEBHOOK_SECRET=whsec_...
# IDs de productos en modo LIVEPAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_ID=price_live_mensualPAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_ID=price_live_anualEmail (SendGrid)
Sección titulada «Email (SendGrid)»# Obtener de: https://app.sendgrid.com/settings/api_keysSENDGRID_API_KEY=SG.xxxxxxxxxxxxx
# Opcional - personalizaciónSENDGRID_FIELD_FROM_NAME=TalentBricksSENDGRID_FIELD_FROM_EMAIL=noreply@talentbricks.aiAdministradores
Sección titulada «Administradores»# Emails separados por comaADMIN_EMAILS=admin@tuempresa.com,juan@tuempresa.com3.2. Variables Condicionales (AWS S3 + CloudFront)
Sección titulada «3.2. Variables Condicionales (AWS S3 + CloudFront)»Solo si usas videos en S3 (en producción, recomendado):
# IAM credentials (crear en: https://console.aws.amazon.com/iam)AWS_S3_IAM_ACCESS_KEY=AKIA...AWS_S3_IAM_SECRET_KEY=wJalr...
# S3 bucketAWS_S3_FILES_BUCKET=talentbricks-videosAWS_S3_REGION=us-east-1
# CloudFront (URLs firmadas)CLOUDFRONT_DOMAIN=d1234567890abc.cloudfront.netCLOUDFRONT_KEY_PAIR_ID=K2JCJMDEHXQW5FCLOUDFRONT_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKC....\n-----END RSA PRIVATE KEY-----⚠️ Nota sobre CLOUDFRONT_PRIVATE_KEY: Railway acepta el valor en una sola línea con \n para
los saltos de línea.
3.3. Variables Opcionales (OAuth Social)
Sección titulada «3.3. Variables Opcionales (OAuth Social)»Google OAuth
Sección titulada «Google OAuth»# Obtener de: https://console.cloud.google.com/apis/credentialsGOOGLE_CLIENT_ID=123456789-abc.apps.googleusercontent.comGOOGLE_CLIENT_SECRET=GOCSPX-...GitHub OAuth
Sección titulada «GitHub OAuth»# Obtener de: https://github.com/settings/developersGITHUB_CLIENT_ID=Iv1.1234567890abcdefGITHUB_CLIENT_SECRET=abcdef1234567890...3.4. Variables Opcionales (Analytics)
Sección titulada «3.4. Variables Opcionales (Analytics)»# Plausible AnalyticsPLAUSIBLE_API_KEY=tu_api_key
# Google Analytics 4REACT_APP_GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX
# OpenAI (funciones AI)OPENAI_API_KEY=sk-...3.5. Usar Railway CLI (Alternativa)
Sección titulada «3.5. Usar Railway CLI (Alternativa)»Si prefieres configurar por línea de comandos:
# Instalar Railway CLInpm i -g @railway/cli
# Loginrailway login
# Vincular proyectorailway link
# Configurar variablesrailway variables set DATABASE_URL="postgresql://..."railway variables set JWT_SECRET="tu_secreto"railway variables set STRIPE_API_KEY="sk_live_..."# ... etcFase 4: Desplegar
Sección titulada «Fase 4: Desplegar»4.1. Primer Despliegue
Sección titulada «4.1. Primer Despliegue»Railway despliega automáticamente cuando detecta cambios en tu rama principal:
-
Hacer push a GitHub:
Ventana de terminal git push origin main -
Railway iniciará el build automáticamente
-
Monitorear el progreso:
- En Railway dashboard → Deployments
- Ver logs en tiempo real
4.2. Deploy Manual (CLI)
Sección titulada «4.2. Deploy Manual (CLI)»# Desplegar rama actualrailway up
# Ver logs en tiempo realrailway logs
# Ver servicio desplegadorailway open4.3. Verificar Deployment
Sección titulada «4.3. Verificar Deployment»- Abrir la URL temporal de Railway (ej:
https://talentbricksai-production.up.railway.app) - Verificar que la app carga sin errores
- Revisar logs:
Ventana de terminal railway logs --tail
Fase 5: Ejecutar Migraciones
Sección titulada «Fase 5: Ejecutar Migraciones»Después del primer despliegue, ejecutar migraciones de Prisma:
# Via Railway CLIrailway run npx prisma migrate deployO configurar un Deploy Hook en Railway:
- Settings → Deploy
- Post-deploy command:
npx prisma migrate deploy
Fase 6: Configurar Webhooks de Stripe
Sección titulada «Fase 6: Configurar Webhooks de Stripe»Railway proporciona una URL permanente para tu app. Úsala para configurar webhooks:
6.1. Crear Webhook en Stripe
Sección titulada «6.1. Crear Webhook en Stripe»-
Click Add endpoint
-
Endpoint URL:
https://talentbricksai-production.up.railway.app/stripe-webhook -
Events to send: Seleccionar todos los eventos relacionados con:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failed
-
Click Add endpoint
-
Copiar el Signing secret (empieza con
whsec_) -
Actualizar variable en Railway:
Ventana de terminal railway variables set STRIPE_WEBHOOK_SECRET="whsec_..."
6.2. Verificar Webhooks
Sección titulada «6.2. Verificar Webhooks»- Hacer una compra de prueba en tu app
- En Stripe Dashboard → Webhooks → tu endpoint
- Ver Recent deliveries - debe aparecer
200 OK
Fase 7: Configurar Dominio Custom
Sección titulada «Fase 7: Configurar Dominio Custom»7.1. Agregar Dominio en Railway
Sección titulada «7.1. Agregar Dominio en Railway»- En tu proyecto Railway, ir a Settings → Domains
- Click Add Custom Domain
- Ingresar tu dominio:
talentbricks.ai - Railway te mostrará los registros DNS necesarios
7.2. Configurar DNS
Sección titulada «7.2. Configurar DNS»En tu proveedor de DNS (Cloudflare, Namecheap, etc.):
Opción A: CNAME (recomendado para www)
Type: CNAMEName: wwwValue: talentbricksai-production.up.railway.appTTL: AutoOpción B: A Record (para dominio raíz)
Type: AName: @Value: <IP proporcionada por Railway>TTL: Auto7.3. SSL Automático
Sección titulada «7.3. SSL Automático»Railway configura SSL automáticamente vía Let’s Encrypt. Espera 5-10 minutos después de configurar DNS.
7.4. Actualizar Variables de Entorno
Sección titulada «7.4. Actualizar Variables de Entorno»# Actualizar CLIENT_URL con tu dominiorailway variables set CLIENT_URL="https://talentbricks.ai"
# Actualizar callback URLs en OAuth providers# Google: https://console.cloud.google.com/apis/credentials# - Authorized redirect URIs: https://talentbricks.ai/auth/google/callback# GitHub: https://github.com/settings/developers# - Authorization callback URL: https://talentbricks.ai/auth/github/callbackFase 8: Configurar Backups
Sección titulada «Fase 8: Configurar Backups»8.1. Database Backups (Neon)
Sección titulada «8.1. Database Backups (Neon)»Neon hace backups automáticos:
- Point-in-time restore: últimos 7 días (plan gratuito)
- Restore desde: Console → Project → Restore
8.2. Application Backups (Git)
Sección titulada «8.2. Application Backups (Git)»Railway despliega desde Git, así que tu código siempre está respaldado:
- Cada deployment está vinculado a un commit específico
- Rollback a cualquier deployment anterior en 1 click
Troubleshooting
Sección titulada «Troubleshooting»Error: “Cannot find module ‘wasp’”
Sección titulada «Error: “Cannot find module ‘wasp’”»Railway no reconoció el proyecto como Wasp.
Solución:
# Settings → Build Command:wasp build
# Settings → Start Command:cd .wasp/build && npm startError: “Database connection failed”
Sección titulada «Error: “Database connection failed”»Solución:
- Verificar
DATABASE_URLen Railway variables - Verificar que Neon database está activo
- Probar conexión:
Ventana de terminal railway run npx prisma db pull
Error: “Stripe webhook signature failed”
Sección titulada «Error: “Stripe webhook signature failed”»Solución:
- Verificar
STRIPE_WEBHOOK_SECRETen Railway - Verificar que el endpoint en Stripe es correcto:
https://tu-dominio.up.railway.app/stripe-webhook
- Regenerar webhook secret en Stripe si es necesario
Error: “S3 Access Denied”
Sección titulada «Error: “S3 Access Denied”»Solución:
- Verificar credenciales AWS en Railway variables
- Verificar permisos IAM:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["s3:PutObject", "s3:GetObject"],"Resource": "arn:aws:s3:::tu-bucket/*"}]}
Videos muestran error 403
Sección titulada «Videos muestran error 403»Solución:
- Verificar
CLOUDFRONT_DOMAINapunta a tu distribución - Verificar
CLOUDFRONT_PRIVATE_KEYestá en formato correcto (una línea con\n) - Verificar que CloudFront está configurado con “Require signed URLs”
Build timeout
Sección titulada «Build timeout»Railway tiene límite de 30 min para builds. Si Wasp tarda mucho:
Solución:
# Limpiar caché de Railwayrailway run rm -rf .wasp/buildO habilitar Build Cache en Settings.
Ver logs en tiempo real
Sección titulada «Ver logs en tiempo real»# Railway CLIrailway logs --tail
# O en dashboardProject → Deployments → Latest → LogsRollback a versión anterior
Sección titulada «Rollback a versión anterior»- En Railway dashboard → Deployments
- Encontrar deployment funcional anterior
- Click ••• → Redeploy
Costos Estimados
Sección titulada «Costos Estimados»Railway (Hobby Plan)
Sección titulada «Railway (Hobby Plan)»- Servidor: $5/mes
- Egress: $0.10/GB después de 100GB
- Total mínimo: ~$5-10/mes
Neon (Free Tier)
Sección titulada «Neon (Free Tier)»- Database: $0/mes (hasta 0.5GB)
- Compute: $0/mes (hasta 191.9 horas/mes)
- Upgrade a Pro: $19/mes para más recursos
- 2.9% + $0.30 por transacción exitosa
Total estimado: $5-30/mes
Sección titulada «Total estimado: $5-30/mes»(dependiendo de tráfico y features habilitadas)
Comparación de Costos
Sección titulada «Comparación de Costos»| Servicio | Costo Mensual Estimado |
|---|---|
| Railway + Neon | $5-10 |
| Fly.io + Neon | $0-5 (depende de uso) |
| Vercel + Neon | $0-20 |
| AWS ECS + RDS | $50-200 |
Recomendación: Railway es excelente para equipos pequeños que valoran simplicidad. Fly.io es mejor si quieres minimizar costos y no te importa usar CLI.
Próximos Pasos
Sección titulada «Próximos Pasos»✅ Despliegue completado en Railway
Ahora:
- ✅ Revisar Checklist de Producción
- ✅ Configurar Monitoreo y Logs
- ✅ Planificar Estrategia de Backups
- ✅ Configurar CI/CD con GitHub Actions
Recursos Adicionales
Sección titulada «Recursos Adicionales»- Documentación oficial de Railway
- Railway CLI Reference
- Neon Documentation
- Guía de Despliegue en Fly.io (alternativa)
- Variables de Entorno (referencia completa)