# 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"`