// Command ratatoskr — оркестратор конвейера Ratatoskr (единый бинарь). // // Запуск: ratatoskr [-config config.yaml] // config.yaml ищется в CWD, по умолчанию — env/дефолты. package main import ( "context" "flag" "fmt" "log" "os" "github.com/kamelion/ratatoskr-go/internal/app" ) // version — версия бинаря, вшивается при сборке: // go build -ldflags "-X main.version=" // Локальная сборка без ldflags оставляет "dev". var version = "dev" // updateToken — токен read:package для авто-обновления, вшивается при сборке: // go build -ldflags "-X main.updateToken=" // Без ldflags — пустой; тогда используется update.token из конфига (если задан). var updateToken = "" // updateOwner — владелец Gitea-пакета (обычно git-юзер), вшивается при сборке: // go build -ldflags "-X main.updateOwner=kamelion" // Без ldflags — пустой; тогда используется update.owner из конфига (если задан). var updateOwner = "" func main() { cfg := flag.String("config", "", "путь к config.yaml (по умолчанию — CWD/config.yaml)") versionFlag := flag.Bool("version", false, "показать версию и выйти") flag.Parse() if *versionFlag { fmt.Println("ratatoskr-go " + version) return } a, err := app.New(*cfg, version, updateToken, updateOwner) if err != nil { log.Fatalf("app init: %v", err) } defer func() { if a.Store != nil { a.Store.Close() } }() // Применить отложенный свап обновления (из предыдущего /update на Windows // или отложенной замены), если есть .new рядом с бинарём. До старта подсистем. if a.Updater != nil { if err := a.Updater.ApplyPendingSwap(); err != nil { log.Printf("ratatoskr: apply-pending-swap: %v", err) } } log.Print("ratatoskr: запущен") if err := a.Run(context.Background()); err != nil { log.Fatalf("app run: %v", err) } log.Print("ratatoskr: остановлен") os.Exit(0) }