BrainMinder/cmd/web/main.go

93 lines
2.4 KiB
Go
Raw Normal View History

2024-08-22 10:13:16 +02:00
package main
import (
"encoding/gob"
"flag"
"fmt"
"log/slog"
"net/http"
"os"
"runtime/debug"
"brainminder.speedtech.it/internal/database"
"brainminder.speedtech.it/internal/env"
"brainminder.speedtech.it/internal/smtp"
"brainminder.speedtech.it/internal/version"
"github.com/gorilla/sessions"
"github.com/lmittmann/tint"
)
func main() {
gob.Register(map[string]any{})
logger := slog.New(tint.NewHandler(os.Stdout, &tint.Options{Level: slog.LevelDebug}))
err := run(logger)
if err != nil {
trace := string(debug.Stack())
logger.Error(err.Error(), "trace", trace)
os.Exit(1)
}
}
func run(logger *slog.Logger) error {
var cfg config
cfg.baseURL = env.GetString("BASE_URL", "http://localhost:4445")
cfg.httpPort = env.GetInt("HTTP_PORT", 4445)
cfg.cookie.secretKey = env.GetString("COOKIE_SECRET_KEY", `CHANGE_THIS_COOKIE_KEY`)
cfg.db.dsn = env.GetString("DB_DSN", "db.sqlite")
cfg.db.automigrate = env.GetBool("DB_AUTOMIGRATE", true)
cfg.session.secretKey = env.GetString("SESSION_SECRET_KEY", `CHANGE_THIS_SESSION_KEY`)
cfg.session.oldSecretKey = env.GetString("SESSION_OLD_SECRET_KEY", "")
cfg.smtp.host = env.GetString("SMTP_HOST", "example.smtp.host")
cfg.smtp.port = env.GetInt("SMTP_PORT", 25)
cfg.smtp.username = env.GetString("SMTP_USERNAME", "example_username")
cfg.smtp.password = env.GetString("SMTP_PASSWORD", "pa55word")
cfg.smtp.from = env.GetString("SMTP_FROM", "Example Name <no_reply@example.org>")
showVersion := flag.Bool("version", false, "display version and exit")
flag.Parse()
if *showVersion {
fmt.Printf("version: %s\n", version.Get())
return nil
}
db, err := database.New(cfg.db.dsn, cfg.db.automigrate)
if err != nil {
return err
}
defer db.Close()
mailer, err := smtp.NewMailer(cfg.smtp.host, cfg.smtp.port, cfg.smtp.username, cfg.smtp.password, cfg.smtp.from)
if err != nil {
return err
}
keyPairs := [][]byte{[]byte(cfg.session.secretKey), nil}
if cfg.session.oldSecretKey != "" {
keyPairs = append(keyPairs, []byte(cfg.session.oldSecretKey), nil)
}
sessionStore := sessions.NewCookieStore(keyPairs...)
sessionStore.Options = &sessions.Options{
HttpOnly: true,
MaxAge: 86400 * 7,
Path: "/",
SameSite: http.SameSiteLaxMode,
Secure: true,
}
app := &application{
config: cfg,
db: db,
logger: logger,
mailer: mailer,
sessionStore: sessionStore,
}
return app.serveHTTP()
}