Overview
Infisical is an open-source secrets-management platform: store, version, scope, and serve application secrets through a web UI and REST API, with projects, environments, and access controls. This template deploys a stateless Infisical server tier backed by PostgreSQL (the durable secret store) and HA Redis with Sentinel (cache and background-job queues).Architecture
- Infisical server — A stateless
standardworkload serving the web UI and API on port8080from the standalone image. Runs its database migrations automatically on boot; scale withinfisical.replicas(a startup lock ensures migrations run exactly once even when multiple replicas boot concurrently). - PostgreSQL (postgres subchart) — The durable store for all secrets, versions, projects, and users.
- Redis + Sentinel (redis subchart) — Cache and background-job queues, deployed HA (3 Redis + 3 Sentinel replicas, master
mymaster). The server connects Sentinel-aware, so Redis failover is transparent. Required — Infisical will not boot without Redis.
What Gets Created
- Standard Infisical Workload — One or more stateless replicas serving the UI and API on port
8080. - Stateful PostgreSQL Workload — Single-replica Postgres with a persistent volume set for all Infisical data.
- Redis Workloads — A Redis master-replica set plus Redis Sentinel for cache and job queues.
- DB-credentials Secret — A template-created dictionary secret used to assemble the server’s
DB_CONNECTION_URI. - Identity & Policy — An identity bound to the server with least-privilege
revealon exactly the secrets it mounts, including your prerequisite secret.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
You must create a dictionary secret before installing. The server references it by name (secrets.name, default my-infisical-secrets) and the deployment wedges until the secret exists. Create it first as a dictionary secret holding Infisical’s root-of-trust keys:
ENCRYPTION_KEY— a 16-byte hex key (openssl rand -hex 16) that encrypts every secret stored in Infisical.AUTH_SECRET— a 32-byte base64 key (openssl rand -base64 32) that signs sessions and tokens.
SMTP_USERNAME and SMTP_PASSWORD, referenced via smtp.auth.secretName. Leave smtp.auth.secretName empty for unauthenticated relays and mail catchers.
UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
Configuration
The defaultvalues.yaml for this template:
Infisical server
infisical.image— The standalone Infisical image (API + web UI in one container). Pin a concrete tag.infisical.replicas— Number of stateless server replicas.1is the proven single-replica shape;2or more gives an HA tier over the shared PostgreSQL and Redis, with zero-downtime rolling restarts. Boot migrations are serialized by a startup lock, so they run exactly once no matter how many replicas start at once.infisical.siteUrl— The public base URL Infisical advertises in links, cookies, and callbacks. Leave empty to derive it automatically from the canonical*.cpln.appendpoint; set it (includinghttps://) only when you front the workload with a custom domain.infisical.resources— CPU and memory per replica. KeepmaxMemoryat2Gi— a cold multi-replica boot runs out of memory at1Gi.
Prerequisite secret
secrets.name— Name of the user-created dictionary secret holdingENCRYPTION_KEYandAUTH_SECRET. It must exist before install — see Prerequisites.
SMTP / email
Off by default — the zero-config install works via the no-email admin-signup bootstrap. Enable it for email invites, address verification, and password reset:smtp.enabled— Turn email on.smtp.hostandsmtp.fromAddressare required when enabled.smtp.requireTls— STARTTLS is required by default; setfalseonly for a plaintext mail catcher (e.g. Mailpit on port1025).smtp.auth.secretName— Name of an optional dictionary secret withSMTP_USERNAMEandSMTP_PASSWORDfor authenticated SMTP. Empty means no authentication; when set, the workload is grantedrevealon exactly that secret.
Access
publicAccess.enabled— Serve the UI and API on the canonical*.cpln.appHTTPS endpoint (default). Set tofalsefor an internal-only instance.internalAccess.type— Internal firewall scope of the server workload:
PostgreSQL
postgres.config.password— The bundled database password. Change it before installing.postgres.volumeset.capacity— Initial volume size in GiB (minimum 10).
Redis
redis.redis.auth.password.enabled— Whenfalse(default), Redis runs authless with the same-GVC firewall as the boundary. Set totrueto require AUTH on the data nodes; the master password is then wired into Infisical asREDIS_PASSWORD(Sentinels stay authless). Both paths are tested end to end, including Sentinel monitoring the auth-protected master.redis.redis.replicas/redis.sentinel.replicas— Redis and Sentinel replica counts (3 + 3 by default).
Connecting
The canonical
*.cpln.app hostname appears under status.canonicalEndpoint (cpln workload get {release}-infisical -o yaml).
Important Notes
- The prerequisite secret must exist before install —
secrets.nameis a dictionary secret withENCRYPTION_KEYandAUTH_SECRET. A missing secret wedges the deployment and makes it look broken. ENCRYPTION_KEYandAUTH_SECRETare write-once — never rotate them.ENCRYPTION_KEYencrypts every stored secret;AUTH_SECRETsigns all sessions.- The first account to sign up becomes super-admin — create it immediately after install, then disable open sign-ups in the Admin panel.
- Redis is required, not optional — Infisical will not boot without it (authless behind the same-GVC firewall by default).
- Keep
infisical.resources.maxMemoryat2Gi— a cold boot withreplicas≥ 2 runs out of memory at1Gi. - Stored secrets live in PostgreSQL and survive an app restart or reinstall — to wipe all data you must also reinstall the PostgreSQL dependency (which deletes its volume set).
- First boot takes roughly 2–5 minutes — the server waits for PostgreSQL to finish initializing and runs its migrations, logging transient
Boot up migration failedretries in the meantime. This self-heals; the workload becomes ready once migrations complete. - Set
smtp.requireTls: falseonly for a plaintext mail catcher — real providers on port587need it lefttrue.
External References
Infisical Documentation
Official Infisical documentation
Self-Hosting Configuration
Environment variable reference for self-hosted Infisical
Standalone Deployment
The standalone image this template deploys
Email Service Setup
SMTP setup for invites, verification, and password reset
Infisical Template
View the source files, default values, and chart definition