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>
69 lines
1.4 KiB
Go
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
|
|
}
|