108 lines
2.4 KiB
Go
108 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"vctp/db"
|
|
utils "vctp/internal/utils"
|
|
"vctp/log"
|
|
"vctp/server"
|
|
"vctp/server/router"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
var (
|
|
bindDisableTls bool
|
|
sha1ver string // sha1 revision used to build the program
|
|
buildTime string // when the executable was built
|
|
)
|
|
|
|
func main() {
|
|
// Load data from environment file
|
|
envFilename := utils.GetFilePath(".env")
|
|
err := godotenv.Load(envFilename)
|
|
if err != nil {
|
|
panic("Error loading .env file")
|
|
}
|
|
|
|
logger := log.New(
|
|
log.GetLevel(),
|
|
log.GetOutput(),
|
|
)
|
|
|
|
// Configure database
|
|
database, err := db.New(logger, "./db.sqlite3")
|
|
if err != nil {
|
|
logger.Error("Failed to create database", "error", err)
|
|
os.Exit(1)
|
|
}
|
|
defer database.Close()
|
|
|
|
/*
|
|
if err = db.Migrate(database); err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
|
logger.Error("failed to migrate database", "error", err)
|
|
return
|
|
}
|
|
*/
|
|
|
|
if err = db.Migrate(database); err != nil {
|
|
logger.Error("failed to migrate database", "error", err)
|
|
return
|
|
}
|
|
|
|
// Determine bind IP
|
|
bindIP := os.Getenv("BIND_IP")
|
|
if bindIP == "" {
|
|
bindIP = utils.GetOutboundIP().String()
|
|
}
|
|
// Determine bind port
|
|
bindPort := os.Getenv("BIND_PORT")
|
|
if bindPort == "" {
|
|
bindPort = "9443"
|
|
}
|
|
bindAddress := fmt.Sprint(bindIP, ":", bindPort)
|
|
slog.Info("Will listen on address", "ip", bindIP, "port", bindPort)
|
|
|
|
// Determine bind disable TLS
|
|
bindDisableTlsEnv := os.Getenv("BIND_DISABLE_TLS")
|
|
if bindDisableTlsEnv == "true" {
|
|
bindDisableTls = true
|
|
}
|
|
|
|
// Get file names for TLS cert/key
|
|
tlsCertFilename := os.Getenv("TLS_CERT_FILE")
|
|
if tlsCertFilename != "" {
|
|
tlsCertFilename = utils.GetFilePath(tlsCertFilename)
|
|
} else {
|
|
tlsCertFilename = "./cert.pem"
|
|
}
|
|
|
|
tlsKeyFilename := os.Getenv("TLS_KEY_FILE")
|
|
if tlsKeyFilename != "" {
|
|
tlsKeyFilename = utils.GetFilePath(tlsKeyFilename)
|
|
} else {
|
|
tlsKeyFilename = "./privkey.pem"
|
|
}
|
|
|
|
// Generate certificate if required
|
|
if !(utils.FileExists(tlsCertFilename) && utils.FileExists(tlsKeyFilename)) {
|
|
slog.Warn("Specified TLS certificate or private key do not exist", "certificate", tlsCertFilename, "tls-key", tlsKeyFilename)
|
|
utils.GenerateCerts(tlsCertFilename, tlsKeyFilename)
|
|
}
|
|
|
|
// Start server
|
|
svr := server.New(
|
|
logger,
|
|
bindAddress,
|
|
server.WithRouter(router.New(logger, database)),
|
|
)
|
|
|
|
svr.DisableTls(bindDisableTls)
|
|
svr.SetCertificate(tlsCertFilename)
|
|
svr.SetPrivateKey(tlsKeyFilename)
|
|
|
|
svr.StartAndWait()
|
|
}
|