Migraciones con TimeORM en Producción: Configuración y Ejecución

Clase 21 de 22Curso de NestJS: Autenticación con Passport y JWT

Resumen

¿Cómo gestionar las conexiones al correr migraciones en producción?

En el mundo actual del desarrollo web, uno de los grandes desafíos es que las aplicaciones funcionen sin inconvenientes, especialmente cuando trabajan en un entorno de producción. Ejecutar migraciones de base de datos es un paso crucial en este proceso, y hacerlo de manera eficiente puede marcar la diferencia entre un despliegue exitoso y uno problemático. En este contexto, veamos cómo se puede lograr utilizando TimeORM, un ORM que facilita la comunicación con la base de datos mediante un enfoque programático.

¿Qué es TimeORM y cómo se configura?

TimeORM, al igual que otros ORM, administra la conexión entre la aplicación y la base de datos, permitiendo trabajar en diferentes entornos sin necesidad de repetir configuraciones. En un entorno de desarrollo o producción, suele haber múltiples conexiones disponibles, y es esencial saber cuál usar dependiendo del entorno.

TimeORM permite conectar su CLI (Command Line Interface) mediante un archivo JavaScript. Esta práctica no solo garantiza una conexión precisa, sino que además permite la administración programática de las variables de entorno. Mediante un archivo de configuración ormconfig.js, es posible definir las variables necesarias, accediendo a ellas directamente desde el entorno con process.env.

module.exports = {
  type: "postgres",
  url: process.env.DATABASE_URL,
  synchronize: false,
  logging: process.env.LOGGING === "true",
  entities: ["src/entity/**/*.ts"],
  cli: {
    migrationsDir: "src/migration"
  }
};

¿Cómo se ejecutan las migraciones en producción?

Al desplegar una nueva versión de una aplicación, las migraciones de base de datos son imprescindibles para asegurar que los cambios en el esquema estén alineados con el código de la aplicación. En Heroku, un servicio de alojamiento web popular, este proceso puede manejarse de manera eficaz con herramientas específicas.

Para correr migraciones en un entorno productivo, primero se deben establecer las dependencias necesarias, como TypeScript y ts-node, asegurándose de que estén disponibles en producción. En ambientes como Heroku, solo se instalan por defecto las dependencias de producción, así que es fundamental configurarlas adecuadamente.

Además, se debe ajustar la configuración para que utilice Node en lugar de ts-node al ejecutarse en producción, lo que garantiza que las dependencias necesarias estén correctamente gestionadas.

{
  "scripts": {
    "migrations:prod": "npm run migrations -- -c ormconfig_prod.js"
  }
}

¿Qué problemas pueden surgir y cómo se solucionan?

El proceso de migraciones no está exento de errores. Uno común es la falta de dependencias necesarias, como ts-node, cuando se intenta ejecutarlas. En tal caso, mover estas dependencias al entorno de producción resuelve el problema. Otro error recurrente es olvidar ciertas configuraciones como SSL que Heroku requiere, pero añadiendo una bandera específica en el archivo de configuración de ORM se soluciona.

extra: {
  ssl: {
    rejectUnauthorized: false
  }
}

¿Qué sigue después de las migraciones?

Una vez que las migraciones se ejecutan correctamente, es vital continuar verificando el funcionamiento de la aplicación en producción. Usar herramientas como Insomnia permite interactuar con la API asegurando que todo trabaje como debe. Y, por supuesto, mantener las configuraciones seguras asegurándose de que las variables importantes estén bien protegidas.

Por último, implementar una estrategia de integración continua podría ser de gran ayuda, automatizando la ejecución de migraciones. Cada vez que se despliega una nueva versión, el sistema verifica y ejecuta cualquier migración pendiente, manteniendo el proceso optimizado y libre de errores.

Al seguir estos pasos, tu aplicación podrá manejar migraciones en producción con fluidez, asegurando el correcto funcionamiento en cualquier entorno sin comprometer la estabilidad ni la seguridad de los datos.