Deploy SQL Server 2022 en Railway (Optimizado)
Configuración Docker lista para producción para desplegar SQL Server 2022
SqlServer2022Docker
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ística | Detalle |
|---|---|
| Imagen base | mcr.microsoft.com/mssql/server:2022-CU23-ubuntu-20.04 (Ubuntu 20.04 / sqlpal package4) |
| Edición | Developer (gratuita y completa) |
| Agente SQL | Habilitado — soporta Jobs y tareas programadas |
| Zona horaria | America/Lima (Perú) |
| Healthcheck | Relajado (60s inicio, 30s intervalo) para arranques en frío |
| Anti-crash | Core dumps y telemetría deshabilitados |
| Seguridad | Permisos 770 con usuario mssql (UID 10001) |
| Auto-Reparación | Detecta y repara automáticamente BDs corruptas (SUSPECT) al arrancar |
| Apagado Seguro | Gestiona 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:
| Variable | Ejemplo | Descripción |
|---|---|---|
MSSQL_SA_PASSWORD | MiClave@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.
- Ve a la pestaña Settings de tu servicio en Railway.
- Baja hasta la sección Networking > Public Networking.
- Haz clic en Add TCP Proxy.
- En el campo que dice
Enter your application port, escribe1433(el puerto por defecto de SQL Server) y dale a Add Proxy. - 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ámetro | Valor | Razón |
|---|---|---|
interval | 30s | Evita sobrecarga de chequeos continuos |
timeout | 10s | Tiempo máximo de respuesta |
start-period | 60s | Margen para el arranque en frío |
retries | 3 | Reintentos 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ón | Valor | Propósito |
|---|---|---|
| Colación | Modern_Spanish_CI_AS | Sin problemas de acentos en reportes en español |
| LCID | 3082 (Spanish Spain) | Mensajes de error en español en logs de Power BI |
| TLS | Habilitado (-C en sqlcmd) | Requerido por Power BI Gateway desde sept 2024 |
| TCP Keep-alive | 30s + 1s intervalo | Evita que Power BI corte la conexión por inactividad |
| Límite de RAM | 3500 MB | Prevents 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:
| Variable | Valor | Descripción |
|---|---|---|
TZ | America/Lima | Zona horaria del servidor |
MSSQL_LCID | 3082 | Idioma del servidor (Español España) |
MSSQL_COLLATION | Modern_Spanish_CI_AS | Colación compatible con español y Power BI |
MSSQL_AGENT_ENABLED | true | Habilita el Agente SQL (Jobs) |
MSSQL_BACKUP_DIR | /var/opt/mssql/backup | Directorio de backup para el Agente SQL |
MSSQL_MEMORY_LIMIT_MB | 1500 | Límite de RAM (ajustar según plan Railway) |
MSSQL_ENABLE_COREDUMP | 0 | Deshabilita volcados de memoria |
MSSQL_DUMP_ON_ERROR | 0 | Evita archivos de error grandes |
MSSQL_TCP_KEEPALIVE | 30000 | Keep-alive TCP inicial en ms |
MSSQL_TCP_KEEPALIVE_INTERVAL | 1000 | Intervalo 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
SqlServer2022Docker
Kennethguerra3/SqlServer2022DockerMSSQL_SA_PASSWORD