dropbox で windows機からlinuxサーバ機 にファイル共有してwebで公開しよう。

みんな大好き dropbox
webサーバにdropbox経由で同期をかけられれば、ファイル公開が非常に楽になるのではなイカということで、
dropbox を利用してサーバにファイル同期できないか試してみる。


ふつーサーバにファイルをアップロードするには、 ssh や sftp などを利用しなくてはいけない。
これは非常に手間だ。
もっと簡単にファイルを同期できないものか。


できるよ、 dropboxならね。
dropboxの 非GUI版をインストールして、勝手にファイル同期させてみよう。


注意!!
これをやる前にかならず dropbox のバックアップをローカルにとることをお勧めします。
逆に同期されてファイルがすべて消されて泣いても知らないんだから。
(いろいろ設定を書き換えて遊んでいたら、ファイルがどんどん消えて行って冷や汗ものを味わった。。。)

環境整備

python2.5 以上 + sqlite(sqlite-devel) が必要なんので入れる。

sqliteインストール。簡単!
yum install sqlite sqlite-devel sqlite3
python2.6は少しめんどい。

python2.6 yumを利用して入れる。

yum 追加先に epel を追加

wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/i386/epel-release-1-1.ius.el5.noarch.rpm
rpm -i http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/i386/epel-release-1-1.ius.el5.noarch.rpm


mod python が入っているとうまくいかないらしい

yum erase mod_python

一気にインストール

yum install python26 python26-setuptools python26-devel mod_python26

dropbox を入れる

dropbox の非 GUIバージョンをインストールします。

wget -O dropbox.tar.gz http://www.getdropbox.com/download?plat=lnx.x86
tar zxof dropbox.tar.gz
wget http://dl.getdropbox.com/u/6995/dbmakefakelib.py
wget http://dl.getdropbox.com/u/6995/dbreadconfig.py
wget http://www.getdropbox.com/download?dl=packages/dropbox.py

dropbox の環境整備

dropboxの非GUIの環境を構築する?

python26 ~/dbmakefakelib.py

//実行してしばらく待っていると、以下のメッセージが表示される。
>dropboxd ran for 15 seconds without quitting - success?

//ここでこれ以上何も起きない、、、これでいいのかどうか知らないけど、
//Ctrl + C で強制終了させる。
//一応、dropbox関係のファイルは展開されているので、これでいいんだろうけど、、、

アカウントリンク

手順では python26 ~/dbreadconfig.py を実行して、アカウント情報を取得するらしいんだけど、実行してもうまくいきません。

python26 ~/dbreadconfig.py

//エラーになる
Traceback (most recent call last):
  File "/root/dbreadconfig.py", line 22, in <module>
    cur.execute('select key, value from config order by key')
sqlite3.OperationalError: no such table: config

エラーメッセージで検索していくと、掲示板がヒットして、、いいから ~/.dropbox-dist/dropboxd を実行してみろとある。
http://forums.dropbox.com/topic.php?id=25642&replies=1

よくわからないので、とりあえず実行してみる。

~/.dropbox-dist/dropboxd &

//メッセージが表示される。
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=XXXXXexpamleXXXXXX to link this machine.

ここで、すでに dropbox を動作させているwindowsマシンとかで、表示された https://www.dropbox.com/cli_link?host_id=XXXXXexpamleXXXXXX を開く。
そしたら、アカウントがリンクされる。

Client successfully linked, Welcome YOURNAME!


この時点から、この linux マシンに dropboxのフォルダが同期される。

//おなじみのファイルがあるはず。
ll ~/Dropbox/

自動起動スクリプトとか

自動起動ぐらいさせたくなイカ
以下を作成するでゲソ。

vi /etc/init.d/dropboxd

------- /etc/init.d/dropboxd ----
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the dropbox
#

RETVAL=0

case "$1" in
  start)
        /root/.dropbox-dist/dropboxd &
        ;;
  stop)
        killall dropbox
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 2
esac

exit $?
---------------------------------

//実行属性をフル
chmod +x /etc/init.d/dropboxd

//モダンな linux なので chkconfig で.
chkconfig dropboxd on

Dropboxディレクトリを変更する

