package main import ( "log" "net/http" "os" "os/signal" "syscall" ) func main() { s := NewStore() // Boot: restore from latest cold snapshot, if any. if path := os.Getenv("POSTS_COLD_PATH"); path != "" { s.flushPath = path } if loaded, err := s.RestoreFromLatest(s.flushPath); err != nil { log.Fatalf("restore failed: %v", err) } else if loaded != "" { log.Printf("restored from %s", loaded) } srv := NewServer(s) // SIGTERM handler: cancel the flush context so the flush goroutine runs // its final flush before exit. Per Q6 D-cadence. go func() { sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT) <-sig log.Printf("shutdown signal received, flushing...") ShutdownFlush() if err := s.FlushNow(); err != nil { log.Printf("final flush error: %v", err) } os.Exit(0) }() restAddr := os.Getenv("ADDR") if restAddr == "" { restAddr = ":8310" } log.Printf("posts listening on %s (cold=%s)", restAddr, s.flushPath) if err := http.ListenAndServe(restAddr, srv.Routes()); err != nil { log.Fatal(err) } }