Cifrado de variables de entorno
El diseño
Sección titulada «El diseño»Cada variable de entorno que utiliza un servicio se almacena en la columna services.env_json. Antes de escribir, Pier cifra el JSON con AES-256-GCM usando una clave de 32 bytes de /opt/pier/.env:
PIER_SECRET=<32 bytes base64>Los valores cifrados llevan un prefijo ENC: para que Pier pueda distinguirlos de las filas heredadas en texto plano.
Por qué la clave reside fuera de la base de datos
Sección titulada «Por qué la clave reside fuera de la base de datos»Si un atacante extrae únicamente pier.db, no obtiene nada — el texto cifrado es inútil sin la clave.
Si un atacante extrae solo .env, no hay datos que descifrar.
Un atacante necesita ambos para leer los secretos.
Este es el mismo modelo que utiliza Coolify (la APP_KEY de Laravel + cast cifrado). Más simple que un Vault, y apropiado para una herramienta autoalojada de un solo inquilino.
Inicialización en el primer arranque
Sección titulada «Inicialización en el primer arranque»En la primera ejecución, si /opt/pier/.env no existe, Pier genera un PIER_SECRET nuevo y lo escribe con chmod 600. Se guarda una instantánea única de la base de datos como pier.db.pre-encryption por si necesitas volver al modo de texto plano para depuración.
Rotación
Sección titulada «Rotación»La rotación es poco frecuente. Cuando sea necesaria:
- Detén Pier.
- Ejecuta el asistente de rotación (planificado):
pier rotate-secret. - Inicia Pier.
Hasta que se publique el asistente de la CLI, exporta las variables de entorno a través de la interfaz, rota PIER_SECRET manualmente y vuelve a importarlas.
Qué no se cifra
Sección titulada «Qué no se cifra»- Los nombres de los servicios, las imágenes, los puertos y los dominios — estos no son secretos.
- Los metadatos de despliegue y los registros — datos superficiales, no credenciales.
- Los archivos de configuración dinámica de Traefik — contienen nombres de host, no secretos.