GOOGLE ADS

viernes, 22 de abril de 2022

Heroku Postgres Mantenimiento cambiar env var y romper la aplicación

Implementé una aplicación NodeJS en Heroku y le adjunté una base de datos de Postgres con complementos de Heroku Postgres, todo funcionaba perfectamente. Después de unas horas, no pude autenticar mi solicitud. Después de verificar los registros, entiendo que la aplicación no puede conectarse a la base de datos debido a una contraseña incorrecta. Después de eso, también recibí 2 correos electrónicos de Heroku que me alertan sobre el mantenimiento.

Así que revisé la base de datos de credenciales y las credenciales son todas iguales excepto el URI. También revisé mis env vars y vi que Heroku agregó 2 variables más HEROKU_DATABASE_URL y HEROKU_POSTGRESQL_CRIMSON_URL, traté de editarlas con el nuevo URI de la base de datos actualizada pero tengo permiso...

También traté de eliminar y volver a crear una nueva base de datos, pero cada vez que el mantenimiento de Heroku vuelve y rompe mi aplicación

Aquí está mi código de conexión a Postgres (usando nest js)

TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
const isProduction = configService.get('STAGE') === 'prod';
return {
ssl: isProduction,
extra: {
ssl: isProduction? { rejectUnauthorized: false }: null,
},
type: 'postgres',
autoLoadEntities: true,
synchronize: true,
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_DATABASE'),
};
},
}),

Aquí está el error que obtengo

ERROR [ExceptionHandler] autenticación de contraseña fallida para el usuario "ryooypezxslwmn"


Solución del problema

Heroku Postgres proporciona y mantiene una variable de entorno por base de datos aprovisionada:

Como parte del proceso de aprovisionamiento, DATABASE_URLse agrega una variable de configuración a la configuración de su aplicación. DATABASE_URLcontiene la URL que usa su aplicación para acceder a la base de datos. Si su aplicación ya tiene una base de datos Heroku Postgres y ha aprovisionado otra, el nombre de esta variable de configuración tiene el formato HEROKU_POSTGRESQL_<COLOR>_URL(por ejemplo, HEROKU_POSTGRESQL_YELLOW_URL).

Cuando la cadena de conexión de su base de datos necesita cambiar, Heroku actualiza automáticamente las variables DATABASE_URLy.HEROKU_POSTGRESQL_<COLOR>_URL

Pero no estás usando estas variables. Heroku no establece las variables de entorno DB_HOST, DB_PORT, etc., y Heroku no las actualizará por usted. En lugar de configurar manualmente esas variables, le recomiendo encarecidamente que use las variables que proporciona Heroku:

El valor de la variable de DATABASE_URLconfiguración de su aplicación puede cambiar en cualquier momento. No confíe en este valor ni dentro ni fuera de su aplicación Heroku.

No estoy familiarizado con TypeORM, pero parece que puedes pasarlo urldirectamente:

TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
const isProduction = configService.get('STAGE') === 'prod';
return {
ssl: isProduction,
extra: {
ssl: isProduction? { rejectUnauthorized: false }: null,
},
type: 'postgres',
autoLoadEntities: true,
synchronize: true,
url: configService.get('DATABASE_URL'), // <-- here
};
},
}),

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...