62 lines
2.0 KiB
Markdown
62 lines
2.0 KiB
Markdown
# Plan: Habilitar SSL en PostgreSQL para conexiones externas
|
|
|
|
## Context
|
|
|
|
Se quiere que PostgreSQL acepte tanto conexiones no encriptadas (para la app interna) como conexiones encriptadas SSL (para administración remota). PostgreSQL lo soporta nativamente: se habilita SSL en el servidor y cada cliente decide si lo usa o no.
|
|
|
|
## Cambios
|
|
|
|
### 1. Generar certificado SSL auto-firmado
|
|
|
|
Crear un script de setup que genere el certificado al iniciar el contenedor por primera vez:
|
|
|
|
```bash
|
|
# luminarrh/generate-ssl.sh
|
|
openssl req -new -x509 -days 3650 \
|
|
-nodes \
|
|
-text \
|
|
-out server.crt \
|
|
-keyout server.key \
|
|
-subj "/CN=postgres"
|
|
chmod 600 server.key
|
|
cat server.crt server.key > server-ssl.pem
|
|
rm server.crt server.key
|
|
```
|
|
|
|
### 2. Actualizar `postgresql.conf`
|
|
|
|
Agregar al final:
|
|
|
|
```conf
|
|
# SSL
|
|
ssl = on
|
|
ssl_cert_file = '/var/lib/postgresql/18/docker/server-ssl.pem'
|
|
ssl_key_file = '/var/lib/postgresql/18/docker/server-ssl.pem'
|
|
```
|
|
|
|
### 3. Actualizar `docker-compose.yaml`
|
|
|
|
```yaml
|
|
volumes:
|
|
- /volume1/docker/postgres/postgres-sarh/data:/var/lib/postgresql
|
|
- /volume1/docker/projects/synology-apps-containers/luminarrh/databases/postgresql.conf:/etc/postgresql/postgresql.conf
|
|
- ./luminarrh_demo.sql:/docker-entrypoint/initdb.d/luminarrh_demo.sql
|
|
- ./generate-ssl.sh:/docker-entrypoint/initdb.d/generate-ssl.sh # nueva línea
|
|
```
|
|
|
|
### 4. Crear `luminarrh/generate-ssl.sh`
|
|
|
|
Script ejecutable que se corre en el primer inicio del contenedor para generar el certificado SSL.
|
|
|
|
## Cómo funciona
|
|
|
|
- **App interna**: Se conecta sin SSL (sin cambiar nada en la app, funciona como antes)
|
|
- **Admin externo**: Se conecta con SSL usando `sslmode=require` o `sslmode=verify-full`
|
|
|
|
## Verificación
|
|
|
|
1. `docker compose -f luminarrh/docker-compose.yaml up -d`
|
|
2. Verificar SSL activo: `docker exec -i postgres-sarh psql -U sarh2 -d sarh_db -c "SHOW ssl;"`
|
|
3. Conectar con SSL: `psql "host=IP port=5434 dbname=sarh_db user=sarh2 sslmode=require"`
|
|
4. Conectar sin SSL (desde app interna): `psql "host=IP port=5434 dbname=sarh_db user=sarh2"`
|