main.go 1.1 K raw
1
package main
2
3
import (
4
	"html/template"
5
	"log"
6
	"log/slog"
7
	"net/http"
8
	"os"
9
	"runtime"
10
	"time"
11
12
	_ "golang.org/x/crypto/x509roots/fallback"
13
)
14
15
func main() {
16
	loadDotEnv(".env")
17
18
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
19
20
	tmpl := template.Must(template.New("").ParseFS(appFS, "templates/*.html"))
21
	renderSlots := runtime.NumCPU()
22
	app := &App{
23
		Log:       logger,
24
		Templates: tmpl,
25
		BaseURL:   getenv("BASE_URL", "http://localhost:3000"),
26
		Cache:     newFeedCache(5*time.Minute, 512),
27
		Images:    newImageCache(10*time.Minute, 512),
28
		renderSem: make(chan struct{}, renderSlots),
29
	}
30
31
	addr := getenv("HOST", "0.0.0.0") + ":" + getenv("PORT", "3000")
32
	logger.Info("feeds server running", "addr", addr)
33
	srv := &http.Server{
34
		Addr:              addr,
35
		Handler:           limitInFlight(app.routes(), 300),
36
		ReadHeaderTimeout: 5 * time.Second,
37
		ReadTimeout:       10 * time.Second,
38
		WriteTimeout:      30 * time.Second,
39
		IdleTimeout:       60 * time.Second,
40
		MaxHeaderBytes:    1 << 16,
41
	}
42
	if err := srv.ListenAndServe(); err != nil {
43
		log.Fatal(err)
44
	}
45
}