Skip to Content

Secret

This page covers building custom secrets providers. If you only need to configure secret resolution for a deployment, use Providers > Secret.

Secrets providers resolve named secrets at server startup. When the Gestalt config references a structured secret ref, the secrets provider fetches the value from whatever backend it wraps (a cloud key vault, a file on disk, an environment variable, etc.) and injects it into the config before any other component starts.

The built-in env and file providers cover local development. For production deployments that store secrets in a cloud vault, use an external secrets provider.

The examples on this page use a Google Secret Manager provider as the running example.

Manifest

A secrets provider manifest declares kind: secrets:

kind: secrets source: github.com/your-org/secrets/google version: 0.0.1 displayName: Google Secret Manager description: Resolves secrets from Google Cloud Secret Manager. spec: configSchemaPath: ./secrets_config.json

The optional spec.configSchemaPath field points to a JSON Schema that validates the config block in the server config.

Interface

A secrets provider implements two methods: Configure and GetSecret. Configure receives the provider name and the raw config map. GetSecret receives a secret name and returns the resolved value as a string.

package googlesecrets import ( "context" "fmt" secretmanager "cloud.google.com/go/secretmanager/apiv1" "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" ) type GoogleSecrets struct { client *secretmanager.Client project string version string } func New() *GoogleSecrets { return &GoogleSecrets{} } func (s *GoogleSecrets) Configure(ctx context.Context, _ string, config map[string]any) error { s.project, _ = config["project"].(string) if s.project == "" { return fmt.Errorf("project is required") } s.version, _ = config["version"].(string) if s.version == "" { s.version = "latest" } var err error s.client, err = secretmanager.NewClient(ctx) return err } func (s *GoogleSecrets) GetSecret(ctx context.Context, name string) (string, error) { resp, err := s.client.AccessSecretVersion(ctx, &secretmanagerpb.AccessSecretVersionRequest{ Name: fmt.Sprintf("projects/%s/secrets/%s/versions/%s", s.project, name, s.version), }) if err != nil { return "", err } return string(resp.Payload.Data), nil }

Config reference

To use a secrets provider in a Gestalt deployment, reference it as a named entry in the providers.secrets block:

providers: secrets: google: source: ./google-secrets/manifest.yaml config: project: my-gcp-project

source: ./manifest.yaml points at the provider’s manifest.yaml during development. For production, use a published provider-release.yaml metadata URL:

providers: secrets: google: source: https://artifacts.example.com/secrets/google/v0.0.1/provider-release.yaml config: project: my-gcp-project

The config block is passed to Configure at startup.

Built-in providers

Two simple providers are built in and do not require a plugin manifest:

env resolves secrets from environment variables. Secret names are uppercased with hyphens converted to underscores. An optional prefix is prepended.

providers: secrets: default: source: env config: prefix: GESTALT_

file reads secrets from files in a directory. Each secret name maps to a file in the configured directory.

providers: secrets: default: source: file config: dir: /run/secrets

Available providers

ProviderSource refDescription
AWS Secrets Managergithub.com/valon-technologies/gestalt-providers/secrets/awsConfig: region (required), versionStage, endpoint
Azure Key Vaultgithub.com/valon-technologies/gestalt-providers/secrets/azureConfig: vaultUrl (required), version
Google Secret Managergithub.com/valon-technologies/gestalt-providers/secrets/googleConfig: project (required), version
HashiCorp Vaultgithub.com/valon-technologies/gestalt-providers/secrets/vaultConfig: address (required), token (required), mountPath, namespace