Configuration System
Deep dive into config composition and templating
This section covers the fundamental concepts and patterns that power Humus applications.
Understanding these core concepts will help you build better applications with Humus:
Humus is built on Bedrock, a foundational framework for application lifecycle management. Humus extends Bedrock with:
Humus provides sensible defaults so you can start quickly. Override only what you need:
// Minimal configuration needed
type Config struct {
rest.Config `config:",squash"`
}
Build complex applications by composing simple pieces:
// Compose multiple configuration sources
source := config.MultiSource(
config.FromYaml("defaults.yaml"),
config.FromYaml("overrides.yaml"),
)
Humus separates:
func main() {
// Configuration source
source := rest.YamlSource("config.yaml")
// Initialization function
init := app.Init
// Execution
rest.Run(source, init)
}
Every Humus service has an Init function that receives configuration and returns the service:
func Init(ctx context.Context, cfg Config) (*rest.Api, error) {
// Build and return your service
}
This function is called after configuration is loaded but before the service starts.
Embed framework configs to inherit standard fields:
type Config struct {
rest.Config `config:",squash"` // Inherits HTTP server config
Database DatabaseConfig `config:"database"` // Your custom config
}
Use errors to fail fast during initialization:
func Init(ctx context.Context, cfg Config) (*rest.Api, error) {
if cfg.Database.Host == "" {
return nil, fmt.Errorf("database host required")
}
// ...
}
Dive deeper into specific concepts:
Or explore service-specific features:
Deep dive into config composition and templating
OpenTelemetry integration for traces, metrics, and logs
Graceful shutdown and signal handling