Simplificar configuración de PostgreSQL con cadena de conexión única
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 16s
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 16s
Eliminados hacks de autenticación md5 y configuración manual de pg_hba.conf. Ahora usa NUXT_POSTGRES_URL como secret de Gitea para conexión directa.
This commit is contained in:
@@ -1,60 +1,49 @@
|
||||
import pg from 'pg'
|
||||
import { useRuntimeConfig } from '#imports'
|
||||
|
||||
const { Pool } = pg
|
||||
|
||||
let pool: pg.Pool | null = null
|
||||
|
||||
function buildConnectionString(): string {
|
||||
const config = useRuntimeConfig()
|
||||
if (config.postgresUrl) {
|
||||
return config.postgresUrl
|
||||
}
|
||||
|
||||
// Fallback para entornos locales si no se pasó NUXT_POSTGRES_URL
|
||||
const user = process.env.POSTGRES_USER || 'seguidor'
|
||||
const password = process.env.POSTGRES_PASSWORD || 'seguidor_password'
|
||||
const host = process.env.POSTGRES_HOST || 'postgres'
|
||||
const port = process.env.POSTGRES_PORT || '5432'
|
||||
const db = process.env.POSTGRES_DB || 'seguidor_lotes'
|
||||
return `postgres://${user}:${password}@${host}:${port}/${db}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene o crea el pool de conexiones a PostgreSQL.
|
||||
* Usa variables de entorno para la configuración.
|
||||
* Usa cadena de conexión única para mantener consistencia.
|
||||
*/
|
||||
export function getPool(): pg.Pool {
|
||||
if (!pool) {
|
||||
const config = {
|
||||
user: process.env.POSTGRES_USER || 'seguidor',
|
||||
password: process.env.POSTGRES_PASSWORD || 'seguidor_password',
|
||||
database: process.env.POSTGRES_DB || 'seguidor_lotes',
|
||||
host: process.env.POSTGRES_HOST || 'postgres',
|
||||
port: parseInt(process.env.POSTGRES_PORT || '5432'),
|
||||
max: 20, // máximo de conexiones en el pool
|
||||
const connectionString = buildConnectionString()
|
||||
|
||||
pool = new Pool({
|
||||
connectionString,
|
||||
max: 10,
|
||||
idleTimeoutMillis: 30000,
|
||||
connectionTimeoutMillis: 10000, // Aumentado a 10s para la primera conexión
|
||||
}
|
||||
connectionTimeoutMillis: 10000,
|
||||
})
|
||||
|
||||
pool = new Pool(config)
|
||||
|
||||
// Manejo de errores del pool
|
||||
pool.on('error', (err) => {
|
||||
console.error('Error inesperado en el pool de PostgreSQL:', err)
|
||||
})
|
||||
|
||||
// Solo log en desarrollo para reducir ruido
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
pool.on('connect', () => {
|
||||
console.log('Nueva conexión establecida con PostgreSQL')
|
||||
})
|
||||
}
|
||||
|
||||
// Verificar conexión inicial con retry
|
||||
let retries = 5
|
||||
const tryConnect = async () => {
|
||||
try {
|
||||
const client = await pool!.connect()
|
||||
console.log('✅ Conexión inicial a PostgreSQL exitosa')
|
||||
client.release()
|
||||
} catch (err: any) {
|
||||
retries--
|
||||
if (retries > 0) {
|
||||
console.log(`⚠️ Conexión a PostgreSQL falló, reintentando... (${retries} intentos restantes)`)
|
||||
setTimeout(tryConnect, 2000) // Reintentar en 2 segundos
|
||||
} else {
|
||||
console.error('❌ No se pudo conectar a PostgreSQL después de varios intentos:', err.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ejecutar verificación inicial en background
|
||||
tryConnect()
|
||||
}
|
||||
|
||||
return pool
|
||||
@@ -62,11 +51,6 @@ export function getPool(): pg.Pool {
|
||||
|
||||
/**
|
||||
* Ejecuta una query SQL con parámetros.
|
||||
* Wrapper seguro para evitar inyección SQL.
|
||||
*
|
||||
* @param text - Query SQL con placeholders $1, $2, etc.
|
||||
* @param params - Parámetros para la query
|
||||
* @returns Resultado de la query
|
||||
*/
|
||||
export async function query<T = any>(
|
||||
text: string,
|
||||
@@ -79,7 +63,6 @@ export async function query<T = any>(
|
||||
const result = await pool.query<T>(text, params)
|
||||
const duration = Date.now() - start
|
||||
|
||||
// Log solo en desarrollo
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
console.log('Query ejecutada:', { text, duration: `${duration}ms`, rows: result.rowCount })
|
||||
}
|
||||
@@ -93,9 +76,6 @@ export async function query<T = any>(
|
||||
|
||||
/**
|
||||
* Obtiene un cliente del pool para ejecutar transacciones.
|
||||
* IMPORTANTE: Debes llamar a client.release() al terminar.
|
||||
*
|
||||
* @returns Cliente de PostgreSQL
|
||||
*/
|
||||
export async function getClient(): Promise<pg.PoolClient> {
|
||||
const pool = getPool()
|
||||
@@ -103,8 +83,7 @@ export async function getClient(): Promise<pg.PoolClient> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Cierra el pool de conexiones.
|
||||
* Útil para tests o shutdown graceful.
|
||||
* Cierra el pool de conexiones (tests o shutdown).
|
||||
*/
|
||||
export async function closePool(): Promise<void> {
|
||||
if (pool) {
|
||||
@@ -116,9 +95,6 @@ export async function closePool(): Promise<void> {
|
||||
|
||||
/**
|
||||
* Verifica que la conexión a la base de datos esté funcionando.
|
||||
* Útil para health checks.
|
||||
*
|
||||
* @returns true si la conexión está OK, false en caso contrario
|
||||
*/
|
||||
export async function checkConnection(): Promise<boolean> {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user