81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"path/filepath"
|
|
|
|
"greencoast/internal/api"
|
|
"greencoast/internal/config"
|
|
"greencoast/internal/federation"
|
|
"greencoast/internal/index"
|
|
"greencoast/internal/storage"
|
|
)
|
|
|
|
func main() {
|
|
cfgPath := flag.String("config", "shard.yaml", "path to config")
|
|
flag.Parse()
|
|
|
|
cfg, err := config.Load(*cfgPath)
|
|
if err != nil {
|
|
log.Fatalf("config error: %v", err)
|
|
}
|
|
|
|
store, err := storage.NewFSStore(cfg.Storage.Path, cfg.Storage.MaxObjectKB)
|
|
if err != nil {
|
|
log.Fatalf("storage error: %v", err)
|
|
}
|
|
|
|
dataRoot := filepath.Dir(cfg.Storage.Path)
|
|
idx := index.New(dataRoot)
|
|
|
|
srv := api.New(
|
|
store, idx,
|
|
cfg.Privacy.RetainTimestamps == "coarse",
|
|
cfg.Security.ZeroTrust,
|
|
api.AuthProviders{
|
|
SigningSecretHex: cfg.Auth.SigningSecret,
|
|
Discord: api.DiscordProvider{
|
|
Enabled: cfg.Auth.SSO.Discord.Enabled,
|
|
ClientID: cfg.Auth.SSO.Discord.ClientID,
|
|
ClientSecret: cfg.Auth.SSO.Discord.ClientSecret,
|
|
RedirectURI: cfg.Auth.SSO.Discord.RedirectURI,
|
|
},
|
|
GoogleEnabled: cfg.Auth.SSO.Google.Enabled,
|
|
FacebookEnabled: cfg.Auth.SSO.Facebook.Enabled,
|
|
WebAuthnEnabled: cfg.Auth.TwoFactor.WebAuthnEnabled,
|
|
TOTPEnabled: cfg.Auth.TwoFactor.TOTPEnabled,
|
|
},
|
|
)
|
|
|
|
// Serve the client if enabled
|
|
if cfg.UI.Enable {
|
|
srv.MountStatic(cfg.UI.Path, cfg.UI.BaseURL)
|
|
}
|
|
|
|
// listeners
|
|
if cfg.Listen.HTTP != "" {
|
|
go func() { log.Fatal(srv.ListenHTTP(cfg.Listen.HTTP)) }()
|
|
}
|
|
if cfg.TLS.Enable && cfg.Listen.HTTPS != "" {
|
|
go func() { log.Fatal(srv.ListenHTTPS(cfg.Listen.HTTPS, cfg.TLS.CertFile, cfg.TLS.KeyFile)) }()
|
|
}
|
|
if cfg.Federation.MTLSEnable {
|
|
tlsCfg, err := federation.ServerTLSConfig(cfg.Federation.CertFile, cfg.Federation.KeyFile, cfg.Federation.ClientCAFile)
|
|
if err != nil {
|
|
log.Fatalf("federation tls config error: %v", err)
|
|
}
|
|
go func() { log.Fatal(srv.ListenMTLS(cfg.Federation.Listen, tlsCfg)) }()
|
|
}
|
|
|
|
// foreground
|
|
if cfg.TLS.Enable && cfg.Listen.HTTPS != "" {
|
|
log.Fatal(srv.ListenHTTPS(cfg.Listen.HTTPS, cfg.TLS.CertFile, cfg.TLS.KeyFile))
|
|
return
|
|
}
|
|
if cfg.Listen.HTTP == "" {
|
|
log.Fatal("no listeners configured (set listen.http or listen.https)")
|
|
}
|
|
log.Fatal(srv.ListenHTTP(cfg.Listen.HTTP))
|
|
}
|