mirror of
https://github.com/Forceu/Gokapi.git
synced 2026-01-11 19:39:43 -06:00
113 lines
3.6 KiB
Go
113 lines
3.6 KiB
Go
package environment
|
|
|
|
import (
|
|
"fmt"
|
|
envParser "github.com/caarlos0/env/v6"
|
|
"github.com/forceu/gokapi/internal/environment/flagparser"
|
|
"github.com/forceu/gokapi/internal/helper"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
// DefaultPort for the webserver
|
|
const DefaultPort = 53842
|
|
|
|
// Environment is a struct containing available env variables
|
|
type Environment struct {
|
|
ChunkSizeMB int `env:"CHUNK_SIZE_MB" envDefault:"45"`
|
|
ConfigDir string `env:"CONFIG_DIR" envDefault:"config"`
|
|
ConfigFile string `env:"CONFIG_FILE" envDefault:"config.json"`
|
|
ConfigPath string
|
|
DataDir string `env:"DATA_DIR" envDefault:"data"`
|
|
DatabaseUrl string `env:"DATABASE_URL" envDefault:"sqlite://[data]/gokapi.sqlite"`
|
|
LengthId int `env:"LENGTH_ID" envDefault:"15"`
|
|
LengthHotlinkId int `env:"LENGTH_HOTLINK_ID" envDefault:"40"`
|
|
MaxFileSize int `env:"MAX_FILESIZE" envDefault:"102400"` // 102400==100GB
|
|
MaxMemory int `env:"MAX_MEMORY_UPLOAD" envDefault:"50"`
|
|
MaxParallelUploads int `env:"MAX_PARALLEL_UPLOADS" envDefault:"4"`
|
|
WebserverPort int `env:"PORT" envDefault:"53842"`
|
|
DisableCorsCheck bool `env:"DISABLE_CORS_CHECK" envDefault:"false"`
|
|
LogToStdout bool `env:"LOG_STDOUT" envDefault:"false"`
|
|
HotlinkVideos bool `env:"ENABLE_HOTLINK_VIDEOS" envDefault:"false"`
|
|
AwsBucket string `env:"AWS_BUCKET"`
|
|
AwsRegion string `env:"AWS_REGION"`
|
|
AwsKeyId string `env:"AWS_KEY"`
|
|
AwsKeySecret string `env:"AWS_KEY_SECRET"`
|
|
AwsEndpoint string `env:"AWS_ENDPOINT"`
|
|
AwsProxyDownload bool `env:"AWS_PROXY_DOWNLOAD" envDefault:"false"`
|
|
}
|
|
|
|
// New parses the env variables
|
|
func New() Environment {
|
|
result := Environment{WebserverPort: DefaultPort}
|
|
err := envParser.Parse(&result, envParser.Options{
|
|
Prefix: "GOKAPI_",
|
|
})
|
|
if err != nil {
|
|
fmt.Println("Error parsing env variables:", err)
|
|
osExit(1)
|
|
return Environment{}
|
|
}
|
|
helper.Check(err)
|
|
|
|
flags := flagparser.ParseFlags()
|
|
if flags.IsPortSet {
|
|
result.WebserverPort = flags.Port
|
|
}
|
|
if flags.IsConfigDirSet {
|
|
result.ConfigDir = flags.ConfigDir
|
|
}
|
|
if flags.IsDataDirSet {
|
|
result.DataDir = flags.DataDir
|
|
}
|
|
|
|
result.ConfigDir = path.Clean(result.ConfigDir)
|
|
result.DataDir = path.Clean(result.DataDir)
|
|
result.ConfigPath = result.ConfigDir + "/" + result.ConfigFile
|
|
if flags.IsConfigPathSet {
|
|
result.ConfigPath = flags.ConfigPath
|
|
}
|
|
if IsDockerInstance() && os.Getenv("TMPDIR") == "" {
|
|
err = os.Setenv("TMPDIR", result.DataDir)
|
|
helper.Check(err)
|
|
}
|
|
if result.LengthId < 5 {
|
|
result.LengthId = 5
|
|
}
|
|
if result.LengthHotlinkId < 8 {
|
|
result.LengthHotlinkId = 8
|
|
}
|
|
if result.MaxMemory < 5 {
|
|
result.MaxMemory = 5
|
|
}
|
|
if result.MaxFileSize < 1 {
|
|
result.MaxFileSize = 5
|
|
}
|
|
|
|
if flags.IsDatabaseUrlSet {
|
|
result.DatabaseUrl = flags.DatabaseUrl
|
|
}
|
|
result.DatabaseUrl = strings.Replace(result.DatabaseUrl, "[data]", result.DataDir, 1)
|
|
|
|
return result
|
|
}
|
|
|
|
// IsAwsProvided returns true if all required env variables have been set for using AWS S3 / Backblaze
|
|
func (e *Environment) IsAwsProvided() bool {
|
|
return e.AwsBucket != "" &&
|
|
e.AwsRegion != "" &&
|
|
e.AwsKeyId != "" &&
|
|
e.AwsKeySecret != ""
|
|
}
|
|
|
|
// GetConfigPaths returns the config paths to config files and the directory containing the files. The following results are returned:
|
|
// Path to config file, Path to directory containing config file, Name of config file, Path to AWS config file
|
|
func GetConfigPaths() (pathConfigFile, pathConfigDir, nameConfigFile, pathAwsConfig string) {
|
|
env := New()
|
|
pathAwsConfig = env.ConfigDir + "/cloudconfig.yml"
|
|
return env.ConfigPath, env.ConfigDir, env.ConfigFile, pathAwsConfig
|
|
}
|
|
|
|
var osExit = os.Exit
|