simple geo ip server

This commit is contained in:
Lectom C Han
2025-12-05 17:40:46 +09:00
commit 5d0221f67d
12 changed files with 418 additions and 0 deletions

68
cmd/server/main.go Normal file
View File

@@ -0,0 +1,68 @@
package main
import (
"log"
"os"
"github.com/gofiber/fiber/v2"
"geoip-rest/internal/geo"
)
const (
defaultPort = "8080"
defaultDBPath = "/data/GeoLite2-City.mmdb"
)
func main() {
dbPath := env("GEOIP_DB_PATH", defaultDBPath)
port := env("PORT", defaultPort)
resolver, err := geo.NewResolver(dbPath)
if err != nil {
log.Fatalf("failed to open GeoIP database: %v", err)
}
defer resolver.Close()
app := fiber.New(fiber.Config{
DisableStartupMessage: true,
})
app.Get("/health", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"status": "ok"})
})
app.Get("/lookup", func(c *fiber.Ctx) error {
ip := c.Query("ip")
if ip == "" {
ip = c.IP()
}
location, err := resolver.Lookup(ip)
if err != nil {
if err == geo.ErrInvalidIP {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "invalid ip address",
})
}
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)
if err := app.Listen(":" + port); err != nil {
log.Fatalf("server stopped: %v", err)
}
}
func env(key, fallback string) string {
if val := os.Getenv(key); val != "" {
return val
}
return fallback
}