Railway

Deploy SQL Server 2022 en Railway (Optimizado)

Configuración Docker lista para producción para desplegar SQL Server 2022

Deploy SQL Server 2022 en Railway (Optimizado)

Just deployed

/var/opt/mssql

🗄️ SQL Server 2022 en Railway (Optimizado)

Configuración Docker lista para producción para desplegar SQL Server 2022 en Railway.app, optimizada para estabilidad, compatibilidad y mantenimiento de bases de datos persistentes.


🚀 Características

CaracterísticaDetalle
Imagen basemcr.microsoft.com/mssql/server:2022-CU23-ubuntu-20.04 (Ubuntu 20.04 / sqlpal package4)
EdiciónDeveloper (gratuita y completa)
Agente SQLHabilitado — soporta Jobs y tareas programadas
Zona horariaAmerica/Lima (Perú)
HealthcheckRelajado (60s inicio, 30s intervalo) para arranques en frío
Anti-crashCore dumps y telemetría deshabilitados
SeguridadPermisos 770 con usuario mssql (UID 10001)
Auto-ReparaciónDetecta y repara automáticamente BDs corruptas (SUSPECT) al arrancar
Apagado SeguroGestiona señales SIGTERM para evitar corrupción de datos en reinicios

🏷️ Por qué usamos un tag específico y no 2022-latest

Estamos usando SQL Server 2022 — pero con el tag 2022-CU23-ubuntu-20.04 en lugar del genérico 2022-latest.

El motivo: el tag 2022-latest fue actualizado a Ubuntu 22.04 (sqlpal package6), que provoca un Stack Overflow con el almacenamiento de Railway por un bug de I/O síncrono.

El tag 2022-CU23-ubuntu-20.04 usa Ubuntu 20.04 (sqlpal package4) y funciona correctamente. Además, CU23 es la actualización acumulativa más reciente, por lo que tienes la versión más actualizada del motor.


🛠️ Variables de Entorno en Railway

En el panel Variables de tu servicio en Railway, solo debes agregar una variable:

VariableEjemploDescripción
MSSQL_SA_PASSWORDMiClave@2024!Contraseña del usuario administrador sa

> Requisitos de contraseña: mínimo 8 caracteres, con al menos una mayúscula, una minúscula, un número y un símbolo (ej: MiClave@2024!).

El resto de variables (ACCEPT_EULA, MSSQL_PID, zona horaria, agente SQL, etc.) ya están configuradas dentro del Dockerfile y no necesitan repetirse en Railway.


💾 Volumen Persistente (Importante)

Para que tus bases de datos no se borren cuando el contenedor se reinicie o se actualice, debes añadir un volumen a tu servicio en Railway.

En la configuración del servicio, ve a Volumes, haz clic en Add Volume y en el campo Mount Path coloca exactamente esto:

        /var/opt/mssql

Esta carpeta es donde residirán tus bases de datos (data/), archivos de registro (log/), backups (backup/) y secretos instalados en el contenedor.


📁 Estructura del Proyecto

.
├── Dockerfile                       # Imagen principal optimizada para Railway
└── scripts/
    ├── entrypoint.sh                # Maneja apagado seguro y dispara auto-reparación
    └── auto_repair.sql              # T-SQL para recuperar BDs en modo SUSPECT

🔌 Conexión Externa y Puertos (TCP Proxy)

Por defecto, los servicios de Railway son privados. Para conectar Power BI, SQL Server Management Studio (SSMS) o DBeaver desde tu computadora, tienes que exponer el puerto.

  1. Ve a la pestaña Settings de tu servicio en Railway.
  2. Baja hasta la sección Networking > Public Networking.
  3. Haz clic en Add TCP Proxy.
  4. En el campo que dice Enter your application port, escribe 1433 (el puerto por defecto de SQL Server) y dale a Add Proxy.
  5. Railway te generará una URL (ej: tcp.railway.app) y un puerto público (ej: 50123). Esos son el Subdominio o IP y el Puerto que usarás en Power BI o SSMS para conectarte.

🏥 Healthcheck

El contenedor verifica su estado con:

/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -Q "SELECT 1" -C
ParámetroValorRazón
interval30sEvita sobrecarga de chequeos continuos
timeout10sTiempo máximo de respuesta
start-period60sMargen para el arranque en frío
retries3Reintentos antes de marcar como unhealthy

⚡ Compatibilidad con Power Services (Power BI / Power Apps / Power Automate)

Este contenedor está optimizado para usarse como fuente de datos de nube desde Power Services:

ConfiguraciónValorPropósito
ColaciónModern_Spanish_CI_ASSin problemas de acentos en reportes en español
LCID3082 (Spanish Spain)Mensajes de error en español en logs de Power BI
TLSHabilitado (-C en sqlcmd)Requerido por Power BI Gateway desde sept 2024
TCP Keep-alive30s + 1s intervaloEvita que Power BI corte la conexión por inactividad
Límite de RAM3500 MBPrevents Railway from killing the container

