package main import ( "context" "database/sql" "net/http" "net/url" "os" "os/signal" "syscall" _ "github.com/lib/pq" log "github.com/nacorid/logger" "github.com/nacorid/naco-api/internal/activitypub" "github.com/nacorid/naco-api/internal/bluesky" "github.com/nacorid/naco-api/internal/config" "github.com/nacorid/naco-api/internal/ollama" "github.com/nacorid/naco-api/internal/server" "github.com/nacorid/naco-api/internal/store" ) func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() cfg := config.Load() log.Init(log.Config{ LogFilePath: cfg.LogFile, ConsoleLevel: log.LevelDebug, FileLevel: log.LevelTrace, }) conn, err := sql.Open("postgres", cfg.DatabaseURL) if err != nil { log.Fatalf("Failed to connect to database: %v", err) } defer conn.Close() db := store.New(conn) bskyClient, err := bluesky.NewBlueskyClient(ctx, cfg.BlueskyDID, cfg.BlueskyAppPassword, cfg.BlueskyHost) if err != nil { log.Fatal("Failed to create bluesky client", "error", err) } uri, err := url.Parse(cfg.OllamaHost) if err != nil { log.Fatal("Invalid OLLAMA_HOST URL", "error", err) } ollamaClient := ollama.New(ctx, uri, http.DefaultClient) apClient, err := activitypub.NewAPClient(ctx, cfg.ActivityPubHost, cfg.ActivityPubToken) if err != nil { log.Fatal("Failed to create activitypub client", "error", err) } srv := server.New(ctx, db, apClient, bskyClient, ollamaClient, cfg) go func() { log.Info("Server starting", "address", cfg.ListenAddress) if err := srv.Start(); err != http.ErrServerClosed { log.Fatal("HTTP server error", "error", err) } }() stopChan := make(chan os.Signal, 1) signal.Notify(stopChan, syscall.SIGINT, syscall.SIGTERM) <-stopChan log.Info("Shutting down server...") }