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