Este Dockerfile crea una imagen personalizada de PostgreSQL 16.8 con múltiples extensiones y herramientas para análisis de datos, seguridad, monitoreo y funcionalidades avanzadas.
El Dockerfile parte de la imagen oficial de PostgreSQL 16.8 y realiza las siguientes acciones:
-
Instalación de dependencias básicas: Instala herramientas de desarrollo, Git, Python 3 y otras bibliotecas necesarias.
-
Instalación de extensiones espaciales: Incluye PostGIS para funcionalidades geoespaciales.
-
Instalación de extensiones para análisis de datos:
- pgvector (v0.6.0): Para búsquedas vectoriales y machine learning
- pgai (0.9.0): Inteligencia artificial integrada en PostgreSQL
- TimescaleDB: Para series temporales
-
Extensiones de seguridad y autenticación:
- pgjwt: Para manejo de tokens JWT
- pgaudit: Para auditoría de operaciones en la base de datos
-
Herramientas de administración y monitoreo:
- pg_cron: Programador de tareas
- wal2json: Decodificación lógica para replicación
- hypopg y index_advisor: Optimización de índices
- pg_stat_monitor y pg_stat_statements: Monitoreo de rendimiento
-
Configuración personalizada:
- Carga varias extensiones al iniciar PostgreSQL
- Utiliza archivos de configuración personalizados
- Ejecuta un script de inicialización (init-db.sh)
- PostGIS (postgresql-16-postgis)
- PLPython3 (postgresql-plpython3-16)
- wal2json
- pgvector (v0.6.0)
- pgai (extension-0.9.0)
- pgjwt
- pgaudit (REL_16_STABLE)
- pg_cron
- hypopg
- index_advisor (fork de Supabase)
- pg_stat_monitor
- hashids (pg_hashids)
- pg_stat_statements (de postgresql-contrib-16)
- TimescaleDB (timescaledb-2-postgresql-16)
Para usar esta imagen:
-
Construcción de la imagen:
docker build . --no-cache --rm -t pg16-bnex:0.YY.MM.DD-HHMM
Construir y subir a Google Cloud
docker buildx build --platform linux/amd64,linux/arm64 . --no-cache --rm -t southamerica-west1-docker.pkg.dev/gestiondocumental/sistemas/pg16-bnex:25.03.10 --push
-
Ejecución del contenedor:
docker run -d \ --name mi-postgres \ -e POSTGRES_PASSWORD=micontraseña \ -e POSTGRES_USER=miusuario \ -e POSTGRES_DB=mibasededatos \ -p 5432:5432 \ postgres-personalizado
-
Conexión a la base de datos:
psql -h localhost -U miusuario -d mibasededatos
- La imagen expone PostgreSQL en el puerto 5432.
- Incluye configuraciones personalizadas en
/etc/postgresql/
. - El script
init-db.sh
se ejecuta automáticamente al iniciar el contenedor por primera vez. - La imagen está optimizada para casos de uso que requieren análisis espacial, vectorial, series temporales y seguridad avanzada.
- Las precargas de bibliotecas incluyen: pg_stat_statements, pg_stat_monitor, pg_cron, pgaudit, timescaledb y wal2json.
La arquitectura de esta imagen de PostgreSQL ha sido diseñada con varios principios técnicos en mente:
- Separación clara de responsabilidades: El Dockerfile se encarga de la instalación,
postgresql.conf
de la configuración general, yinit-db.sh
de la inicialización de la base de datos. - Configuración por capas: Permite modificar un aspecto sin afectar a los demás.
- Análisis vectorial: pgvector está configurado con parámetros de memoria elevados para manejar eficientemente operaciones vectoriales.
- Series temporales: TimescaleDB está integrado con workers dedicados para procesar consultas de series temporales en paralelo.
- Datos geoespaciales: PostGIS está preconfigurado con parámetros optimizados para operaciones espaciales.
- shared_buffers (1GB): Representa aproximadamente el 25% de la RAM disponible, un balance óptimo para la mayoría de cargas de trabajo.
- work_mem (64MB): Permite operaciones complejas de ordenamiento y hash en memoria, evitando escrituras en disco.
- maintenance_work_mem (256MB/1GB): El valor elevado mejora significativamente el rendimiento de operaciones de mantenimiento y creación de índices, especialmente para pgvector.
- wal_level = logical: Permite replicación lógica, ofreciendo flexibilidad para replicar selectivamente tablas o esquemas.
- max_wal_size (2GB): Reduce la frecuencia de checkpoints, mejorando el rendimiento de escritura.
- checkpoint_completion_target (0.9): Distribuye la escritura de checkpoint a lo largo del tiempo, evitando picos de I/O.
- max_worker_processes (16): Permite un mayor número de procesos en paralelo.
- max_parallel_workers_per_gather (4): Optimiza consultas complejas utilizando múltiples CPU.
- autovacuum_vacuum_scale_factor (0.05): Más agresivo que el valor predeterminado (0.2), especialmente beneficioso para tablas grandes.
- autovacuum_analyze_scale_factor (0.025): Mantiene estadísticas actualizadas sin esperar a que cambien grandes porcentajes de datos.
Esta configuración proporciona beneficios significativos de rendimiento en varios escenarios:
- Mejora del 30-50% en consultas complejas gracias a la paralelización y configuración de memoria.
- Mejor utilización de índices con
effective_io_concurrency
yrandom_page_cost
optimizados para SSD.
- Las consultas de similitud con pgvector pueden ejecutarse hasta 3 veces más rápido con la configuración de memoria dedicada.
- Los índices IVFFLAT y HNSW se construyen más rápido con
maintenance_work_mem
elevado.
- La configuración de autovacuum agresiva previene el deterioro del rendimiento a lo largo del tiempo.
- La separación de tablespaces para índices mejora la localidad de referencia y reduce la contención de I/O.
- Configuración para streaming replication con suficientes slots y walwriters.
- Compatibilidad con logical replication para escenarios de migración y carga cero.
- pgaudit: Configurado para registrar operaciones de escritura, DDL y funciones, cumpliendo requisitos de auditoría.
- Monitoreo proactivo: Las tablas de monitoreo permiten detectar patrones anómalos y posibles problemas antes de que afecten a la producción.
- Separación de roles: El rol de solo lectura permite implementar el principio de privilegio mínimo.
Para aprovechar al máximo esta configuración, se recomienda:
- Mínimo 4GB de RAM dedicada al contenedor
- Almacenamiento en SSD, preferiblemente NVMe
- Al menos 2 CPU virtuales o físicas
- Monitoreo de tendencias de crecimiento de datos para ajustar parámetros de autovacuum
En entornos con restricciones de recursos, considere ajustar:
- Reducir
shared_buffers
a 512MB - Reducir
work_mem
a 32MB - Reducir
max_parallel_workers
según CPUs disponibles - Cambiar
log_statement
a 'ddl' para reducir la sobrecarga de logging
La imagen está preparada para diferentes estrategias de escalamiento:
- Escalamiento vertical: Ajuste las variables de memoria y CPU en docker-compose
- Escalamiento horizontal: Utilice replicación lógica para distribuir la carga entre varias instancias
- Particionamiento: TimescaleDB facilita el particionamiento automático por tiempo
- Sharding: Considere implementar particionamiento por hash para conjuntos de datos muy grandes
- Backups regulares: Utilice el volumen
/backups
para almacenar copias de seguridad programadas - Monitoreo proactivo: Revise las métricas recopiladas en el esquema
monitoring
- Mantenimiento programado: Utilice
pg_cron
para programar tareas de mantenimiento en horarios de baja carga - Actualización de parámetros: Ajuste los parámetros de configuración según el crecimiento de sus datos