# Plan: Conectar PostgreSQL de Luminarrh de forma segura y encriptada

## Contexto

Tienes una base de datos PostgreSQL (imagen `postgres:18`) corriendo en Docker en tu Synology NAS, contenida en `luminarrh/`. Actualmente:

- **Sin encriptación**: No hay SSL configurado en PostgreSQL
- **Puerto expuesto**: 5436 → 5432 sin restricción de hosts
- **Sin pg_hba.conf**: No hay control de acceso por IP ni requisito de SSL

Necesitas que la base se conecte de forma **segura y encriptada** desde:
1. **Internet** → dominio `senabed.p-lao.com`
2. **Red local** → rango `<<INTERNAL_IP_2>>/24`

Tú te encargas del enrutamiento y port forwarding del router. La contraseña se mantiene igual (`<<DB_PASSWORD_1>>`).

---

## Pasos de implementación

### 1. Generar certificado SSL

Generar un certificado SSL autofirmado para el dominio `senabed.p-lao.com`:

```bash
# Generar clave privada y certificado
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /home/aleleba/projects/synology-apps-containers/luminarrh/ssl/server.key \
  -out /home/aleleba/projects/synology-apps-containers/luminarrh/ssl/server.crt \
  -subj "/CN=senabed.p-lao.com" \
  -addext "subjectAltName=DNS:senabed.p-lao.com"
```

Los archivos se guardan en `luminarrh/ssl/` y se montan como solo lectura en el contenedor.

### 2. Actualizar `postgresql.conf`

Agregar configuración SSL y restricciones de red:

```conf
# Conexiones
listen_addresses = '*'
max_connections = 500

# SSL
ssl = on
ssl_cert_file = '/etc/postgresql/ssl/server.crt'
ssl_key_file = '/etc/postgresql/ssl/server.key'
ssl_min_protocol_version = 'TLSv1.2'

# Memoria
shared_buffers = 2GB
maintenance_work_mem = 128MB

# Timezone
timezone = 'America/Guatemala'
log_timezone = 'America/Guatemala'
```

### 3. Crear `pg_hba.conf` con control de acceso

Crear un archivo `pg_hba.conf` que:
- **Requiera SSL** para todas las conexiones externas
- **Restrinja por IP** a `<<INTERNAL_IP_2>>/24` (red local) y la IP pública del NAS (desde internet)
- Permita conexiones locales sin SSL (dentro del contenedor)

```conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# Conexión local (dentro del contenedor) - sin SSL requerido
local   all             all                                     peer

# Conexiones desde red local <<INTERNAL_IP_2>>/24 - SSL requerido
hostssl all             all             <<INTERNAL_IP_2>>/24         scram-sha256

# Conexiones desde internet (IP pública del NAS) - SSL requerido
hostssl all             sarh2           <IP_PUBLICA_NAS>/32      scram-sha256

# Rechazar todo lo demás
host    all             all             0.0.0.0/0               reject
```

Se usa `hostssl` (no `host`) para que PostgreSQL **rechace automáticamente** cualquier conexión que no use SSL.

### 4. Actualizar `docker-compose.yaml`

```yaml
version: '3.8'
services:
  postgres-luminarrh:
    image: postgres:18
    restart: always
    environment:
      POSTGRES_USER: sarh2
      POSTGRES_PASSWORD: <<DB_PASSWORD_1>>
      POSTGRES_DB: sarh_db
      PGDATA: /var/lib/postgresql/18/docker
    ports:
      - '5436:5432/tcp'
    network_mode: databases
    volumes:
      - /volume1/docker/postgres/postgres-luminarrh/data:/var/lib/postgresql
      - /volume1/docker/projects/synology-apps-containers/luminarrh/postgresql.conf:/etc/postgresql/postgresql.conf
      - /volume1/docker/projects/synology-apps-containers/luminarrh/luminarrh_demo.sql:/docker-entrypoint/initdb.d/luminarrh_demo.sql
      - /volume1/docker/projects/synology-apps-containers/luminarrh/pg_hba.conf:/etc/postgresql/pg_hba.conf
      - /volume1/docker/projects/synology-apps-containers/luminarrh/ssl:/etc/postgresql/ssl:ro
    command: postgres -c config_file=/etc/postgresql/postgresql.conf -c hba_file=/etc/postgresql/pg_hba.conf
```

Cambios clave:
- **Eliminar puerto UDP** (5432/udp) — PostgreSQL no lo usa
- **Mount del SSL** como `ro` (solo lectura)
- **Mount del pg_hba.conf** explícito
- **Mantener contraseña** `<<DB_PASSWORD_1>>`

### 5. Crear README.md como guía de conexión

Crear `luminarrh/README.md` con instrucciones completas de cómo conectarse usando el certificado SSL.

---

## Resumen de archivos a modificar/crear

| Archivo | Acción |
|---------|--------|
| `luminarrh/postgresql.conf` | **Modificar** — agregar SSL, TLS min version |
| `luminarrh/pg_hba.conf` | **Crear** — control de acceso por IP + SSL (hostssl) |
| `luminarrh/docker-compose.yaml` | **Modificar** — mounts SSL, eliminar UDP |
| `luminarrh/ssl/server.key` | **Crear** — clave privada SSL |
| `luminarrh/ssl/server.crt` | **Crear** — certificado SSL |
| `luminarrh/README.md` | **Crear** — guía de conexión con certificado |

---

## Verificación (la hacemos juntos)

1. **Verificar psql instalado**: `psql --version` — si no está, instalar `postgresql-client`
2. **Verificar SSL activo**: `psql "host=senabed.p-lao.com port=5436 dbname=sarh_db user=sarh2 sslmode=require sslcert=... sslkey=... sslrootcert=..."` — debe conectar sin error
3. **Verificar rechazo sin SSL**: `psql "host=senabed.p-lao.com port=5436 dbname=sarh_db user=sarh2 sslmode=disable"` — debe rechazar
4. **Verificar conexión desde red local**: intentar conectar desde un host en `<<INTERNAL_IP_2>>/24` con SSL — debe conectar
5. **Verificar logs**: revisar `/var/log/postgresql/` para ver conexiones aceptadas/rechazadas
