config

package
v0.0.0-...-435b0f4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 30, 2025 License: GPL-3.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (
	EnvSecret = "SECRET"
)

Variables

This section is empty.

Functions

func NewRedisClient

func NewRedisClient(name string, url string) (*redis.Client, error)

NewRedisClient creates and verifies a new Redis client connection

Types

type App

type App struct {
	TimeZone    string `env:"TZ,default=Etc/UTC" validate:"required"`
	Development bool   `env:"DEVELOPMENT,default=false"`
}

type Auth

type Auth struct {
	Type                   constant.ConfigAuthType            `env:"AUTH_TYPE,default=session" validate:"required,oneof=session"`
	SessionSecret          string                             `env:"AUTH_SESSION_SECRET,required" validate:"required_if=Type session"`
	SessionProvider        constant.ConfigAuthSessionProvider `env:"AUTH_SESSION_PROVIDER,default=single" validate:"required_if=Type session,oneof=single credentials"`
	SessionUser            string                             `env:"AUTH_SESSION_USER" validate:"required_if=SessionProvider single"`
	SessionPassword        string                             `env:"AUTH_SESSION_PASSWORD" validate:"required_if=SessionProvider single"`
	SessionCredentials     map[string]string                  `env:"AUTH_SESSION_CREDENTIALS,separator=|,delimiter=;" validate:"required_if=SessionProvider credentials"`
	SessionCleanupEnabled  bool                               `env:"AUTH_SESSION_CLEANUP_ENABLED,default=true"`
	SessionCleanupInterval time.Duration                      `env:"AUTH_SESSION_CLEANUP_INTERVAL,default=1h" validate:"required_if=Type session,gte=0"`
	SessionCookieMaxAge    time.Duration                      `env:"AUTH_SESSION_COOKIE_MAX_AGE,default=8h" validate:"required_if=Type session"`
	SessionCookieName      string                             `env:"AUTH_SESSION_COOKIE_NAME,default=UPDA_SESSION" validate:"required_if=Type session"`
	// if set to non-blank, subdomains send it
	SessionCookieDomain *string `env:"AUTH_SESSION_COOKIE_DOMAIN"`
	// cookie's scope (/ meaning when browser adds it automatically)
	SessionCookiePath string `env:"AUTH_SESSION_COOKIE_PATH,default=/" validate:"required_if=Type session"`
	// true means JavaScript cannot access it (recommended)
	SessionCookieHttpOnly bool `env:"AUTH_SESSION_COOKIE_HTTP_ONLY,default=true"`
	// true means SSL is required, otherwise cookie is not sent
	SessionCookieSecure bool `env:"AUTH_SESSION_COOKIE_SECURE,default=true"`
	// force mode when browser stores (recommended is strict)
	SessionCookieSameSite     constant.ConfigAuthSessionSameSite `env:"AUTH_SESSION_COOKIE_SAME_SITE,default=strict" validate:"required_if=Type session,oneof=lax strict"`
	SessionCookieSameSiteMode http.SameSite
}

type Configuration

type Configuration struct {
	App                      *App
	Auth                     *Auth
	Cors                     *Cors
	Database                 *Database
	Lock                     *Lock
	Logging                  *Logging
	Prometheus               *Prometheus
	Secret                   *Secret
	Server                   *Server
	Task                     *Task
	Webhook                  *Webhook
	Webinterface             *Webinterface
	WebinterfaceCacheControl *WebinterfaceCacheControl
}

func LoadFromEnvironment

func LoadFromEnvironment(ctx context.Context) (*Configuration, *gorm.DB)

type Cors

type Cors struct {
	AllowCredentials bool     `env:"CORS_ALLOW_CREDENTIALS,default=true"`
	AllowOrigins     []string `env:"CORS_ALLOW_ORIGINS,default=*"`
	AllowMethods     []string `env:"CORS_ALLOW_METHODS,default=HEAD,GET,POST,PUT,PATCH,DELETE,OPTIONS"`
	AllowHeaders     []string `env:"CORS_ALLOW_HEADERS,default=Authorization,Content-Type"`
	ExposeHeaders    []string `env:"CORS_EXPOSE_HEADERS,default=*"`
}

type Database

type Database struct {
	Type             constant.ConfigDatabaseType `env:"DB_TYPE,default=postgres" validate:"required,oneof=postgres"`
	MigrationEnabled bool                        `env:"DB_MIGRATION_ENABLED,default=true"`
	PostgresHost     string                      `env:"DB_POSTGRES_HOST,default=localhost" validate:"required_if=Type postgres"`
	PostgresPort     int                         `env:"DB_POSTGRES_PORT,default=5432" validate:"required_if=Type postgres"`
	PostgresName     string                      `env:"DB_POSTGRES_NAME" validate:"required_if=Type postgres"`
	PostgresTimeZone string                      `env:"DB_POSTGRES_TZ,default=Etc/UTC" validate:"required_if=Type postgres"`
	PostgresUser     string                      `env:"DB_POSTGRES_USER" validate:"required_if=Type postgres"`
	PostgresPassword string                      `env:"DB_POSTGRES_PASSWORD" validate:"required_if=Type postgres"`
}

