====== 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://: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**.