GitHub版Fastladderをインストールしてみた

5年くらい動かしているオープンソース版Fastladderだけど、この5年のうちにヒトの異動なんかでゴミユーザーが溜まりまくったり、メンテも大変だったり(今はsupervisordで動かしている)と、そろそろ新しくしたくなったので、昨日今日で仮想環境から稼働までさせた。

尚OSはFedora17で、FastladderはGithub版です。

Rubyのインストール

2.0.0-p247を入れたんだけど、OS側のライブラリのヘッダファイルが足りなくて何度もコンパイルしなおしたのでストレスフルだった。ちなみにrbenvは使ってない。

yum install sqlite sqlite-devel
yum install zlib zlib-devel
yum install openssl openssl-devel
yum install libxml2 libxml2-devel
yum install libxslt libxslt-devel
yum install libcurl libcurl-devel
yum install gcc-c++ gcc-c++-devel
yum install mysql mysql-devel
yum install readline readline-devel

くらいはやっておく必要があった。それからnode.jsも必要なので入れておきましょう。

Fastladderを動かすまで

Fastladder を VPS の CentOS5.8 に入れてみた。を参考にすればよいです。

イントラもインターネットもきちんと巡回させる

クローラーはオープンソース版もGithub版もそのままではイントラの巡回をうまくやってくれないです。environment.rbのあたりにプロキシを使わない設定があるのだけどそれを書くとエラーで止まるので、

fastladder.rb(だったかな)に直接正規表現を書き込んだ。

Fastladder.const_set(:HTTP_PROXY_EXCEPT_HOSTS, ["XXXXXXX"]) 
#Fastladder.const_set(:HTTP_PROXY_EXCEPT_HOSTS, []) unless defined? (Fastladder::HTTP_PROXY_EXCEPT_HOST)

プロキシのとこも何故かコメントアウトされているので、ドキュメントを参考に書き換えておいた

@@ -58,13 +59,13 @@ module Fastladder
   def fetch(link, options = {})
     uri = link.kind_of?(URI) ? link : URI.parse(link)

-    http_class = Net::HTTP
-    #if proxy = uri.find_proxy || Fastladder::HTTP_PROXY
-    #  unless Fastladder::HTTP_PROXY_EXCEPT_HOSTS.any? { |pettern| uri.host =~ pettern }
-    #    http_class = Net::HTTP.Proxy(proxy.host, proxy.port, proxy.user, proxy.password)
-    #  end
-    #end
-    http = http_class.new(uri.host, uri.port)
+    if proxy = uri.find_proxy || Fastladder::HTTP_PROXY
+      if Fastladder::HTTP_PROXY_EXCEPT_HOSTS.any? { |pettern| uri.host =~ pettern }
+        http = Net::HTTP.new(uri.host, uri.port, nil, nil, nil, nil)
+      else
+        http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password)
+      end
+    end
     http.open_timeout = options[:open_timeout] || Fastladder::HTTP_OPEN_TIMEOUT
     http.read_timeout = options[:read_timeout] || Fastladder::HTTP_READ_TIMEOUT

OPMLの移行

オープンソース版Fastladderにはフォルダに入ってないとフィードがエクスポート出来ないというバグがあるのだけどすっかり忘れていた。少しハマった後思い出して解決。

今後やりたいこと

  • ログインをOpenIDにしたい(社内OpenIDサーバー立ててあるので)
  • ブックマークサービスとかtwitter系の社内SNSみたいなものとの連携をさせたい

まぁ社内ブックマークサービスも社内SNS(しゃべる)も一度か二度ほどコケてるけどね。

サーバー起動時にFastladderが一緒に立ち上がるようにする(途中)

うちの職場のFastladderの延べユーザーは7割を超えていて、サーバーが落ちてるとすぐに苦情がくるような状況だ。このアクティブユーザー率にすんのに3年以上の地味な努力と啓蒙活動があったわけだが。

で、そもそもこういったインフラは僕の仕事じゃないので障害対応しても給料に反映されるわけじゃなくて、むしろ時間を奪われるので、クローラーをdaemontoolsで動かしたりして手間を減らした。おかげで、一回起動させればサーバーが安定に動いている限りなにもしなくても良くなった(ここ一年くらいは障害対応ほとんどしてない)んだけど、今週から始まった計画停電で毎日起動してシャットダウンをしてというの繰り返しつつ、mongrel立ち上げて、クローラー動かしてっていうのはだるいのできちんと起動、停止するようにしようとした。

けど、いまのとこうまくいってないのでやっつけスクリプトでしのいでいる。

mongrel

rc.localで/usr/local/fastladder/tmp/pids/mongrel.pidが存在したらrmするように書いておいて以下のシェルスクリプトをcronで実行するようにしている。

#!/bin/sh

