Rotación de secretos en .env.prod: qué rotar y cómo
El fichero .env.prod contiene secretos de varios tipos. Algunos son independientes (se pueden cambiar directamente), otros son derivados (cambiar uno implica regenerar los que dependen de él). Conocer qué es qué evita romper el stack durante una rotación.
Secretos críticos y sus dependencias
| Variable | Tipo | Dependencias |
|---|---|---|
| JWT_SECRET | Raíz | ANON_KEY y SERVICE_ROLE_KEY deben regenerarse si cambia |
| ANON_KEY | Derivado de JWT_SECRET | Usado por frontends para llamadas sin auth |
| SERVICE_ROLE_KEY | Derivado de JWT_SECRET | Usado por el backend (FastAPI) para bypass de RLS |
| POSTGRES_PASSWORD | Independiente | Debe actualizarse también en el servidor Postgres |
| SECRET_KEY_BASE | Independiente | Invalida sesiones de Fizzy al cambiar |
| N8N_ENCRYPTION_KEY | Independiente | Invalida credenciales guardadas en n8n al cambiar |
| MEILI_MASTER_KEY | Independiente | Requiere reiniciar MeiliSearch |
| REDIS_PASSWORD | Independiente | Requiere reiniciar Redis y actualizar REDIS_URL |
Regenerar ANON_KEY y SERVICE_ROLE_KEY
Estos tokens son JWT firmados con JWT_SECRET. La forma más directa de regenerarlos es con el generador oficial de Supabase en supabase.com/docs/guides/self-hosting, o con cualquier herramienta JWT con los payloads correctos:
# ANON_KEY payload
{ "role": "anon", "iss": "supabase", "iat": , "exp": }
# SERVICE_ROLE_KEY payload
{ "role": "service_role", "iss": "supabase", "iat": , "exp": }
Procedimiento seguro de rotación
- Actualizar el valor en
.env.proden el servidor. - Actualizar el mismo valor en la base de datos si aplica (ej.
POSTGRES_PASSWORD). - Reiniciar solo los servicios afectados, no todo el stack:
docker compose --env-file .env.prod -f 03-app.yml up -d fastapi - Verificar que el servicio arranca correctamente antes de continuar con el siguiente.
Lo que nunca debe ir en Git
.env.prod está en .gitignore. Aun así, conviene verificarlo periódicamente:
git ls-files --error-unmatch .env.prod 2>/dev/null && echo "¡ALERTA: .env.prod está en Git!"
Si aparece en el historial, la rotación no es opcional: hay que asumir que esos valores están comprometidos y cambiarlos todos.