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>
This commit is contained in:
68
app/cmd/server/main.go
Normal file
68
app/cmd/server/main.go
Normal file
@@ -0,0 +1,68 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user