DEV Community

Cover image for NextJs, Docker and IP Geolocation
Jorge
Jorge

Posted on

1

NextJs, Docker and IP Geolocation

These days, I've been working on a solution that would allow us to geolocate users through their IP address, with our NextJs project hosted on AWS ECS in a Docker container.

With the primary focus on geolocating users through their IP address, other challenges emerged, which I will enumerate.

1. AVOIDING THIRD-PARTY CALLS

This point was important because, although there is a wide catalog of services (many free of charge) that offer IP geolocation, I didn't want to depend on a third-party call if possible.

During my research, I found several services that allow you to download a binary file with the ".mmdb" extension, which is the actual database we can use to geolocate IPs.

After completing the investigation I opted for Maxmind. They have many options through which you can download the binary database but I decided to use the geoipupdate automation they offer in their documentation. This allows you to automate the process of downloading and updating the .mmdb file.

2. PROTECTING LOGIC FROM CLIENT-SIDE

Another key aspect was to leverage Next.js's server-side capabilities to avoid exposing logic on the client side. In current versions, this can be done by either generating a "route handler" or using a "server action". For versions prior to 13, we would need to create our own "API route".

To obtain our users' IP on the server side, we only need the req.headers['x-forwarded-for'] header provided by Next.js. Once we capture their IP, we'll search for its origin in our file using the mmdb-lib node package.

3. PERIODIC AUTOMATIC DATABASE SYNCHRONIZATION

The Maxmind geoipupdate integration was extremely helpful for this purpose. This integration automatically manages the download and update of the file with minimal configuration, requiring only your credentials to be provided.

The main problem I encountered was that within a node:alpine Docker container, I couldn't execute cron jobs with a user other than root. I resolved this by using supercronic, a tool optimized for running your cron jobs inside Docker images. Additionally, it's worth nothing that this tool facilitates the visualization of logs about how the process targeted by the crontab has progressed.

Once this was resolved, I managed to keep a cron job running in the background within the Docker container where my Next.js project is deployed. This cron job periodically checks and updates my binary database file stored within the container's own file system.

FINAL NOTES

In order to have a guide where part of this process can be visualized, I have generated a pre-configured template. In it, we can verify the functionality and observe the minimum necessary configuration:

Visit my template on Github

Octocat and Groot reading a newspaper

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay