Secret
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_KEYUse the built-in file provider to resolve one secret per mounted file:
providers:
secrets:
default:
source: file
config:
dir: /run/secretsExternal 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.jsonThe 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.
| Method | Purpose |
|---|---|
| Configure | Read provider config and initialize backing clients. |
| Get secret | Resolve one named secret to a string value. |
Go
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.
What to read next
- Config File: exact
providers.secretsfields - Built-in Providers: built-in
envandfile