mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 20:52:33 +02:00
126 lines
2.4 KiB
Go
Executable file
126 lines
2.4 KiB
Go
Executable file
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"runtime"
|
|
"sync"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var cfg Config
|
|
|
|
func main() {
|
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
|
|
args := getArgs()
|
|
|
|
logrus.SetFormatter(&logrus.TextFormatter{
|
|
ForceColors: true,
|
|
DisableColors: false,
|
|
FullTimestamp: true,
|
|
TimestampFormat: "01-02 15:04:05",
|
|
})
|
|
|
|
if args.Command == CommandReload {
|
|
err := utils.reloadServer()
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
cfg = NewConfig(configPath)
|
|
cfg.MustLoad()
|
|
|
|
if args.Command == CommandValidate {
|
|
logrus.Printf("config OK")
|
|
return
|
|
}
|
|
|
|
autoCertProvider, err := cfg.GetAutoCertProvider()
|
|
|
|
if err != nil {
|
|
aclog.Warn(err)
|
|
autoCertProvider = nil // TODO: remove, it is expected to be nil if error is not nil, but it is not for now
|
|
}
|
|
|
|
var proxyServer *Server
|
|
var panelServer *Server
|
|
|
|
if autoCertProvider != nil {
|
|
ok := autoCertProvider.LoadCert()
|
|
if !ok {
|
|
if ne := autoCertProvider.ObtainCert(); ne != nil {
|
|
aclog.Fatal(ne)
|
|
}
|
|
}
|
|
for name, expiry := range autoCertProvider.GetExpiries() {
|
|
aclog.Infof("certificate %q: expire on %v", name, expiry)
|
|
}
|
|
go autoCertProvider.ScheduleRenewal()
|
|
}
|
|
proxyServer = NewServer(ServerOptions{
|
|
Name: "proxy",
|
|
CertProvider: autoCertProvider,
|
|
HTTPAddr: ":80",
|
|
HTTPSAddr: ":443",
|
|
Handler: http.HandlerFunc(proxyHandler),
|
|
RedirectToHTTPS: cfg.Value().RedirectToHTTPS,
|
|
})
|
|
panelServer = NewServer(ServerOptions{
|
|
Name: "panel",
|
|
CertProvider: autoCertProvider,
|
|
HTTPAddr: ":8080",
|
|
HTTPSAddr: ":8443",
|
|
Handler: panelHandler,
|
|
RedirectToHTTPS: cfg.Value().RedirectToHTTPS,
|
|
})
|
|
|
|
proxyServer.Start()
|
|
panelServer.Start()
|
|
|
|
InitFSWatcher()
|
|
|
|
cfg.StartProviders()
|
|
cfg.WatchChanges()
|
|
|
|
sig := make(chan os.Signal, 1)
|
|
signal.Notify(sig, syscall.SIGINT)
|
|
signal.Notify(sig, syscall.SIGTERM)
|
|
signal.Notify(sig, syscall.SIGHUP)
|
|
|
|
<-sig
|
|
logrus.Info("shutting down")
|
|
done := make(chan struct{}, 1)
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(3)
|
|
|
|
go func() {
|
|
StopFSWatcher()
|
|
StopDockerWatcher()
|
|
cfg.StopProviders()
|
|
wg.Done()
|
|
}()
|
|
go func() {
|
|
panelServer.Stop()
|
|
proxyServer.Stop()
|
|
wg.Done()
|
|
}()
|
|
go func() {
|
|
wg.Wait()
|
|
close(done)
|
|
}()
|
|
|
|
select {
|
|
case <-done:
|
|
logrus.Info("shutdown complete")
|
|
case <-time.After(cfg.Value().TimeoutShutdown * time.Second):
|
|
logrus.Info("timeout waiting for shutdown")
|
|
}
|
|
}
|