Webサーバ不要、40行程度のスクリプトひとつで動かせる Gyazoサーバー(クローン)を書いた

WEBricで動かせるようにしたので、たかだか40行程度のスクリプト一個で済ませることができてしまった。やっぱりRubyサイコー。
Gyazo + WEBric で Gyabricと呼んでみる。

とりあえずGistに貼っているので、お好きなように...。
Linux(FedoraCore6?くらい?)で動作確認済み。特別なことはやってないんで、Rubyが入っていればWindowsとかMacとかでも動かせるはず...

コード


使い方

以下、簡単な使い方。

1.適当なディレクトリに上記のスクリプトを入れる。(たとえば /home/snaka/gyazo とかでもオケ)
2.エディタでスクリプトを編集
### CONFIGURE ###################################################{{{
HOST = 'xxx.xxx.xxx.xxx' # your server
PORT = 10080
ROOT = '.'
RUBY_BIN = '/usr/bin/ruby'

CONFIGUREのところを適当に自分の環境にあわせて変更すればいいはず。

HOST
Gyazoサーバーとして稼働させる(このスクリプトを配置しているホストの)IPアドレス
PORT
好きなポートに割り当てて
ROOT
デフォルトはスクリプトを配置しているディレクトリがルートになる
RUBY_BIN
rubyコマンド自体がある場所をフルパスで、type rubyとか、which rubyとかすれば教えてくれるはず。
3.ルートディレクトリの下にdbimagesディレクトリを掘る

たとえば、ルートディレクトリが/home/snaka/gyazoだとすると、、

$ cd /home/snaka/gyazo
$ mkdir db images

でオーケー

4.サーバーを起動

以下のようにサーバースクリプトを起動(スクリプトを'gyabric.rb'として保存したとして...)

$ ruby gyabric.rb

Unix系のOSだと、以下のように最後に&を付けることで、バックグラウンドプロセスとして実行することができる。
こうしておけば、ターミナルを閉じてもサーバは稼働し続けることができる。 ←これは間違い、単にバックグラウンドプロセスで実行しただけでは、ターミナルを閉じるとそのプロセスも終了してしまいます。そうならないためには、WEBrickdaemonとして起動するなどの工夫が必要なはず...

$ ruby gyabric.rb &> gyabric.log &

また、上記の例では gyabric.log にか同時のログを出力するようにしている。トラブルシューティングのためにも、このようにログを取っておいた方が良い。

5.クライアントのスクリプトを改造

本家Gyazoクライアントのスクリプト本体は /Applications/gyazo.app/Contents/Resources/script がそれ。
これをエディタなどで編集。
以下のような感じで変更すればいいと思う。

- HOST = 'gyazo.com'
- CGI = '/upload.cgi'
+ HOST = 'xxx.xxx.xxx.xxx'  # ローカルGyazoサーバのIPアドレス (or ホスト名)
+ CGI = '/upload'           # サーブレットのmountしているパス
- Net::HTTP.start(HOST,80){|http|
+ Net::HTTP.start(HOST,10080){|http|  # サーバーのポート

Windowsなら、以前のエントリで紹介したバッチファイル(でラップしたrubyスクリプト)も使える。



追記:2009.05.30

デバッグ目的でコード中からSTDOUTにhashの値を出力していた箇所を削除。
あと、サーバ起動方法の記述を追加

追記:2009.05.30 (2)

あまりに「すごい」という反応があって、いたたまれなない気持ちになってきたので「手の内」をバラすと...
ブクマコメントにもあるとおり、本家Gyazoとして配布しているアプリケーションのファイルにはサーバ側スクリプト(CGI)も含まれていて、自分のソースもそのCGIのソースがベースになってます。
ちなみに、本家GyazoCGIスクリプトは、ApacheなどのWebサーバソフトウェアを別途用意する前提になっているので 40行なんてもんじゃなく、もっと短いです。

ただ、ほとんど自分専用のイントラネットGyazoサーバ立てるためだけにApache入れて設定までするのが面倒だったので、お手軽なWEBricでGyazoサーバ立ててみたかっただけです。

なので、そんなに「すごくない」です。

追記:2009.05.30 (3)

以前のエントリでWindowsGyazoサーバを動かす方法を紹介しているので、そちらも参考になるかと...

WindowsでGyazoサーバを立ててみた - 今日もスミマセン。

訂正:2009.06.02

「5.クライアントのスクリプトを改造」の記述に誤りがあり訂正。

  • 訂正前:CGI = '/gyabric.rb' # サーバースリプトの名前
  • 訂正後:CGI = '/upload' # サーブレットのmountしているパス名

です。
クライアントからアクセスする先は「スクリプト名」の'/gyabric.rb'ではなく、サーブレットとしてmountしているパス'/upload'とするのが正しいです。

例えば、ホスト名がwww.example.comであった場合、gyazoクライアントからPOSTするURLはhttp://www.example.com:10080/uploadとなります。


追記:2009.6.22 実際に運用してみるとhttpサーバが必要

アップロードはWEBricだけで十分なんだけど、たとえば複数の画像を貼ったページをWEBricでさばこうとした場合、並列なリクエストに対しててシリアルにしか応答してくれないので、非常にパフォーマンスが落ちる。
画像を提供する側はやはりApacheMongrelなどのちゃんとしたWebサーバにする必要がある。なので、これってあんま意味ないかも...