Panthro: the rubygems proxy cache
!!! This project is a toy, is not usable for serious !!! The idea is to speed up the gem command caching gem and spec files. Rubygems proxy cache Is a rack app that cache static files into a local machine, where is runing. Is does not cache /api calls.
Install
gem install panthro
panthro --start
Once is running you have to point rubygems to this new "mirror"
gem sources --add http://localhost:9292
And remove rubygems mirror:
gem sources --remove https://rubygems.org
Then you can start installing gems, and static files like *.gem *.spec.gz will be cached in ~/.panthro folder.
How it works
When you execute for example gem install sinatra
the firsts 2 calls are:
HEAD https://index.rubygems.org/versions
200 OK
GET https://index.rubygems.org/info/sinatra
to get the dependencies of sinatra, then it needs to get the file
sinatra-4.0.0.gemspec.rz and so, you can see the details runing:
gem install sinatra --verbose
The first time that you execute this it will download all the files
from rubygems and saved them into the ~/.panthro folder but if you
run gem install sinatra
again from the other machine in the
same net ( obviously you have to add the source with
gem sources --add http://the-proxy-ip:9292 ), it will do all the
https://index.rubygems.org/quick/Marshal.4.8/ again, but only these, because it already has
all the other files cached:
sinatra-4.0.0.gem
tilt-2.4.0.gem
rack-session-2.0.0.gem
rack-protection-4.0.0.gem
mustermann-3.0.3.gem
You can use rumb to test the performance agaisnt using rubygems.org directly:
gem install rumb
rumb rails http://localhost:9292 https://rubygems.org
###--------- RUMB Rubygems Mirror Benchmarks -------------###
=> Removing https://rubygems.org from rubygems sources...
https://rubygems.org removed from sources
=> Adding http://localhost:9292 to sources
http://localhost:9292 added to sources
=> Starting installing sinatra from: http://localhost:9292
Fetching: rack-1.6.0.gem (227328B)
Successfully installed rack-1.6.0
Fetching: tilt-1.4.1.gem (42496B)
Successfully installed tilt-1.4.1
Fetching: rack-protection-1.5.3.gem (18432B)
Successfully installed rack-protection-1.5.3
Fetching: sinatra-1.4.5.gem (346624B)
Successfully installed sinatra-1.4.5
4 gems installed
### --- BENCHMARK RESULTS FOR http://localhost:9292 --- ###
0.000000 0.000000 1.360000 ( 5.212372)
=> Removing http://localhost:9292 from rubygems sources...
http://localhost:9292 removed from sources
=> Adding https://rubygems.org to sources
https://rubygems.org added to sources
=> Starting installing sinatra from: https://rubygems.org
Fetching: rack-1.6.0.gem (100%)
Successfully installed rack-1.6.0
Fetching: tilt-1.4.1.gem (100%)
Successfully installed tilt-1.4.1
Fetching: rack-protection-1.5.3.gem (100%)
Successfully installed rack-protection-1.5.3
Fetching: sinatra-1.4.5.gem (100%)
Successfully installed sinatra-1.4.5
4 gems installed
### --- BENCHMARK RESULTS FOR https://rubygems.org --- ###
0.000000 0.000000 1.320000 ( 20.773610)
As you can see it takes 5 seconds using panthro and 20 without it, obviously it depends on your internet conection.
Similar projects
There are other projects that does more or less the same thing, like Geminabox proxy support or a regular web proxy like Squid. I've made this project as a Learning project and with purpose of keeping as simple and small as I can, Panthro only does one thing and is to cache gems.