-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
106 lines (90 loc) · 2.44 KB
/
Copy pathmain.go
File metadata and controls
106 lines (90 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"bufio"
"embed"
"flag"
"fmt"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
storepkg "filesearch/store"
)
//go:embed static
var staticFS embed.FS
func init() {
// Load .env file if it exists (lightweight, no external dependency)
loadEnvFile(".env")
}
// loadEnvFile reads a .env file and sets environment variables.
// Lines starting with # are comments. Format: KEY=VALUE
func loadEnvFile(path string) {
f, err := os.Open(path)
if err != nil {
return // .env file is optional
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
parts := strings.SplitN(line, "=", 2)
if len(parts) != 2 {
continue
}
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Don't override existing env vars
if os.Getenv(key) == "" {
os.Setenv(key, value)
}
}
}
func main() {
port := flag.String("port", "8080", "port to listen on")
flag.Parse()
if p := os.Getenv("PORT"); p != "" {
*port = p
}
host := os.Getenv("HOST")
if host == "" {
host = "0.0.0.0"
}
tlsCert := os.Getenv("TLS_CERT")
tlsKey := os.Getenv("TLS_KEY")
// Memory budget (default: 100MB, threshold: 80%)
maxMemMB := int64(100)
if m := os.Getenv("MAX_MEMORY_MB"); m != "" {
if v, err := strconv.ParseInt(m, 10, 64); err == nil && v > 0 {
maxMemMB = v
}
}
budget := storepkg.NewMemoryBudget(maxMemMB, 0.80)
// Session TTL (default: 48 hours)
ttlHours := 48
if t := os.Getenv("SESSION_TTL_HOURS"); t != "" {
if v, err := strconv.Atoi(t); err == nil && v > 0 {
ttlHours = v
}
}
mgr := storepkg.NewManager(budget)
// Start background janitor — check every 30 min, evict sessions inactive > TTL
mgr.StartJanitor(30*time.Minute, time.Duration(ttlHours)*time.Hour)
mux := http.NewServeMux()
registerRoutes(mux, mgr)
addr := host + ":" + *port
handler := corsMiddleware(mux)
fmt.Printf("📊 Memory budget: %dMB (threshold: 80%%), session TTL: %dh\n", maxMemMB, ttlHours)
if tlsCert != "" && tlsKey != "" {
fmt.Printf("🔒 MultipChecker running (HTTPS) → https://localhost:%s\n", *port)
log.Fatal(http.ListenAndServeTLS(addr, tlsCert, tlsKey, handler))
} else {
fmt.Printf("🔓 MultipChecker running (HTTP) → http://localhost:%s\n", *port)
fmt.Println(" Set TLS_CERT and TLS_KEY env vars to enable HTTPS encryption")
log.Fatal(http.ListenAndServe(addr, handler))
}
}