From 2ee23ad0f210efec17f7d2b00049561ca6d6010b Mon Sep 17 00:00:00 2001 From: Ravi Prasad Date: Thu, 8 May 2025 19:20:55 -0500 Subject: [PATCH] docker fixes --- Dockerfile | 2 +- docker-compose.yml | 25 +++++++++------- import.go | 39 +++++++++++++++++++++++++ main.go | 72 ++++++++++++++++------------------------------ 4 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 import.go diff --git a/Dockerfile b/Dockerfile index 868fa29..2aeeeca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN go mod download COPY . . -RUN go build -o /nba_go main.go +RUN go build -o /nba_go . # STEP 2 - final image FROM debian:bullseye-slim diff --git a/docker-compose.yml b/docker-compose.yml index 93c6034..0f615da 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,5 @@ version: '3.8' + services: db-init: build: @@ -6,9 +7,17 @@ services: dockerfile: Dockerfile volumes: - './data:/app/data' - command: /nba_go import-data + # now invoke your new subcommand + command: ["/nba_go", "import-data"] + restart: "no" # so it doesn’t keep trying forever + healthcheck: # optional: mark healthy when the DB file exists + test: ["CMD", "test", "-f", "/app/data/nba.db"] + interval: 10s + timeout: 5s + retries: 3 networks: - api.network + api1: env_file: .env volumes: @@ -19,9 +28,10 @@ services: restart: always depends_on: db-init: - condition: service_completed_successfully + condition: service_healthy networks: - api.network + api2: env_file: .env volumes: @@ -29,12 +39,9 @@ services: build: . ports: - '5002:5000' - restart: always - depends_on: - db-init: - condition: service_completed_successfully networks: - api.network + api3: env_file: .env volumes: @@ -42,12 +49,9 @@ services: build: . ports: - '5003:5000' - restart: always - depends_on: - db-init: - condition: service_completed_successfully networks: - api.network + nginx: image: 'nginx:stable' volumes: @@ -60,6 +64,7 @@ services: - '8080:8080' networks: - api.network + prometheus: image: 'prom/prometheus:latest' volumes: diff --git a/import.go b/import.go new file mode 100644 index 0000000..3bf396d --- /dev/null +++ b/import.go @@ -0,0 +1,39 @@ +package main + +import ( + "log" + "time" + + "gorm.io/gorm" + "github.com/nprasad2077/NBA_Go/services" +) + +// importPlayerAdvanced fetches and stores advanced stats for seasons 2023–2025 +func importPlayerAdvanced(db *gorm.DB) { + for season := 2023; season <= 2025; season++ { + if err := services.FetchAndStorePlayerAdvancedStats(db, season); err != nil { + log.Printf("advanced import failed for %d: %v", season, err) + } + time.Sleep(1100 * time.Millisecond) + } +} + +// importPlayerTotals fetches and stores regular-season total stats for seasons 2023–2025 +func importPlayerTotals(db *gorm.DB) { + for season := 2023; season <= 2025; season++ { + if err := services.FetchAndStorePlayerTotalStats(db, season, false); err != nil { + log.Printf("totals import failed for %d: %v", season, err) + } + time.Sleep(1000 * time.Millisecond) + } +} + +// importPlayerPlayoffs fetches and stores playoff total stats for seasons 2023–2024 +func importPlayerPlayoffs(db *gorm.DB) { + for season := 2023; season <= 2024; season++ { + if err := services.FetchAndStorePlayerTotalPlayoffsStats(db, season, true); err != nil { + log.Printf("playoffs import failed for %d: %v", season, err) + } + time.Sleep(1500 * time.Millisecond) + } +} diff --git a/main.go b/main.go index 474069c..b0e09fc 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,7 @@ import ( "context" "errors" "log" + "net/http" "os" "os/signal" "syscall" @@ -21,19 +22,31 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/adaptor" "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/prometheus/client_golang/prometheus/promhttp" + fiberswagger "github.com/swaggo/fiber-swagger" + "github.com/nprasad2077/NBA_Go/config" - "github.com/nprasad2077/NBA_Go/services" "github.com/nprasad2077/NBA_Go/controllers" "github.com/nprasad2077/NBA_Go/routes" "github.com/nprasad2077/NBA_Go/utils/middleware" _ "github.com/nprasad2077/NBA_Go/docs" - fiberswagger "github.com/swaggo/fiber-swagger" - "github.com/prometheus/client_golang/prometheus/promhttp" - "net/http" ) func main() { - // graceful shutdown context + // ——— One-off import-data mode ——— + if len(os.Args) > 1 && os.Args[1] == "import-data" { + db := config.InitDB() + importPlayerAdvanced(db) + log.Println("🎉 Player Advanced Import completed successfully") + importPlayerTotals(db) + log.Println("🎉 Player Totals Import completed successfully") + importPlayerPlayoffs(db) + log.Println("🎉 Player Totals Playoffs Import completed successfully") + log.Println("🎉 Import completed successfully") + return + } + + // gracefull shutdown context ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() @@ -53,56 +66,19 @@ func main() { app.Use(logger.New()) app.Use(middleware.MetricsMiddleware()) - // DB + // DB connection db := config.InitDB() /* ---------- PUBLIC ROUTES (no API key) ---------- */ app.Get("/metrics", adaptor.HTTPHandler(promhttp.Handler())) app.Get("/swagger/*", fiberswagger.WrapHandler) - controllers.RegisterKeyAdminRoutes(app, db) // guarded only by X‑Admin‑Secret + controllers.RegisterKeyAdminRoutes(app, db) /* ---------- PROTECTED ROUTES ---------- */ app.Use(middleware.APIKeyAuth(db)) routes.RegisterPlayerAdvancedRoutes(app, db) routes.RegisterPlayerTotalRoutes(app, db) - /* ---------- Optional import job ---------- */ - go func() { - for season := 2023; season <= 2025; season++ { - if err := services.FetchAndStorePlayerAdvancedStats(db, season); err != nil { - log.Printf("Fetch failed for player advanced season %d: %v\n", season, err) - } else { - log.Printf("Fetch successful for player advanced season %d\n", season) - } - time.Sleep(1100 * time.Millisecond) // optional delay - } - log.Printf("player advanced Import Success") - }() - - go func() { - for season := 2023; season <= 2025; season++ { - if err := services.FetchAndStorePlayerTotalStats(db, season, false); err != nil { - log.Printf("Fetch failed for player totals season %d: %v\n", season, err) - } else { - log.Printf("Fetch successful for player totals season %d\n", season) - } - time.Sleep(1000 * time.Millisecond) // optional delay - } - log.Printf("player totals Import Success") - }() - - go func() { - for season := 2023; season <= 2024; season++ { - if err := services.FetchAndStorePlayerTotalPlayoffsStats(db, season, true); err != nil { - log.Printf("Fetch failed for player totals Playoffs season %d: %v\n", season, err) - } else { - log.Printf("Fetch successful for player totals Playoffs season %d\n", season) - } - time.Sleep(1500 * time.Millisecond) // optional delay - } - log.Printf("player totals Playoffs Import Success") - }() - /* ---------- START & SHUTDOWN ---------- */ go func() { if err := app.Listen(":5000"); err != nil && !errors.Is(err, http.ErrServerClosed) { @@ -110,9 +86,9 @@ func main() { } }() - <-ctx.Done() // wait for SIGTERM/CTRL‑C - stop() // stop receiving more signals + <-ctx.Done() + stop() log.Println("shutting down…") - _ = app.Shutdown() // stop accepting new conns + _ = app.Shutdown() log.Println("bye") -} +} \ No newline at end of file