Node js http server that delivers geoip data
Switch branches/tags
Nothing to show
Clone or download
Latest commit 1d0bee7 Oct 25, 2012


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



  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]

Updating the database

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