Files
dokku-ui/internal/server/server.go
2023-04-25 14:33:14 +08:00

76 lines
1.9 KiB
Go

package server
import (
"fmt"
"github.com/labstack/echo/v4"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/server/api"
"gitlab.com/texm/shokku/internal/server/commands"
"gitlab.com/texm/shokku/internal/server/db"
"gitlab.com/texm/shokku/internal/server/dokku"
"gitlab.com/texm/shokku/internal/server/middleware"
"io/fs"
"time"
)
func New(cfg Config, appFS fs.FS) (*env.Env, error) {
e := env.New(cfg.DebugMode)
e.Router = initRouter(cfg.DebugMode, appFS)
dbSess, dbErr := db.Init(cfg.DBPath)
if dbErr != nil {
return nil, fmt.Errorf("failed to init db: %w", dbErr)
}
e.DB = dbSess
serverSecrets, secretsErr := getServerSecrets(e.DB)
if secretsErr != nil {
return nil, fmt.Errorf("failed to get server secrets: %w", secretsErr)
}
dokkuCfg := dokku.Config{
DebugMode: cfg.DebugMode,
PrivateKey: serverSecrets.privKey,
Host: cfg.DokkuSSHHost,
Port: cfg.DokkuSSHPort,
}
dokkuClient, dokkuErr := dokku.Init(dokkuCfg)
if dokkuErr != nil {
return nil, fmt.Errorf("failed to init dokku client: %w", dokkuErr)
}
e.Dokku = dokkuClient
serverState, stateErr := initServerState(e)
if stateErr != nil {
return nil, fmt.Errorf("failed to get setup state: %w", stateErr)
}
authCfg := initAuthConfig{
SigningKey: serverSecrets.signingKey,
TokenLifetime: time.Minute * time.Duration(cfg.AuthTokenLifetimeMinutes),
Method: serverState.AuthMethod,
DebugMode: cfg.DebugMode,
IsSetup: serverState.IsSetup,
}
authn, authErr := initAuthenticator(authCfg)
if authErr != nil {
return nil, fmt.Errorf("failed to init authenticator: %w", authErr)
}
e.Auth = authn
if !e.SetupCompleted {
e.Router.Use(middleware.ServerSetupBlocker(e, serverState.SetupKey))
}
api.RegisterRoutes(e, []echo.MiddlewareFunc{
middleware.TokenAuth(e),
middleware.ProvideUserContext(e),
})
dokku.SyncState(e)
go commands.PollStatuses()
return e, nil
}