> Nota TLS: Power BI Gateway rechaza certificados autofirmados de SQL Server. En la cadena de conexión de Power BI usa TrustServerCertificate=True o configura SqlTrustedServers en el archivo de configuración del gateway.


⚙️ Variables de Entorno Internas (ya configuradas en el Dockerfile)

Estas variables ya están definidas en el Dockerfile y no necesitan repetirse en Railway:

VariableValorDescripción
TZAmerica/LimaZona horaria del servidor
MSSQL_LCID3082Idioma del servidor (Español España)
MSSQL_COLLATIONModern_Spanish_CI_ASColación compatible con español y Power BI
MSSQL_AGENT_ENABLEDtrueHabilita el Agente SQL (Jobs)
MSSQL_BACKUP_DIR/var/opt/mssql/backupDirectorio de backup para el Agente SQL
MSSQL_MEMORY_LIMIT_MB1500Límite de RAM (ajustar según plan Railway)
MSSQL_ENABLE_COREDUMP0Deshabilita volcados de memoria
MSSQL_DUMP_ON_ERROR0Evita archivos de error grandes
MSSQL_TCP_KEEPALIVE30000Keep-alive TCP inicial en ms
MSSQL_TCP_KEEPALIVE_INTERVAL1000Intervalo entre retransmisiones keep-alive en ms

🐛 Solución de Problemas

Base de datos marcada como "Suspect" (Sospechosa)

Si Railway sufre un apagón físico severo y una transacción queda a medias, el archivo .mdf puede corromperse y SQL Server pondrá la base de datos en estado SUSPECT. Solución automática: No tienes que hacer nada. El script entrypoint.sh revisa el estado de todas las BDs en cada arranque. Si detecta una BD sospechosa, ejecutará auto_repair.sql que realiza un DBCC CHECKDB de emergencia para intentar recuperar la base de datos y ponerla online de nuevo.

Error de permisos en volumen

Railway despliega los contenedores con un usuario genérico, pero SQL Server requiere ejecutarse como el usuario mssql (UID 10001). El Dockerfile ya contiene las instrucciones mkdir -p y chown -R 10001:0 para los directorios críticos (data, log, secrets, backup) durante el build. Si aún tienes problemas, verifica que no hayas sobrescrito el USER en la configuración de Railway.

Healthcheck falla al inicio

Es normal que Railway marque el contenedor como unhealthy durante los primeros 60 segundos mientras SQL Server inicializa. Si persiste después de ese tiempo, revisa los logs del contenedor.

Ruta de sqlcmd no encontrada

En algunas versiones de la imagen, sqlcmd puede estar en /opt/mssql-tools18/bin/sqlcmd. Verificar con:

docker exec  find /opt -name sqlcmd

Conexión desde SSMS / Power BI cae

Verificar que MSSQL_TCP_KEEPALIVE=30000 esté activo. Si el problema persiste, configura también el keep-alive en el cliente de conexión.


Deploy and Host

About Hosting

Este proyecto está diseñado para ser alojado rápida y fácilmente en plataformas en la nube que soporten Docker, con un enfoque especial y optimizado para Railway.app. La configuración garantiza que el motor de base de datos se ejecute de forma estable, segura y con almacenamiento persistente.

Why Deploy

Desplegar SQL Server en la nube te permite:

  • Accesibilidad: Conectar herramientas como Power BI, SSMS o aplicaciones frontend/backend desde cualquier lugar sin lidiar con redes locales cerradas.
  • Cero Instalación Local: No necesitas instalar motores pesados ni configurar servicios en cada máquina de trabajo.
  • Escalabilidad y Flexibilidad: Aumentar los recursos disponibles (RAM/CPU) según lo requiera el tráfico o el tamaño de los datos.

Common Use Cases

  • Análisis y Business Intelligence: Origen de datos en la nube para tableros de Power BI, Looker Studio y reportes centralizados.
  • Backend de Aplicaciones: Base de datos principal para sistemas web, APIs o aplicaciones móviles.
  • Entornos de Pruebas (Staging/QA): Espacio ágil para la réplica de bases de datos y la validación de software antes de pasar a producción.

Dependencies for

Deployment Dependencies

Para desplegar este entorno correctamente, asegúrate de contar con:

  • Una cuenta activa en Railway.app (u otro proveedor de CaaS/PaaS compatible con Docker).
  • Un plan de nube o tier que pueda proporcionar al menos 1.5 GB a 2 GB de RAM al contenedor (requerimiento mínimo práctico de este motor de SQL Server 2022).
  • Vinculación a GitHub, GitLab o uso de Railway CLI para efectuar el despliegue del contenedor.

🔗 Referencias


Template Content

More templates in this category

View Template
Postgres Backup to Cloudflare R2 (S3-Compatible)
Automated PostgreSQL backups to S3-compatible storage with encryption

Aman
View Template
ReadySet
A lightweight caching engine for Postgres

Milo
View Template
Simple S3
Deploy a S3-compatible storage service with a pre-named bucket.

Joey Chilson