versia-go/config/config.go

116 lines
2.5 KiB
Go
Raw Normal View History

2024-08-11 03:51:22 +02:00
package config
import (
"git.devminer.xyz/devminer/unitel"
"github.com/joho/godotenv"
"github.com/rs/zerolog/log"
2024-08-24 14:35:19 +02:00
"net/url"
"os"
"regexp"
"strconv"
2024-08-11 03:51:22 +02:00
)
type Config struct {
Port int
TLSKey *string
TLSCert *string
2024-08-20 22:43:26 +02:00
PublicAddress *url.URL
Host string
SharedInboxURL *url.URL
2024-08-11 03:51:22 +02:00
InstanceName string
InstanceDescription *string
2024-08-20 22:43:26 +02:00
NATSURI string
NATSStreamName string
2024-08-11 03:51:22 +02:00
DatabaseURI string
2024-08-24 14:35:19 +02:00
Telemetry unitel.Opts
ForwardTracesTo *regexp.Regexp
2024-08-11 03:51:22 +02:00
}
var C Config
func Load() {
if err := godotenv.Load(".env.local", ".env"); err != nil {
log.Warn().Err(err).Msg("Failed to load .env file")
}
publicAddress, err := url.Parse(os.Getenv("VERSIA_INSTANCE_ADDRESS"))
2024-08-11 03:51:22 +02:00
if err != nil {
log.Fatal().Err(err).Msg("Failed to parse VERSIA_INSTANCE_ADDRESS")
2024-08-11 03:51:22 +02:00
}
2024-08-24 14:35:19 +02:00
var forwardTracesTo *regexp.Regexp
{
rawForwardTracesTo := optionalEnvStr("FORWARD_TRACES_TO")
if rawForwardTracesTo == nil {
s := "matchnothing^"
rawForwardTracesTo = &s
}
if forwardTracesTo, err = regexp.Compile(*rawForwardTracesTo); err != nil {
log.Fatal().Err(err).Str("raw", *rawForwardTracesTo).Msg("Failed to compile")
2024-08-24 14:35:19 +02:00
}
}
tlsKey := optionalEnvStr("VERSIA_TLS_KEY")
tlsCert := optionalEnvStr("VERSIA_TLS_CERT")
if (tlsKey != nil && tlsCert == nil) || (tlsKey == nil && tlsCert != nil) {
log.Fatal().
Msg("Both VERSIA_TLS_KEY and VERSIA_TLS_CERT have to be set if you want to use in-process TLS termination.")
}
2024-08-11 03:51:22 +02:00
C = Config{
Port: getEnvInt("VERSIA_PORT", 80),
TLSCert: tlsCert,
TLSKey: tlsKey,
2024-08-20 22:43:26 +02:00
PublicAddress: publicAddress,
Host: publicAddress.Host,
SharedInboxURL: publicAddress.ResolveReference(&url.URL{Path: "/api/inbox"}),
InstanceName: os.Getenv("VERSIA_INSTANCE_NAME"),
InstanceDescription: optionalEnvStr("VERSIA_INSTANCE_DESCRIPTION"),
2024-08-11 03:51:22 +02:00
2024-08-20 22:43:26 +02:00
NATSURI: os.Getenv("NATS_URI"),
NATSStreamName: getEnvStr("NATS_STREAM_NAME", "versia-go"),
DatabaseURI: os.Getenv("DATABASE_URI"),
2024-08-11 03:51:22 +02:00
2024-08-24 14:35:19 +02:00
ForwardTracesTo: forwardTracesTo,
Telemetry: unitel.ParseOpts("versia-go"),
2024-08-11 03:51:22 +02:00
}
return
}
func optionalEnvStr(key string) *string {
value := os.Getenv(key)
if value == "" {
return nil
}
return &value
}
2024-08-20 22:43:26 +02:00
func getEnvStr(key, default_ string) string {
if value, ok := os.LookupEnv(key); ok {
return value
}
return default_
}
func getEnvInt(key string, default_ int) int {
if value, ok := os.LookupEnv(key); ok {
parsed, err := strconv.Atoi(value)
if err != nil {
panic(err)
}
return parsed
}
return default_
}