docker fixes

This commit is contained in:
Ravi Prasad
2025-05-08 19:20:55 -05:00
parent 992ec88a41
commit 2ee23ad0f2
4 changed files with 79 additions and 59 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ RUN go mod download
COPY . . COPY . .
RUN go build -o /nba_go main.go RUN go build -o /nba_go .
# STEP 2 - final image # STEP 2 - final image
FROM debian:bullseye-slim FROM debian:bullseye-slim
+15 -10
View File
@@ -1,4 +1,5 @@
version: '3.8' version: '3.8'
services: services:
db-init: db-init:
build: build:
@@ -6,9 +7,17 @@ services:
dockerfile: Dockerfile dockerfile: Dockerfile
volumes: volumes:
- './data:/app/data' - './data:/app/data'
command: /nba_go import-data # now invoke your new subcommand
command: ["/nba_go", "import-data"]
restart: "no" # so it doesnt 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: networks:
- api.network - api.network
api1: api1:
env_file: .env env_file: .env
volumes: volumes:
@@ -19,9 +28,10 @@ services:
restart: always restart: always
depends_on: depends_on:
db-init: db-init:
condition: service_completed_successfully condition: service_healthy
networks: networks:
- api.network - api.network
api2: api2:
env_file: .env env_file: .env
volumes: volumes:
@@ -29,12 +39,9 @@ services:
build: . build: .
ports: ports:
- '5002:5000' - '5002:5000'
restart: always
depends_on:
db-init:
condition: service_completed_successfully
networks: networks:
- api.network - api.network
api3: api3:
env_file: .env env_file: .env
volumes: volumes:
@@ -42,12 +49,9 @@ services:
build: . build: .
ports: ports:
- '5003:5000' - '5003:5000'
restart: always
depends_on:
db-init:
condition: service_completed_successfully
networks: networks:
- api.network - api.network
nginx: nginx:
image: 'nginx:stable' image: 'nginx:stable'
volumes: volumes:
@@ -60,6 +64,7 @@ services:
- '8080:8080' - '8080:8080'
networks: networks:
- api.network - api.network
prometheus: prometheus:
image: 'prom/prometheus:latest' image: 'prom/prometheus:latest'
volumes: volumes:
+39
View File
@@ -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 20232025
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 20232025
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 20232024
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)
}
}
+24 -48
View File
@@ -13,6 +13,7 @@ import (
"context" "context"
"errors" "errors"
"log" "log"
"net/http"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
@@ -21,19 +22,31 @@ import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/adaptor" "github.com/gofiber/fiber/v2/middleware/adaptor"
"github.com/gofiber/fiber/v2/middleware/logger" "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/config"
"github.com/nprasad2077/NBA_Go/services"
"github.com/nprasad2077/NBA_Go/controllers" "github.com/nprasad2077/NBA_Go/controllers"
"github.com/nprasad2077/NBA_Go/routes" "github.com/nprasad2077/NBA_Go/routes"
"github.com/nprasad2077/NBA_Go/utils/middleware" "github.com/nprasad2077/NBA_Go/utils/middleware"
_ "github.com/nprasad2077/NBA_Go/docs" _ "github.com/nprasad2077/NBA_Go/docs"
fiberswagger "github.com/swaggo/fiber-swagger"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
) )
func main() { 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) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop() defer stop()
@@ -53,56 +66,19 @@ func main() {
app.Use(logger.New()) app.Use(logger.New())
app.Use(middleware.MetricsMiddleware()) app.Use(middleware.MetricsMiddleware())
// DB // DB connection
db := config.InitDB() db := config.InitDB()
/* ---------- PUBLIC ROUTES (no API key) ---------- */ /* ---------- PUBLIC ROUTES (no API key) ---------- */
app.Get("/metrics", adaptor.HTTPHandler(promhttp.Handler())) app.Get("/metrics", adaptor.HTTPHandler(promhttp.Handler()))
app.Get("/swagger/*", fiberswagger.WrapHandler) app.Get("/swagger/*", fiberswagger.WrapHandler)
controllers.RegisterKeyAdminRoutes(app, db) // guarded only by XAdminSecret controllers.RegisterKeyAdminRoutes(app, db)
/* ---------- PROTECTED ROUTES ---------- */ /* ---------- PROTECTED ROUTES ---------- */
app.Use(middleware.APIKeyAuth(db)) app.Use(middleware.APIKeyAuth(db))
routes.RegisterPlayerAdvancedRoutes(app, db) routes.RegisterPlayerAdvancedRoutes(app, db)
routes.RegisterPlayerTotalRoutes(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 ---------- */ /* ---------- START & SHUTDOWN ---------- */
go func() { go func() {
if err := app.Listen(":5000"); err != nil && !errors.Is(err, http.ErrServerClosed) { if err := app.Listen(":5000"); err != nil && !errors.Is(err, http.ErrServerClosed) {
@@ -110,9 +86,9 @@ func main() {
} }
}() }()
<-ctx.Done() // wait for SIGTERM/CTRLC <-ctx.Done()
stop() // stop receiving more signals stop()
log.Println("shutting down…") log.Println("shutting down…")
_ = app.Shutdown() // stop accepting new conns _ = app.Shutdown()
log.Println("bye") log.Println("bye")
} }