160 lines
3.6 KiB
Go
160 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"log"
|
|
"log/slog"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"keikos.work/app"
|
|
"keikos.work/assets"
|
|
)
|
|
|
|
var (
|
|
port uint = 8080
|
|
dev bool = false
|
|
|
|
webFlags *flag.FlagSet = nil
|
|
adminFlags *flag.FlagSet = nil
|
|
|
|
minioAccessKeyID = os.Getenv("AWS_ACCESS_KEY_ID")
|
|
minioSecretAccessKey = os.Getenv("AWS_SECRET_ACCESS_KEY")
|
|
minioEndpoint = os.Getenv("AWS_ENDPOINT_URL")
|
|
minioSSL = false
|
|
)
|
|
|
|
func init() {
|
|
webFlags = flag.NewFlagSet("web", flag.ExitOnError)
|
|
|
|
webFlags.UintVar(&port, "port", 8080, "The port to be used")
|
|
webFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
|
|
|
|
webFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
|
|
webFlags.StringVar(
|
|
&minioSecretAccessKey,
|
|
"aws-access-key-secret",
|
|
os.Getenv("AWS_SECRET_ACCESS_KEY"),
|
|
"",
|
|
)
|
|
webFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
|
|
webFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
|
|
}
|
|
|
|
func init() {
|
|
adminFlags = flag.NewFlagSet("admin", flag.ExitOnError)
|
|
|
|
adminFlags.UintVar(&port, "port", 8080, "The port to be used")
|
|
adminFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
|
|
|
|
adminFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
|
|
adminFlags.StringVar(
|
|
&minioSecretAccessKey,
|
|
"aws-access-key-secret",
|
|
os.Getenv("AWS_SECRET_ACCESS_KEY"),
|
|
"",
|
|
)
|
|
adminFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
|
|
adminFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
log.Fatalf("Expected 'web' or 'admin' subcommands")
|
|
}
|
|
|
|
/* s3, err := minio.New(minioEndpoint, &minio.Options{
|
|
Creds: credentials.NewStaticV4(minioAccessKeyID, minioSecretAccessKey, ""),
|
|
Secure: minioSSL,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
} */
|
|
|
|
var a app.App
|
|
var l *slog.Logger
|
|
|
|
switch os.Args[1] {
|
|
case "web":
|
|
webFlags.Parse(os.Args[2:])
|
|
|
|
var level slog.Leveler
|
|
if dev {
|
|
level = slog.LevelDebug
|
|
} else {
|
|
level = slog.LevelInfo
|
|
}
|
|
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
|
|
|
|
var assetsHandler http.Handler
|
|
if dev {
|
|
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
|
|
} else {
|
|
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
|
|
}
|
|
|
|
a = app.NewWeb(app.Options{
|
|
Port: port,
|
|
Development: dev,
|
|
Log: l,
|
|
|
|
S3: nil,
|
|
|
|
Assets: assetsHandler,
|
|
})
|
|
case "admin":
|
|
adminFlags.Parse(os.Args[2:])
|
|
|
|
var level slog.Leveler
|
|
if dev {
|
|
level = slog.LevelDebug
|
|
} else {
|
|
level = slog.LevelInfo
|
|
}
|
|
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
|
|
|
|
var assetsHandler http.Handler
|
|
if dev {
|
|
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
|
|
} else {
|
|
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
|
|
}
|
|
|
|
a = app.NewAdmin(app.Options{
|
|
Port: port,
|
|
Development: dev,
|
|
Log: l,
|
|
|
|
S3: nil,
|
|
|
|
Assets: assetsHandler,
|
|
})
|
|
default:
|
|
log.Fatalf("Command %q is not available", os.Args[1])
|
|
}
|
|
|
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
if dev {
|
|
l.Info("RUNNING IN DEVELOPMENT MODE")
|
|
}
|
|
|
|
go func() {
|
|
if err := a.Start(); err != nil {
|
|
l.Error("Failed to start server", slog.String("error", err.Error()))
|
|
}
|
|
}()
|
|
|
|
<-ctx.Done()
|
|
l.Info("Shutting down")
|
|
if err := a.Stop(); err != nil {
|
|
l.Error("Failed to shut down", slog.String("error", err.Error()))
|
|
}
|
|
|
|
l.Info("FINAL")
|
|
}
|