Very nice writeup. For the GeoIP part, there are actually libraries that will load up the entire Maxmind database into memory. Though it bloats your node app's memory usage as you would expect, it's extremely fast and almost always worth it. We use this library:
https://github.com/kuno/GeoIP