Skip to Content
ProvidersSecret

Secret

Secrets are under active development and are not yet stable. Breaking changes may happen between releases without warning. Feedback and bug reports are welcome via GitHub Issues .

Secrets providers resolve structured secret refs before the rest of the server starts. That lets provider config, OAuth app secrets, DSNs, and other sensitive values stay out of the main YAML file while still being injected into the final runtime config.

Configuring providers.secrets

Use the built-in env provider to resolve secrets from environment variables:

providers: secrets: default: source: env config: prefix: GESTALT_ server: encryptionKey: secret: provider: default name: GESTALT_ENCRYPTION_KEY

Use the built-in file provider to resolve one secret per mounted file:

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

External secret managers use the same providers.secrets.<name> shape with a package source. For package names, config fields, and auth behavior, see Config File.

Gestalt resolves structured secret refs through the configured provider before any auth provider, app provider, or datastore provider receives its config.

Building your own secrets provider

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.

Provider interface

Implement the SDK’s secrets provider surface. configure receives the provider name and config block when the entry starts. get_secret / GetSecret receives a logical secret name and returns the resolved plaintext value.

MethodPurpose
ConfigureRead provider config and initialize backing clients.
Get secretResolve one named secret to a string value.
package examplesecrets import ( "context" "fmt" gestalt "github.com/valon-technologies/gestalt/sdk/go" ) type Provider struct { values map[string]string } func New() *Provider { return &Provider{values: map[string]string{}} } func (p *Provider) Configure(_ context.Context, _ string, config map[string]any) error { values := map[string]string{} if raw, ok := config["values"].(map[string]any); ok { for name, value := range raw { values[name] = fmt.Sprint(value) } } p.values = values return nil } func (p *Provider) GetSecret(_ context.Context, name string) (string, error) { value, ok := p.values[name] if !ok { return "", fmt.Errorf("%w: %s", gestalt.ErrSecretNotFound, name) } return value, nil }

Release flow

For packaging, lock/sync, and release behavior, see Releasing provider packages.