DB 적재 초기구조

This commit is contained in:
Lectom C Han
2025-12-09 13:51:25 +09:00
parent fa1a7a057e
commit ecaca02400
11 changed files with 498 additions and 73 deletions

View File

@@ -1,7 +1,9 @@
package main
import (
"errors"
"log"
"net/url"
"os"
"github.com/gofiber/fiber/v2"
@@ -15,12 +17,20 @@ const (
)
func main() {
backend := geo.Backend(env("GEOIP_BACKEND", string(geo.BackendMMDB)))
dbPath := env("GEOIP_DB_PATH", defaultDBPath)
dbURL := os.Getenv("DATABASE_URL")
lookupQuery := os.Getenv("GEOIP_LOOKUP_QUERY")
port := env("PORT", defaultPort)
resolver, err := geo.NewResolver(dbPath)
resolver, err := geo.NewResolver(geo.Config{
Backend: backend,
MMDBPath: dbPath,
DatabaseURL: dbURL,
LookupQuery: lookupQuery,
})
if err != nil {
log.Fatalf("failed to open GeoIP database: %v", err)
log.Fatalf("failed to initialize resolver: %v", err)
}
defer resolver.Close()
@@ -50,21 +60,33 @@ func main() {
location, err := resolver.Lookup(ip)
if err != nil {
if err == geo.ErrInvalidIP {
switch {
case errors.Is(err, geo.ErrInvalidIP):
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "invalid ip address",
})
case errors.Is(err, geo.ErrNotFound):
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"error": "location not found",
})
default:
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "lookup failed",
})
}
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "lookup failed",
})
}
return c.JSON(location)
})
log.Printf("starting GeoIP API on :%s using %s", port, dbPath)
log.Printf("starting GeoIP API on :%s backend=%s", port, backend)
switch backend {
case geo.BackendPostgres:
log.Printf("using postgres DSN %s", sanitizeDBURL(dbURL))
default:
log.Printf("using mmdb path %s", dbPath)
}
if err := app.Listen(":" + port); err != nil {
log.Fatalf("server stopped: %v", err)
}
@@ -76,3 +98,11 @@ func env(key, fallback string) string {
}
return fallback
}
func sanitizeDBURL(raw string) string {
u, err := url.Parse(raw)
if err != nil {
return "postgres"
}
return u.Redacted()
}