if [ ! -e /usr/local/fastladder/tmp/pids/mongrel.pid ];
then
  cd /usr/local/fastladder; script/server -d -e production
fi

ほんとはShapadoのようにpassengerで動かせれば楽なんだろうけどFedoraCore6だからなぁ。インストール出来んのかな?明日調べてみるか。

crawler

シャットダウン時に

svc -d /service/fastladder

するようにしてみたんだけど、どうもうまくいってないのでドキュメント読みなおす。あと日本語訳も。

とりあえず、リブートするとプロセスが即落ちする(svstatで継続時間が1秒以内に落ちてプロセスがどんどん大きくなる状況になる)ので、この場合に

svc -dx /service/fastladder /service/fastladder/log

を適当な感覚でまわし続けるcronを動かしておいた。

#!/usr/bin/python

import commands
import time
import re
reup = re.compile("(\d+) seconds")

def get_uptime():
  uptime = 0
  svresult = commands.getoutput('svstat /service/fastladder')
  m = reup.search(svresult)
  if m != None:
    uptime = m.group(1)
  return uptime

if __name__ == '__main__':
  for i in range(300):
    if get_uptime() > 2:
      break
    else:
      commands.getoutput('svc -dx /service/fastladder /service/fastladder/log')
      time.sleep(10)

fastladderのクローラーをdaemontoolsで動かす

クローラーがたまに落ちるのでモダンperl入門にあったdaemontoolsを使ってみることにした。

ProductName モダンPerl入門 (CodeZine BOOKS)
牧 大輔
翔泳社 / 2940円 ( 2009-02-10 )


srpmはここからダウンロードしてきて

rpmbuild --rebuild daemontools-toaster-0.76-1.3.3.src.rpm

できたrpmをインストール。

fastladderのあるディレクトリ(僕の場合は/usr/local/fastladder)でdaemonとdaemon/logっていうディレクトリを作ってそれぞれのディレクトリにrunという実行ファイルを用意

daemon/run

1
2
3
#!/bin/sh
exec 2>&1
exec setuidgid root /usr/local/fastladder/script/crawler -e production

daemon/log/run

1
2
#!/bin/sh
multilog

リンク

chmod 1755 /usr/local/fastladder
ln -s /usr/local/fastladder/daemon /service/fastladder

あとはdaemontoolsで動かす。

参考: daemontoolsでデーモン管理

fedora8にfastladderを入れた

fastladder素晴らしい。早速インストールしてみた。rubyは普段使わないのでrubygemsから。

$ ruby ./setup.rb
./lib/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rdoc/rdoc (LoadError)
        from ./lib/rubygems/custom_require.rb:27:in `require'
        from ./setup.rb:39

どうもruby-docが足らない。

$ yum install ruby-rdoc

これで、gem installでmongrelとかrailsが入る。

あと、freeimageを入れとかないとエラーが出て動かない。なんでここで解決。ただしyumでは入らなさげだったのでソースから入れた。

fastladder

やー超快適。サーバーとかいじってる暇なさげだけど、隙をみて職場のRSSリーダー入れ替える計画を立てなきゃ。

Fastladderを触っている

職場に入れたかったのでproxyに対応させる必要があった。というわけで作業メモ。

trunkにタイポがあったので二カ所ほど修正した気がする。

あと、addする際に登録できないフィードがあってなんでかな?と思ってみたら、urlが全部小文字になってた。これもrfeedfinderの仕業だった。

16行目くらいの

uri = uri.grep.sub(/^feed(.*)/,'http\1'/.downcase

のdowncaseが邪魔なので、ここを修正。

今日の作業はここまでだけど、RSSとAtomだったらAtomのほうを購読したほうがよさげな感じがしたりとかするので、そこらへんのコードも見てみながらrubyの勉強もする。

というか、rubyのシンボルでちょっと悩んでググったりとかした。

opensource版fastladderのリダイレクトの処理

これを10冊ぐらい買って、さりげなく職場に撒いておきたい今日この頃

ProductName できるポケット+ RSSリーダーで毎朝の情報収集力が10倍アップする本 (できるポケット+)
小林 祐一郎,できるシリーズ編集部
インプレスジャパン / ¥ 998 ()
通常24時間以内に発送

はじめてのRubyのおかげで、Rubyのコードを読むのが楽しくなってきたので、opensource版のfastladderでABCのフィードがブックマークレットから登録できなかった理由を調べた。

fastladder.rbがリダイレクトに対応してないっぽいのでこんな感じでレスポンスのチェックをすればよさそうなんだけどBasic認証用の処理とか入ってるから、どういう風に書いておけばよいのかわからん。

あと、RSSのURIをブックマークレットで登録しようとしてもフィードが見つからないとかいうのも直しておきたい。