Ir al contenido

Recuperación de contraseña olvidada en PostgreSQL dentro de Docker sin perder datos

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

Me pasó. Configuré un servidor PostgreSQL en Docker hace meses, anoté la contraseña en algún lado que ahora no encuentro, y necesitaba acceder urgentemente. La solución es más simple de lo que parece, pero hay que hacerlo con cuidado para no borrar nada.

El problema
#

Tienes un contenedor Docker con PostgreSQL corriendo, datos valiosos adentro, pero no recuerdas la contraseña del usuario postgres. Reiniciar el contenedor o reconstruir la imagen no es opción porque perderías todo.

La solución: Acceso local sin autenticación
#

PostgreSQL tiene un mecanismo de autenticación llamado trust que permite conexiones locales sin contraseña. Vamos a usarlo temporalmente.

Paso 1: Identificar el contenedor
#

docker ps | grep postgres

Anota el ID o nombre del contenedor. En mi caso es postgres-server.

Paso 2: Acceder al contenedor
#

docker exec -it postgres-server bash

Ahora estás dentro del contenedor como usuario root.

Paso 3: Editar pg_hba.conf
#

Este archivo controla la autenticación de PostgreSQL. Necesitas cambiarlo temporalmente:

cat /var/lib/postgresql/data/pg_hba.conf

Busca las líneas que se ven así:

local   all             all                                     md5
host    all             all             127.0.0.1/32            md5

Edita el archivo (usa nano o vi):

nano /var/lib/postgresql/data/pg_hba.conf

Cambia md5 por trust en las líneas locales. Debería verse así:

local   all             all                                     trust
host    all             all             127.0.0.1/32            trust

Guarda y sale (Ctrl+X, Y, Enter si usas nano).

Paso 4: Reiniciar PostgreSQL
#

pg_ctl reload -D /var/lib/postgresql/data

Si eso no funciona, intenta:

su - postgres
psql

Paso 5: Cambiar la contraseña
#

Una vez dentro de psql:

ALTER USER postgres WITH PASSWORD 'tu_nueva_contraseña_segura';

Reemplaza tu_nueva_contraseña_segura con algo fuerte. Luego:

\q

Paso 6: Restaurar la seguridad
#

Vuelve a editar pg_hba.conf y cambia trust de vuelta a md5:

nano /var/lib/postgresql/data/pg_hba.conf

Restaura:

local   all             all                                     md5
host    all             all             127.0.0.1/32            md5

Guarda.

Paso 7: Recargar configuración
#

pg_ctl reload -D /var/lib/postgresql/data

Sale del contenedor:

exit

Verificar que funciona
#

docker exec -it postgres-server psql -U postgres -c "SELECT version();"

Te pedirá la contraseña nueva. Si la acepta, todo está bien.

Notas importantes
#

  • No dejes trust activado en producción. Es una ventana abierta.
  • Los datos nunca se tocaron. Solo cambiaste el archivo de configuración.
  • Este método funciona porque tienes acceso al sistema de archivos del contenedor. Si no puedes hacer docker exec, necesitas otro enfoque.
  • Si usas volúmenes, asegúrate de que pg_hba.conf esté en el volumen persistente, no en la imagen.

Alternativa más rápida (si la imagen lo permite)
#

Algunos Dockerfile de PostgreSQL tienen variables de entorno. Podrías recrear el contenedor con:

docker run -e POSTGRES_PASSWORD=nueva_contraseña -v postgres_data:/var/lib/postgresql/data postgres

Pero solo si usas un volumen nombrado. Si usas bind mounts, los datos estarán seguros igual.

Lección aprendida
#

Desde entonces guardo las credenciales en un gestor de contraseñas y documento todo en un archivo cifrado dentro de mi servidor. Nada de notas sueltas.