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 {
|
2024-08-24 16:59:36 +02:00
|
|
|
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")
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-24 22:50:43 +02:00
|
|
|
publicAddress, err := url.Parse(os.Getenv("VERSIA_INSTANCE_ADDRESS"))
|
2024-08-11 03:51:22 +02:00
|
|
|
if err != nil {
|
2024-08-24 22:50:43 +02:00
|
|
|
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
|
2024-08-24 22:58:50 +02:00
|
|
|
{
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-24 16:59:36 +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{
|
2024-08-24 16:59:36 +02:00
|
|
|
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"}),
|
|
|
|
|
|
2024-08-24 22:50:43 +02:00
|
|
|
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_
|
|
|
|
|
}
|