mirror of
https://github.com/nprasad2077/NBA_Go.git
synced 2026-09-22 14:05:13 +00:00
docker fixes
This commit is contained in:
+1
-1
@@ -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
@@ -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 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:
|
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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 X‑Admin‑Secret
|
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/CTRL‑C
|
<-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")
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user