¡Esta es una revisión vieja del documento!
Tabla de Contenidos
PostgreSQL y pgAdmin
PostgreSQL es un sistema de gestión de bases de datos relacional, robusto y de código abierto, ampliamente utilizado para almacenar y administrar datos de forma segura y eficiente. En este servidor, se utiliza como base de datos principal para servicios como Nextcloud y Grafana.
pgAdmin, por su parte, es una herramienta web que permite administrar bases de datos PostgreSQL de manera visual, simplificando tareas como la creación de usuarios, bases de datos, consultas y respaldos.
docker-compose.yml
El servicio de base de datos y su entorno de administración se definen en el siguiente archivo docker-compose.yml:
services:
pgadmin4:
image: dpage/pgadmin4:8.10
container_name: pgadmin4
restart: always
env_file:
- .env
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_email} # Mail de acceso al portal de pgadmin
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_pass} # Contraseña de acceso al portal
ports:
- '9002:80'
depends_on:
db_postgres:
condition: service_healthy
volumes:
- pgadmin_data:/var/lib/pgadmin
- ./config/servers.json:/pgadmin4/servers.json
networks:
- internal_net
- external_net
db_postgres:
image: postgres:16
container_name: postgres
env_file:
- .env
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
environment:
POSTGRES_USER: ${POSTGRES_USER} # Usuario de aplicacion que utilizara moodle para conectarse
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # Contraseña con la que se conectará
POSTGRES_DB: ${POSTGRES_DB} # Nombre de base de datos que se creará
expose: # Se opta por expose dado que la base de datos no puede estar de cara al usuario
- 5432
volumes:
- local_pgdata:/var/lib/postgresql/data
- ./config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
networks:
- internal_net
# Exporter de métricas
postgres_exporter:
image: prometheuscommunity/postgres-exporter:latest
container_name: postgres_exporter
environment:
DATA_SOURCE_NAME: "postgresql://metricas:exporter@db_postgres:5432/${POSTGRES_DB}?sslmode=disable"
ports:
- "9187:9187"
depends_on:
- db_postgres
networks:
- internal_net
volumes:
local_pgdata:
driver: local
pgadmin_data:
driver: local
networks:
internal_net:
name: net_backend
driver: bridge
external: true
external_net:
name: net_frontend
driver: bridge
Variables de entorno
Las variables de entorno definidas en el archivo .env permiten configurar las credenciales y parámetros de conexión de ambos servicios:
POSTGRES_USER= "USUARIO_DB" POSTGRES_PASSWORD= "PASSWORD_DB" POSTGRES_DB= "NOMBRE_DB" PGADMIN_email ="EMAIL_PGADMIN" PGADMIN_pass = "PASSWORD_PGADMIN"
Esto permite mantener las contraseñas, usuarios y configuraciones fuera del archivo docker-compose.yml, evitando exponer información sensible y facilitando cambios sin modificar el compose directamente.
Configuración init-db.sh
El archivo init-db.sh se ejecuta automáticamente la primera vez que se levanta el contenedor de PostgreSQL. Su función es crear la base de datos inicial, asignar permisos y preparar el entorno para su uso por parte de otros servicios (como Nextcloud o Grafana). El código es el siguiente:
#!/bin/bash set -e # Espera a que PostgreSQL arranque completamente until pg_isready -U "$POSTGRES_USER"; do >&2 echo "Postgres está arrancando..." sleep 1 done # Crear bases de datos y usuarios psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "postgres" <<-EOSQL -- Crear bases de datos CREATE DATABASE nextcloud; CREATE DATABASE grafana; -- Crear usuarios con contraseñas CREATE USER unextcloud WITH ENCRYPTED PASSWORD 'cometa21beta'; CREATE USER ugrafana WITH ENCRYPTED PASSWORD 'comuna11gamma'; -- Otorgar todos los privilegios sobre las bases de datos a los usuarios correspondientes GRANT ALL PRIVILEGES ON DATABASE nextcloud TO unextcloud; GRANT ALL PRIVILEGES ON DATABASE grafana TO ugrafana; -- Otorga privilegios adicionales en el esquema público -- Les da permiso para acceder al esquema public, pero no para crear objetos todavía GRANT USAGE ON SCHEMA public TO unextcloud, ugrafana; -- Permite que esos usuarios puedan crear objetos dentro del esquema public GRANT CREATE ON SCHEMA public TO unextcloud, ugrafana; -- Le otorga a unextcloud todos los permisos sobre el esquema GRANT ALL PRIVILEGES ON SCHEMA public TO unextcloud; -- Permisos sobre todas las tablas existentes dentro del esquema public GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO unextcloud; -- Permisos sobre secuencias (autoincrementos) GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO unextcloud; -- Define los privilegios por defecto para nuevas tablas en el esquema public ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO unextcloud; EOSQL
De esta manera, las bases de datos nextcloud y grafana se crean automáticamente y quedan listas para ser utilizadas en el arranque inicial del contenedor.
Configuración de conexión
Para conectar automáticamente el servicio de PostgreSQL con pgAdmin4, se utiliza el archivo servers.json. Este archivo contiene la configuración necesaria para que pgAdmin se conecte al servidor de base de datos de manera automática al iniciarse, evitando tener que configurar la conexión manualmente.
{ "Servers": { "1": { "Name": "DBDockers", "Group": "Servers", "Host": "postgres", "Port": 5432, "MaintenanceDB": "NOMBRE_DB", "Username": "USUARIO_DB", "Password": "PASSWORD_DB", "SSLMode": "prefer" } } }
Configuración de pgAdmin
Una vez desplegado el contenedor, pgAdmin queda accesible desde el navegador en la siguiente URL:
http://<IP_PRIVADA>:9002
Al ingresar, iniciamos sesión con nuestro usuario correspondiente (de la base de datos como nuestro usuario de pgAdmin). Desde allí, tendremos acceso completo a las bases de datos previamente creadas mediante el script init-db.sh.
