Herramientas de usuario

Herramientas del sitio


postgresql_pgadmin

¡Esta es una revisión vieja del documento!


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.

postgresql_pgadmin.1760212858.txt.gz · Última modificación: por romix