type Lock

type Lock struct {
	RedisEnabled        bool          `env:"LOCK_REDIS_ENABLED,default=false"`
	RedisHost           string        `env:"LOCK_REDIS_HOST,default=localhost" validate:"required_if=RedisEnabled true"`
	RedisPort           int           `env:"LOCK_REDIS_PORT,default=6379" validate:"required_if=RedisEnabled true,numeric,gte=1"`
	RedisDbName         int           `env:"LOCK_REDIS_DB_NAME,default=0" validate:"numeric,gte=0"`
	RedisUsername       string        `env:"LOCK_REDIS_USERNAME"`
	RedisPassword       string        `env:"LOCK_REDIS_PASSWORD"`
	RedisTaskTries      int           `env:"LOCK_REDIS_TASK_LOCK_TRIES,default=1" validate:"required_if=RedisEnabled true,numeric,gte=1"`
	RedisTaskLockAtMost time.Duration `env:"LOCK_REDIS_TASK_LOCK_AT_MOST,default=30s" validate:"required_if=RedisEnabled true,gte=0"`
	RedisTaskRetryDelay time.Duration `env:"LOCK_REDIS_TASK_RETRY_DELAY,default=5s" validate:"required_if=RedisEnabled true,gte=0"`
	RedisUrl            string
}

type Logging

type Logging struct {
	Encoding              constant.ConfigLogEncoding    `env:"LOGGING_ENCODING,default=console" validate:"required,oneof=json console"`
	EncodingColorize      bool                          `env:"LOGGING_ENCODING_COLORIZE,default=false"`
	EncodingErrorKey      string                        `env:"LOGGING_ENCODING_ERROR_KEY,default=error" validate:"required"`
	EncodingFileKey       string                        `env:"LOGGING_ENCODING_FILE_KEY,default=file" validate:"required"`
	EncodingFuncKey       string                        `env:"LOGGING_ENCODING_FUNC_KEY,default=func" validate:"required"`
	EncodingLevelKey      string                        `env:"LOGGING_ENCODING_LEVEL_KEY,default=level" validate:"required"`
	EncodingMessageKey    string                        `env:"LOGGING_ENCODING_MESSAGE_KEY,default=msg" validate:"required"`
	EncodingStacktraceKey string                        `env:"LOGGING_ENCODING_STACKTRACE_KEY,default=stacktrace" validate:"required"`
	EncodingTimeEncoder   constant.ConfigLogTimeEncoder `` /* 134-byte string literal not displayed */
	EncodingTimeKey       string                        `env:"LOGGING_ENCODING_TIME_KEY,default=ts" validate:"required"`
	Level                 string                        `env:"LOGGING_LEVEL,default=info" validate:"required,oneof=trace debug info warn error fatal panic disabled"`
	LevelRequests         string                        `env:"LOGGING_LEVEL_REQUESTS,default=disabled" validate:"required,oneof=trace debug info warn error fatal panic disabled"`
}

type Prometheus

type Prometheus struct {
	Enabled            bool          `env:"PROMETHEUS_ENABLED,default=false"`
	Port               int           `env:"PROMETHEUS_PORT,default=8080" validate:"required_if=Enabled true,gte=1"`
	Listen             string        `env:"PROMETHEUS_LISTEN"`
	BasePath           string        `env:"PROMETHEUS_BASE_PATH,default=/" validate:"required_if=Enabled true"`
	Path               string        `env:"PROMETHEUS_METRICS_PATH,default=/metrics" validate:"required_if=Enabled true"`
	SecureTokenEnabled bool          `env:"PROMETHEUS_SECURE_TOKEN_ENABLED,default=true"`
	SecureToken        string        `env:"PROMETHEUS_SECURE_TOKEN" validate:"required_if=Enabled true SecureTokenEnabled true"`
	RefreshInterval    time.Duration `env:"PROMETHEUS_REFRESH_INTERVAL,default=60s" validate:"required_if=Enabled true,gte=0"`
}

type Secret

type Secret struct {
	Secret string `env:"SECRET,required" validate:"required"`
}

type Server

type Server struct {
	Port        int           `env:"SERVER_PORT,default=8080" validate:"gte=1"`
	Listen      string        `env:"SERVER_LISTEN"`
	BasePath    string        `env:"SERVER_BASE_PATH,default=/" validate:"required"`
	TlsEnabled  bool          `env:"SERVER_TLS_ENABLED,default=false"`
	TlsCertPath string        `env:"SERVER_TLS_CERT_PATH"`
	TlsKeyPath  string        `env:"SERVER_TLS_KEY_PATH"`
	Timeout     time.Duration `env:"SERVER_TIMEOUT,default=10s" validate:"gte=0"`
}

type Task

