Files
website/app/cmd/server/main.go
jimmy 509e7ccb43 Add Technical Kiwi website with Go, templ, and HTMX.
Single-page site with gallery by album and event, contact form over SMTP,
Docker dev/prod setup, and on-server image derivatives. Gallery photos stay
local (app/images/ is gitignored).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-25 23:57:59 +12:00

69 lines
1.4 KiB
Go

package main
import (
"flag"
"log"
"net/http"
"os"
"path/filepath"
"technical.kiwi/website/internal/gallery"
"technical.kiwi/website/internal/handlers"
"technical.kiwi/website/internal/mail"
"technical.kiwi/website/internal/middleware"
)
func main() {
thumbsOnly := flag.Bool("thumbs", false, "generate gallery thumbnails and exit")
flag.Parse()
root, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
imagesDir := filepath.Join(root, "images")
staticDir := filepath.Join(root, "static")
if *thumbsOnly {
if err := gallery.EnsureThumbnails(imagesDir); err != nil {
log.Fatal(err)
}
log.Print("thumbnails generated")
return
}
var mailCfg *mail.Config
if mail.Enabled() {
cfg, err := mail.Load()
if err != nil {
log.Fatalf("smtp config: %v", err)
}
mailCfg = &cfg
log.Printf("contact form: smtp relay %s:%d → %s", cfg.Host, cfg.Port, cfg.To)
} else {
log.Print("contact form: disabled (set SMTP_HOST, SMTP_FROM, SMTP_TO to enable)")
}
srv, err := handlers.New(imagesDir, staticDir, mailCfg)
if err != nil {
log.Fatal(err)
}
mux := http.NewServeMux()
srv.RegisterRoutes(mux)
addr := envOr("ADDR", ":8080")
log.Printf("Technical Kiwi website listening on %s", addr)
if err := http.ListenAndServe(addr, middleware.Gzip(mux)); err != nil {
log.Fatal(err)
}
}
func envOr(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}