Node js http server that delivers geoip data

Node js http server that delivers geoip data via a web service. Once running, the server will output a JSON strong with the users city, state, country, etc. like this:

 "country_code": "US",
 "country_code3": "USA",
 "country_name": "United States",
 "region": "CA",
 "city": "Pleasanton",
 "latitude": 37.66239929199219,
 "longitude": -121.89630126953125,
 "metro_code": 807,
 "dma_code": 807,
 "area_code": 925,
 "continent_code": "NA"


  • The ip address is determined by looking at the following, stopping once one is found
    • ? the url
    • X-Forwarded-For HTTP header (for proxies). Supports multiple proxies.
    • IP address of the user via REMOTE_ADDR
  • callback=$functionName wrap the result in this callback function for jsonp.
  • indent=$numSpaces pretty print the output with this number of spaces. Ex. indent=2
  • The excellent node GeoIP library from kuno:
  • MaxMind's geoip city database, available here:
  • Optional: Forever, a utility to keep the service running in production.
  1. Install node.js -

  2. Install npm - (run the as root)

  3. Install the C api from maxmind. Recomend you use use a packagemanager of your choice for your OS instead of compile from source, such as sudo apt-get install geoip-database or sudo yum install GeoIP. Known to work with version 1.4.8

  4. Install dependencies for this project: npm install

  5. Download and gunzip the latest The default location $repo_root/GeoLiteCity.dat , if you put it somewhere else, specify --geodb when starting the service.

  6. Run this (from the root of the repo):

    curl -o GeoLiteCity.dat.gz\
    && gunzip GeoLiteCity.dat.gz

If you are using Forever (recommended): forever start -l forever.log -o out.log -e err.log app.js

If you aren't using Forever node app.js


  --port, -p      port to run the server on                      [default: 9042]
  --geodb, -g     path to the GeoLiteCity database from MaxMind  [default: "./GeoLiteCity.dat"]
  --help, -h, -?  this help message                              [default: false]

Maxmind updates their city database once a month. Grab the latest one and restart the service. Here's a cron that will do it once a month

42 0 13 * * cd /path/to/this/repo/ \
   && curl -o GeoLiteCity.dat.gz\
   && rm GeoLiteCity.dat\
   && gunzip GeoLiteCity.dat.gz\
   && forever restartall
  • Unit tests
  • Continuous integration testing with travis-ci
  • Automate the install process