Documentation Index
Fetch the complete documentation index at: https://docs.pangolin.net/llms.txt
Use this file to discover all available pages before exploring further.
Try free on Pangolin Cloud
Fastest way to get started with Pangolin using the hosted control plane. No credit card required.
README
values.yaml
values.schema.json
Version context
This page is aligned with the Pangolin Helm chart0.1.0-alpha.0.
| Item | Value |
|---|---|
| Chart version | 0.1.0-alpha.0 |
| Pangolin app version | 1.18.2 |
| Kubernetes version | >=1.30.14-0 |
| Gerbil image tag | 1.3.1 |
| pangolin-kube-controller image tag | 0.1.0-alpha.1 |
| Traefik image tag | v3.6.15 |
Configuration sections
Deployment topology
Deployment topology
Control how Pangolin components are deployed and integrated with Kubernetes.Recommended production topology:
If you enable the bundled Traefik dependency, put Traefik chart overrides under the
| Setting | Description |
|---|---|
deployment.type=controller | Uses pangolin-kube-controller and Traefik CRDs. Recommended for Kubernetes deployments. |
deployment.type=standalone | Runs an internal Traefik workload managed by this chart. Mainly useful for labs and self-contained deployments. |
deployment.mode=multi | Runs Pangolin, Gerbil, and controller/Traefik components as separate workloads. Recommended for production. |
deployment.mode=single | Runs multiple components in one shared Pod. Useful only when you explicitly need a compact topology. |
deployment.installTraefikController=true | Installs the bundled Traefik dependency in controller mode. |
deployment.traefikNamespace | Namespace where Traefik controller resources live. Defaults to the release namespace when empty. |
In controller mode, Traefik CRDs and a Traefik controller must be available. You can install Traefik separately or enable the bundled Traefik dependency with
deployment.installTraefikController=true.traefikController key.Namespace and Pod Security Admission
Namespace and Pod Security Admission
Namespace creation is controlled by the Recommended pattern:Gerbil requires If you let the chart create the namespace, configure the Pod Security labels through values:
namespace block.- Create the namespace manually.
- Apply the required labels and annotations.
- Install the chart into that namespace.
NET_ADMIN for WireGuard interface management. If your cluster enforces Pod Security Admission, the namespace must allow that capability.Example:Database modes
Database modes
Choose the database backend for Pangolin.Supported modes:
CloudNativePG can be used in four common ways:
When For the default CNPG cluster name The Secret should contain a PostgreSQL connection string:You can also let the chart create a connection Secret from values:
| Mode | Use case |
|---|---|
cloudnativepg | Recommended production mode using CloudNativePG. This is the default. |
external | Production mode with an externally managed PostgreSQL database. |
embedded | Chart-managed PostgreSQL for labs and test environments. |
sqlite | Development or CI only. Not recommended for production. |
CloudNativePG
The default database mode iscloudnativepg.| Mode | Values |
|---|---|
| Existing operator and existing cluster | cnpg-operator.enabled=false, cnpg-cluster.enabled=false |
| Chart installs operator only | cnpg-operator.enabled=true, cnpg-cluster.enabled=false |
| Chart installs cluster only | cnpg-operator.enabled=false, cnpg-cluster.enabled=true |
| Chart installs operator and cluster | cnpg-operator.enabled=true, cnpg-cluster.enabled=true |
cnpg-cluster.enabled=true, keep the CNPG cluster name consistent:pangolin-db, CloudNativePG creates an application Secret named pangolin-db-app with the key uri. The chart can automatically use this default Secret when no explicit database.connection.existingSecretName is set.Explicit Secret reference:External PostgreSQL
For an external PostgreSQL database, prefer a Kubernetes Secret containing the final connection string.Embedded PostgreSQL
Embedded PostgreSQL is intended for labs and tests.SQLite
SQLite is only suitable for development, CI, or very small test deployments.Pangolin application config
Pangolin application config
The Important settings:
Create the Secret:If no existing Secret is provided, the chart can generate one:
pangolin.config block renders /app/config/config.yml.| Setting | Description |
|---|---|
pangolin.config.app.dashboard_url | Public dashboard URL. Set this to the real user-facing URL. |
pangolin.config.domains | Domain map used by Pangolin. Replace the default example.com entry before production use. |
pangolin.config.gerbil.base_endpoint | Public hostname or IP where Gerbil is reachable. |
pangolin.config.gerbil.start_port | First WireGuard site port. Keep this aligned with gerbil.ports.wg1. |
pangolin.config.gerbil.clients_start_port | Client WireGuard port. Keep this aligned with gerbil.ports.wg2. |
pangolin.config.traefik.enabled | Includes Pangolin’s Traefik config section. This does not install Traefik. |
pangolin.config.traefik.cert_resolver | ACME resolver name used in Pangolin-generated Traefik configuration. |
pangolin.config.traefik controls the Traefik configuration generated by Pangolin. Traefik installation is controlled separately through controller mode, the bundled Traefik dependency, or standalone Traefik mode.Pangolin app secret
Pangolin requiresSERVER_SECRET.Use an existing Secret for production:Dashboard IngressRoute
Dashboard IngressRoute
In controller mode, the chart can render a Traefik Default routing behavior:
The host defaults to the hostname from You can also set an ingress class annotation:
IngressRoute for the Pangolin dashboard and API.| Route | Match | Backend port |
|---|---|---|
| API | Host(...) && PathPrefix(/api/v1) | pangolin.service.ports.external, default 3000 |
| Dashboard | Host(...) | pangolin.service.ports.next, default 3002 |
pangolin.config.app.dashboard_url. You can override it with:TLS with certResolver
TLS with existing Secret
Multi-Traefik setups
Use labels to target a specific Traefik CRD provider when multiple Traefik instances watch different label selectors:Gerbil
Gerbil
Gerbil manages WireGuard tunnel connectivity for Pangolin.Important settings:
For first installs,
| Setting | Description |
|---|---|
gerbil.enabled | Enables the Gerbil component. |
gerbil.startupMode | Controls first-run and normal startup behavior. |
gerbil.ports.wg1 | First WireGuard UDP port. Keep aligned with pangolin.config.gerbil.start_port. |
gerbil.ports.wg2 | Second WireGuard UDP port. Keep aligned with pangolin.config.gerbil.clients_start_port. |
gerbil.ports.internalApi | Internal Gerbil API/listener port. |
gerbil.service.enabled | Creates a Service for Gerbil UDP traffic. |
gerbil.persistence.enabled | Persists Gerbil key/config data. Recommended for production. |
If Gerbil is exposed through a reverse proxy or UDP gateway, keep proxy protocol settings aligned end-to-end. Do not enable proxy protocol on the upstream hop unless Gerbil is configured to accept it.
Startup mode
| Mode | Behavior |
|---|---|
normal | Starts Gerbil immediately. Use after Pangolin setup is complete. |
delayed | Renders Gerbil resources but keeps the Deployment at replicas: 0 in multi mode. Useful for first installs and smoke tests. |
disabledUntilSetup | Does not render Gerbil resources until switched back to normal or delayed. |
delayed can help when Gerbil would otherwise fail before the initial Pangolin setup is complete.Switch back after setup:Security
Gerbil requiresNET_ADMIN.NetworkPolicy
NetworkPolicy
NetworkPolicy rendering is enabled by default.Important defaults:
When tightening policies, verify these paths:
The chart-managed NetworkPolicies are intended to allow required Pangolin, Gerbil, database, DNS, and controller traffic for standard deployments.
| Setting | Default | Notes |
|---|---|---|
networkPolicy.enabled | true | Renders NetworkPolicy resources. |
networkPolicy.allowExternalIngress | true | Allows public ingress to exposed services controlled by the chart. |
networkPolicy.allowExternalEgressHttps | false | Broad HTTPS egress is not allowed by default. Prefer scoped extraEgress rules. |
networkPolicy.dns.enabled | true | Allows DNS egress. |
networkPolicy.database.enabled | true | Adds database egress rules for Pangolin. |
networkPolicy.controller.egress.kubernetesApi.enabled | true | Allows controller API-server access when configured. |
networkPolicy.gerbil.allowWireguardUdpEgress | true | Allows Gerbil UDP egress for WireGuard peer traffic. |
- DNS egress
- Pangolin to database
- controller to Kubernetes API
- ingress controller to Pangolin service
- Gerbil UDP traffic
- outbound access for SMTP, OIDC, webhooks, or other external integrations
Monitoring
Monitoring
The chart has chart-level monitoring settings for Pangolin and controller-specific monitoring settings for Enable controller ServiceMonitor when Prometheus Operator is available:Enable chart-level metrics Service when the Pangolin app exposes metrics in your selected configuration:
pangolin-kube-controller.Pangolin monitoring
Controller monitoring
Only enable ServiceMonitor, PodMonitor, or PrometheusRule resources when the matching CRDs are installed in the cluster.
ServiceAccount and RBAC
ServiceAccount and RBAC
The chart uses separate ServiceAccounts for Pangolin, Gerbil, and the controller in multi mode.Default behavior:
| Component | API token mounted by default | Reason |
|---|---|---|
| Pangolin | No | The app does not need Kubernetes API access. |
| Gerbil | No | Gerbil manages WireGuard and does not need Kubernetes API access. |
| Controller | Yes | The controller reconciles Traefik CRDs and needs Kubernetes API access. |
In
deployment.mode=single with deployment.type=controller, Kubernetes ServiceAccount selection is Pod-level. The shared Pod uses the controller ServiceAccount and token.Resources, scheduling, and images
Resources, scheduling, and images
Global scheduling defaults:Resource rendering policy:Pangolin resources:Gerbil resources:Controller resources:Image configuration:The chart automatically selects the PostgreSQL-capable Pangolin image variant for non-SQLite database modes unless you override the Pangolin tag or digest.
Ephemeral-storage requests and limits are only rendered when
resourcesPolicy.ephemeralStorage.enabled=true.Standalone Traefik
Standalone Traefik
Standalone Traefik is used mainly when Important notes:
deployment.type=standalone.traefik.enabled=trueruns an internal Traefik workload managed by this chart.traefik.config.letsencryptEmailis required when standalone Traefik is enabled.- If you enable the Traefik dashboard, enable
traefik.persistence.enabledso ACME state survives restarts. - In controller mode, prefer using an existing or bundled Traefik controller instead of standalone Traefik.
Blueprint storage
Blueprint storage
The chart can store Pangolin Blueprint YAML files as Kubernetes ConfigMaps and Secrets.Example:Sensitive blueprint environment values should come from a Secret:
Configuration by install method
Helm
Use a values file:Kustomize
Render the chart with Helm, then apply Kustomize overlays:GitOps
Store Helm values or Kustomize overlays in Git. Argo CD or Flux reconciles the desired state. Argo CD Helm example:Next steps
Helm Install
Install Pangolin with Helm.
Kustomize Install
Install Pangolin with rendered manifests and Kustomize overlays.
Troubleshooting
Debug Pangolin deployments on Kubernetes.
GitOps
Deploy Pangolin with Argo CD or Flux.

