package main import ( "log" "net/http" "os" "path/filepath" "time" "scout/internal/httpapi" "scout/internal/notify" "scout/internal/registry" "scout/internal/users" ) func main() { address := envOr("SCOUT_ADDR", ":8080") dataDir := envOr("SCOUT_DATA_DIR", "data") token := os.Getenv("SCOUT_DEVELOPER_TOKEN") logger := log.Default() store, err := registry.New(dataDir) if err != nil { logger.Fatal(err) } userStore, err := users.New(filepath.Join(dataDir, "users.json")) if err != nil { logger.Fatal(err) } if adminEmail := os.Getenv("SCOUT_ADMIN_EMAIL"); adminEmail != "" { if _, err := userStore.EnsureAdmin(adminEmail, os.Getenv("SCOUT_ADMIN_NAME"), os.Getenv("SCOUT_ADMIN_PASSWORD")); err != nil { logger.Fatal(err) } } server := &httpapi.Server{ Registry: store, DeveloperToken: token, MaxUploadBytes: 512 << 20, Users: userStore, Mailer: notify.NewFromEnv(logger), SessionDuration: 24 * time.Hour, Logger: logger, } logger.Printf("Scout 包服务端正在监听 %s,数据目录为 %s", address, dataDir) if token == "" { logger.Printf("未配置 SCOUT_DEVELOPER_TOKEN,上传需要开发者账户或管理员账户") } if os.Getenv("SCOUT_SMTP_HOST") == "" { logger.Printf("未配置 SMTP,邮箱通知将只记录日志") } if err := http.ListenAndServe(address, server.Handler()); err != nil { logger.Fatal(err) } } func envOr(name, fallback string) string { if value := os.Getenv(name); value != "" { return value } return fallback }