今のままだと、 /root/Dropbox にファイルが作成されるでゲソ。
これだと、 そのほかのユーザ たとえば、 httpd / apache とかがこのディレクトリにアクセスできないぢゃなイカ
なんで、ディレクトリを変更するでゲソ。


警告:この作業は冷や汗ものでした。dropbox フォルダのバックアップをお勧めします。


まずは dropbox を停止するでゲソ。

/etc/init.d/dropboxd stop

or

killall dropbox


今回は、 /var/lib/dropbox に持っていくデゲソ。
dropbox ディレクトリをコピーするでゲソ

cp -ra /root/Dropbox /var/lib/dropbox

ちゃんとコピーしたでゲソか?


次に dropbox にフォルダを変更したということを覚えさせるでゲソ。
昔は、 dropboxdir.py というツールで変更できたらしいでゲソが、今は実行しても動かないでゲソ。

//今は動かない。。。
wget http://dl.getdropbox.com/u/119154/permalink/dropboxdir.py
python26 dropboxdir.py /var/www/dropbox
Traceback (most recent call last):
  File "dropboxdir.py", line 27, in <module>
    cursor.execute("select value from config where key='dropbox_path'")
sqlite3.OperationalError: no such table: config

なんということでゲソ。おのれ人類。仕様を勝手に変更するとは!!!
仕方ないので、sqlite3 で直接データベースを書き換えるでゲソ。
もうここまでくればやっちゃうしかないんぢゃなイカ

ちなみに sqlite3 ぢゃないと動作しないでゲソ。
sqlite でやるとエラーが表示されるでゲソ。おのれ人類。仕様を勝手に(ry

//sqlite ではダメ。
sqlite ~/.dropbox/config.db
Unable to open database "/root/.dropbox/config.db": file is encrypted or is not a database


sqlite3 の操作方法は、このページがわかりやすいでゲソ。


各データベースでテーブル定義を見る
http://d.hatena.ne.jp/dayflower/20060706/1152154333

//sqlite3 で書き換える。
//この時 dropbox プロセスが終了していることを確認すること。
sqlite3 ~/.dropbox/config.db

//今回は、このアップデート文を実行する
update config set value='/var/lib/dropbox' where key='dropbox_path';

//終了
Ctrl + D

dropboxを起動しなおす。
/etc/init.d/dropboxd start

ちゃんと同期されれば成功・・・・
そうでなければ、ファイル消されないように、すぐさま killall dropbox を実行して dropbox をたたき殺す。

緊急用のコピペ
killall dropbox

ここまでくれば

あとは、適当に /var/lib/dropbox/Public/Hogehoge とかに シンボリックリンクを作成するなりして遊びましょう。
セキュリティには注意してね!!!


私は、 http と同期したかったので、以下のように設定しました。

//web root 以下をすべて dropbox の中に入れる
cp -ra /var/www/html /var/lib/dropbox/Public/rtilabs.net

//現在の webroot を下げる。 
//すぐに消すのは忍びないので、 tmp にでも入れとく。そのうち消す。
mv /var/www/html /tmp

//シンボリックリンクを張る
ln -s /var/lib/dropbox/Public/rtilabs.net /var/www/html

これで、ディスクトップマシンから、 dropbox/Public/rtilabs.net にファイルをぶち込めば、勝手にサーバのファイルが変更されるされるというお手軽環境ができましたー


やったね。

よくありそうな質問

rsyncって知ってる?
いちいち rsync を実行しろというのか。それぢゃあ夢がない。

dropboxの publicフォルダ共有を使えばふつーにファイル公開できない?
dropboxの鯖って海外にあるためかちょっと遅くない?
あと、レスポンスヘッダに x-robots-tag:noindex,nofollow って付くので SEO屋だったら発狂して死ぬんぢゃなイカ?どうでもいけど。

参考

GUIの無いLinuxCentOS)にDropboxをインストールする
http://www.hyk-home.com/blog/infra/archives/2009/05/05-202601-137.html

centos-に-python-2-6-をインストール
http://ikkki.co.jp/blog-tech/2010/06/29/

・Headless ubuntu 10.04 Cannot get URL
http://forums.dropbox.com/topic.php?id=25642&replies=1


各データベースでテーブル定義を見る
http://d.hatena.ne.jp/dayflower/20060706/1152154333