node_geoip_server

Node js http server that delivers geoip data

Usage no npm install needed!

<script type="module">
  import nodeGeoipServer from 'https://cdn.skypack.dev/node_geoip_server';
</script>

README

Overview

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"
}

Inputs:

  • The ip address is determined by looking at the following, stopping once one is found
    • ?ip=xxx.xxx.xxx.xxx in 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

Dependencies

Installation

  1. Install node.js - https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
  2. Install npm - http://npmjs.org/ (run the install.sh 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 http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz. The default location $repo_root/GeoLiteCity.dat , if you put it somewhere else, specify --geodb when starting the service. Run this (from the root of the repo)
curl -o GeoLiteCity.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz\
   && gunzip GeoLiteCity.dat.gz

Usage

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

Options:

  --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 http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz\
   && rm GeoLiteCity.dat\
   && gunzip GeoLiteCity.dat.gz\
   && forever restartall

TODO

  • Unit tests

License

BSD, see LICENSE