Saltar a contenido

PostgreSQL

2. PostgreSQL

2.1 Crear docker-compose.yml

cat > ~/ia-lab/services/motores-bd/postgres/docker-compose.yml << 'EOF'
services:
  postgres:
    image: postgres:17
    container_name: postgres-server
    restart: unless-stopped

    env_file:
      - .env

    ports:
      - "5432:5432"

    volumes:
      # Datos persistentes dentro de WSL
      - ../../../data/postgres:/var/lib/postgresql/data

      # Backups accesibles desde Windows (D:)
      - /mnt/d/academia/bd:/backups

    command:
      - postgres
      - -c
      - "listen_addresses=*"

    networks:
      - ia-lab-network

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s

networks:
  ia-lab-network:
    external: true
EOF

Habilitar UFW y permitir el puerto 5432 (PostgreSQL) en el host:

sudo ufw allow 5432/tcp
sudo ufw enable
sudo ufw status

2.2 Crear .env

cat > ~/ia-lab/services/motores-bd/postgres/.env << 'EOF'
TZ=America/Bogota
POSTGRES_USER=postgres
POSTGRES_PASSWORD=MiNiCo57**
POSTGRES_DB=tecnogua
EOF

Editar la clave del .env en clase:

cd ~/ia-lab/services/motores-bd/postgres
sudo nano .env

Cambiar:

POSTGRES_PASSWORD=123456
Ctrl + o  ==>  para guardar
Ctrl + x  ==>  para salir

2.3 Crear README.md

cat > ~/ia-lab/services/motores-bd/postgres/README.md << 'EOF'
# PostgreSQL 17 - Motor de Base de Datos

> **Acceso remoto habilitado.** Puerto expuesto en `0.0.0.0:5432`.
> **Usuario por defecto:** `postgres`
> **Base de datos inicial:** `tecnogua`
> **Password:** `MiNiCo57**`

---

## Conectar desde WSL (local)

```bash
sudo docker exec -it postgres-server psql -U postgres -d tecnogua
# Password: MiNiCo57**

2.4 Levantar PostgreSQL

cd ~/ia-lab/services/motores-bd/postgres
sudo docker compose up -d

Verificar que está corriendo:

sudo docker ps | grep postgres-server
sudo docker logs postgres-server --tail 20

2.5 Conectar localmente a PostgreSQL

sudo docker exec -it postgres-server psql -U postgres -d tecnogua

Ya dentro del motor:

Crear una base de datos

CREATE DATABASE nombre_bd;

En clase (distinta a tecnogua, que ya crea el contenedor):

CREATE DATABASE bd_clase1;

Listar todas las bases de datos

\l

Eliminar una base de datos

No puedes eliminar la base a la que estás conectado. Cambia a postgres y luego:

\c postgres
DROP DATABASE nombre_bd;

Entrar a una base de datos

\c nombre_bd

En clase:

\c bd_clase1

Listar las tablas

\dt

Listar los campos de una tabla

\d nombre_tabla

Salir del motor

\q

2.6 Crear un usuario PROPIO con ACCESO REMOTO

Conectate primero como postgres, luego ejecuta.

Parte explicativa. Reemplaza usuario, password y nombre_bd por tus valores:

CREATE DATABASE nombre_bd;
CREATE USER usuario WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE nombre_bd TO usuario;
ALTER DATABASE nombre_bd OWNER TO usuario;

Aplicado en clase. Copiar y pegar (Usuario: admin / Contraseña: 123456):

CREATE USER admin WITH PASSWORD '123456';
ALTER USER admin WITH SUPERUSER;

2.7 Conectar remotamente desde cualquier equipo

** Hacerlo desde DBEAVER **

Reemplaza los valores correspondientes en Host

En el terminal de wsl-ubuntu

ip a

Luego, buscar la IP a la linea de Eth0

y esa direccion colocarla en Host

  • Host: IP_SERVIDOR
  • Port: 5432
  • User: postgres
  • Password: MiNiCo57**
  • Database: tecnogua

2.8 Backup de una base de datos

sudo docker exec postgres-server pg_dump -U postgres -d tecnogua > /mnt/d/academia/bd/backup_tecnogua_$(date +%Y%m%d).sql

2.9 Variables clave del .env

Variable Descripcion
TZ Zona horaria
POSTGRES_USER Usuario administrador (postgres)
POSTGRES_PASSWORD Password del administrador (MiNiCo57**)
POSTGRES_DB Base de datos inicial (tecnogua)

Nota sobre permisos: El contenedor de PostgreSQL crea los archivos de datos con el usuario interno postgres (UID 999). Si listas ~/ia-lab/data/postgres/ y parece vacia o inaccesible, ejecuta:

sudo ls -la ~/ia-lab/data/postgres/

O bien, dale permisos de lectura a tu usuario:

sudo chmod -R 755 ~/ia-lab/data/postgres/

El contenedor seguira funcionando perfectamente.