How to Automate MaxMind Database Downloads Within a Go Project

MaxMind's GeoIP databases are a valuable resource for obtaining accurate geolocation data in applications. However, integrating their database management can be challenging, especially when end users need to manage a separate application alongside your own project. This blog post explores a sophisticated approach to seamlessly incorporate MaxMind's GeoIP database handling directly into your Go project, ensuring a more streamlined and user-friendly experience.

One advantage lies in MaxMind's geoipupdate project, which is written in Go and can be utilized as a library. However, the official documentation on using it as a library leaves much to be desired. Delving into their cmd/geoipupdate directory, we can uncover insights on how to effectively integrate it into our own applications.

A notable hurdle with the provided library is its reliance on an external configuration file. This can add complexity during deployment, necessitating an additional config file for users to manage. To circumvent this, I propose an elegant solution: crafting the Config object manually.

Here's what the resulting code looks like:

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/maxmind/geoipupdate/v6/pkg/geoipupdate"
)

func main() {
	client := geoipupdate.NewClient(&geoipupdate.Config{
		AccountID:         YOUR_ACCOUNT_ID,
		DatabaseDirectory: "maxmind",
		EditionIDs:        []string{"GeoLite2-City", "GeoLite2-ASN"},
		LicenseKey:        "YOUR_LICENSE_KEY",
		LockFile:          "maxmind/.geoipupdate.lock",
		Parallelism:       1,
		RetryFor:          5 * time.Minute,
		URL:               "https://updates.maxmind.com",
	})

	if err := client.Run(context.Background()); err != nil {
		log.Fatalf("Error retrieving updates: %s", err)
	}

	fmt.Println("MaxMind databases downloaded successfully.")
}

Make sure to replace the YOUR_ACCOUNT_ID and YOUR_LICENSE_KEY text with your own values from MaxMind. Also remember to swap out the DatabaseDirectory and LockFile directives with your own.