type Task struct {
	UpdateCleanStaleEnabled  bool          `env:"TASK_UPDATE_CLEAN_STALE_ENABLED,default=true"`
	UpdateCleanStaleInterval time.Duration `env:"TASK_EVENT_CLEAN_STALE_INTERVAL,default=1h" validate:"required_if=UpdateCleanStaleEnabled true,gt=0"`
	UpdateCleanStaleMaxAge   time.Duration `env:"TASK_UPDATE_CLEAN_STALE_MAX_AGE,default=720h" validate:"required_if=UpdateCleanStaleEnabled true,gt=0"`

	EventCleanStaleEnabled  bool          `env:"TASK_EVENT_CLEAN_STALE_ENABLED,default=false"`
	EventCleanStaleInterval time.Duration `env:"TASK_EVENT_CLEAN_STALE_INTERVAL,default=8h" validate:"required_if=EventCleanStaleEnabled true,gt=0"`
	EventCleanStaleMaxAge   time.Duration `env:"TASK_EVENT_CLEAN_STALE_MAX_AGE,default=2190h" validate:"required_if=EventCleanStaleEnabled true,gt=0"`

	ActionsEnqueueEnabled   bool          `env:"TASK_ACTIONS_ENQUEUE_ENABLED,default=true"`
	ActionsEnqueueInterval  time.Duration `env:"TASK_ACTIONS_ENQUEUE_INTERVAL,default=10s" validate:"required_if=ActionsEnqueueEnabled true,gt=0"`
	ActionsEnqueueBatchSize int           `env:"TASK_ACTIONS_ENQUEUE_BATCH_SIZE,default=1" validate:"required_if=ActionsEnqueueEnabled true,numeric,gte=1"`

	ActionsInvokeEnabled    bool          `env:"TASK_ACTIONS_INVOKE_ENABLED,default=true"`
	ActionsInvokeInterval   time.Duration `env:"TASK_ACTIONS_INVOKE_INTERVAL,default=10s" validate:"required_if=ActionsInvokeEnabled true,gt=0"`
	ActionsInvokeBatchSize  int           `env:"TASK_ACTIONS_INVOKE_BATCH_SIZE,default=1" validate:"required_if=ActionsInvokeEnabled true,numeric,gte=1"`
	ActionsInvokeMaxRetries int           `env:"TASK_ACTIONS_INVOKE_MAX_RETRIES,default=3" validate:"required_if=ActionsInvokeEnabled true,numeric,gte=1"`

	ActionsCleanStaleEnabled  bool          `env:"TASK_ACTIONS_CLEAN_STALE_ENABLED,default=true"`
	ActionsCleanStaleInterval time.Duration `env:"TASK_ACTIONS_CLEAN_STALE_INTERVAL,default=12h" validate:"required_if=ActionsCleanStaleEnabled true,gt=0"`
	ActionsCleanStaleMaxAge   time.Duration `env:"TASK_ACTIONS_CLEAN_STALE_MAX_AGE,default=720h" validate:"required_if=ActionsCleanStaleEnabled true,gt=0"`
}

type Webhook

type Webhook struct {
	TokenLength int `env:"WEBHOOKS_TOKEN_LENGTH,default=32" validate:"required,numeric,gte=4"`
}

type Webinterface

type Webinterface struct {
	Enabled          bool   `env:"WEB_INTERFACE_ENABLED,default=true"`
	ApiUrl           string `env:"WEB_INTERFACE_API_URL,default=http://localhost:8080/api/" validate:"required_if=Enabled true"`
	Title            string `env:"WEB_INTERFACE_TITLE,default=upda" validate:"required_if=Enabled true"`
	DarkThemeEnabled bool   `env:"WEB_INTERFACE_DARK_THEME_ENABLED,default=false"`
	FooterEnabled    bool   `env:"WEB_INTERFACE_FOOTER_ENABLED,default=true"`
}

type WebinterfaceCacheControl

type WebinterfaceCacheControl struct {
	Enabled              bool           `env:"WEB_INTERFACE_CC_ENABLED,default=true"`
	MustRevalidate       bool           `env:"WEB_INTERFACE_CC_MUST_REVALIDATE,default=true"`
	NoCache              bool           `env:"WEB_INTERFACE_CC_NO_CACHE,default=false"`
	NoStore              bool           `env:"WEB_INTERFACE_CC_NO_STORE,default=false"`
	NoTransform          bool           `env:"WEB_INTERFACE_CC_NO_TRANSFORM,default=false"`
	Public               bool           `env:"WEB_INTERFACE_CC_PUBLIC,default=true"`
	Private              bool           `env:"WEB_INTERFACE_CC_PRIVATE,default=false"`
	ProxyRevalidate      bool           `env:"WEB_INTERFACE_CC_PROXY_REVALIDATE,default=true"`
	MaxAge               *time.Duration `env:"WEB_INTERFACE_CC_MAX_AGE,noinit,default=48h"`
	SMaxAge              *time.Duration `env:"WEB_INTERFACE_CC_SMAX_AGE,noinit"`
	Immutable            bool           `env:"WEB_INTERFACE_CC_IMMUTABLE,default=false"`
	StaleWhileRevalidate *time.Duration `env:"WEB_INTERFACE_CC_STALE_WHILE_REVALIDATE,noinit"`
	StaleIfError         *time.Duration `env:"WEB_INTERFACE_CC_STALE_IF_ERROR,noinit"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL