8月に以前サービスされていた「Ubuntu One File Sync service」の ソースコードが公開されました (Topicsの8月21日号 ) 。今回はそのインストール方法について紹介します。
Ubuntu One File Sync
「Ubuntu One 」はCanonicalが運営するOpenIDベースのシングルサインオンサービスです(少なくとも今現在は) 。Ubuntu Phoneのユーザーはアプリをインストールするために、AndroidでいうGoogleアカウント、iPhoneでいうところの Apple IDのようにUbuntu Oneアカウントを作成する必要があります。また、Ubuntuの開発者は基本的にLaunchpad のチケットシステムやコードホスティング、翻訳システムなどを 利用して開発を行いますが、このLaunchpad用のアカウントもUbuntu Oneで作成します。
そんなUbuntu Oneですが、1年ほど前まではオンラインストレージサービス機能も持っていました。というか元々はオンラインストレージサービスとして立ち上がったプロジェクトでした(Topicsの2009年5月15日号 ) 。当時はDropboxをはじめとするオンラインストレージサービスが世界的にも認知されるようになっていた時期で、 Ubuntuでもストレージサービスを提供することで一般ユーザーも「Ubuntuのアカウント」を取得してもらうような 流れを作ろうという魂胆だったのではないでしょうか[1] 。
その後は、Ubuntuやファイルブラウザーである「Nautilus」に統合されたクライアントの提供、 7digitalと協力した音楽配信サービスである「Ubuntu One Music Store」 、 Thunderbirdのアドレス帳やTomboyのメモの同期機能、 Ubuntuソフトウェアセンター経由のインストール済みパッケージの保存など、 Ubuntuとオンラインストレージサービスを連携させた機能をいくつもリリースしていくことになります。
しかしながらオンラインストレージサービスそのものは、容量の増加と価格の低下が続く DropboxやGoogle、Microsoftといった競合には勝てず、2014年4月にサービスを 終了することとなりました(Topicsの2014年4月4日号 ) 。現在は冒頭にもあるように、Launchpadからその機能を引き継いだシングルサインオンサービスに留まっています。
サービス終了時に、オンラインストレージサービス(Ubuntu One File Sync)部分の ソースコードはそのうち公開するということも同時にアナウンスしていました。8月に公開された「Ubuntu Oneのソースコード」はまさにこの部分なのです。
公開されたソースコードでできること
公開された「Ubuntu Oneのソースコード 」でできることは限られています。「 インターネット越しの複数のマシン間のファイルの同期」これだけです[2] 。
Web UIやREST API部分はありませんし、アドレス帳の同期や音楽配信機能もありません。既存のUbuntu Oneクライアントもそのままでは使えません。前者については将来的に公開されるようにも読み取れなくもないですが、 いつになるかは未定です。そもそもこのソースコードは公開して終了というタイプなので、 他の誰かがフォークしない限りはメンテナンスされることもありません。
公開されたコードにしても、ファイルはローカルにしか保存できませんし[3] 、 依存ライブラリの関係上、サーバーは12.04でしか動きません(14.04ではエラーになります) 。設定を少し変更すると動かなくなりますし、そもそもREADME.txtの手順だと動きません。
つまりこのコードを使って新しいオンラインストレージサービスを立ち上げるには足りないものが多すぎます。既存のサービスに縛られないオンラインストレージサービスがほしいのであれば、 普通にownCloudあたりを使うのが無難でしょう。
これだけ書いておけばさすがに、「 Ubuntu Oneのソースコード」に高い期待や幻想を持つこともないでしょう。ここから先は、それでも動かしてみたい人のために、README.txtに従って実際に同期させるところまでを説明します。
サーバー側の準備
まずサーバー側はUbuntu 12.04 LTSが必要になります。12.04さえあれば、あとは必要なものはパッケージングシステム経由か、 LaunchpadのBazaarから取得します。特別なハードウェアも必要ありませんし、 そこまでスペックが高いマシンである必要もありません。適当なマシンにKVM なりLXC なりで適当な仮想環境を構築して、 その中にインストールすれば良いでしょう。
まず最初にSSL接続のための秘密鍵(privkey.pem)と証明書(cacert.pem)を作成します。このうち証明書の「Common Name」はクライアントからアクセスする時のホスト名と 一致している必要があります。とりあえずのテスト用であれば、サーバーのIPアドレスでも良いでしょう。
$ openssl genrsa -out privkey.pem
$ openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
(中略)
Common Name (e.g. server FQDN or YOUR name) []:10.0.3.19
(後略)
次に必要なパッケージをインストールします。Ubuntu Oneは一度性能の問題でCouchDBからPostgreSQLに移行しています。よってPostgreSQLとPythonの各種モジュールのパッケージが必要になります。
$ sudo apt-get install bzr make python-transaction protobuf-compiler \
python-setuptools gcc python-dev python-twisted-web postgresql-9.1 \
python-yaml python-psycopg2 postgresql-contrib supervisor \
postgresql-plpython-9.1 python-django python-boto squid \
python-protobuf python-psutil python-testresources \
python-tz python-bson python-iso8601 python-openid
あとはUbuntu Oneのソースコードを取得します。
$ bzr branch lp:filesync-server
$ cd filesync-server
設定ファイル(configs/development.yaml)に先ほど作成した秘密鍵と 公開鍵を記述します。
secret:
api_server_crt: |
-----BEGIN CERTIFICATE-----
(privkey.pemの内容を記述)
-----END CERTIFICATE-----
api_server_key: |
-----BEGIN RSA PRIVATE KEY-----
(cacert.pemの内容を記述)
-----END RSA PRIVATE KEY-----
api_server_crt_chain:
privkey.pemのファイル自体は不要になりますので、削除しても問題ありません。ただしcacert.pemを作り直す場合は必要になります。cacert.pemの方は、後ほどクライアント側で使います。とはいえどちらも、development.yamlの内容から復元できますので、ファイルとしては 削除しても差し支えないでしょう。
あとは次のコマンドで必要なライブラリのダウンロードとデータベースの構築、 サーバーの起動を行います。
$ make start-oauth
Checking out external source dependencies...
build/link-external-sourcecode \
-p ../sourcedeps/sourcecode/ \
-t /home/ubuntu/filesync-server/.sourcecode \
-c build/config-manager.txt
configglue: checked out r1 of lp:~configglue/configglue/trunk
(中略)
filesync: started
ssl-proxy: started
DJANGO_SETTINGS_MODULE=backends.django_settings python dev-scripts/load_sample_data.py
python -c 'from config import config; print >> file("tmp/filesyncserver.port", "w"), config.api_server.tcp_port; print >> file("tmp/filesyncserver.port.ssl", "w"), config.ssl_proxy.port; print >> file("tmp/filesyncserver-status.port", "w"), config.api_server.status_port'
最終的に上記のように「python -c」のメッセージが表示されたら起動完了です。twistdプロセスが21101番ポートで待ち受けることになります。外部からこのポートが見えるようにしておいてください。
ちなみにこれらのサーバーのログはtmp/filesync-server.logに保存されます。起動しておくとひたすらログが増えていくので注意してください。
最後に新規アカウントを作成します。
$ dev-scripts/user-mgr.py create testuser John Doe jdoe@gmail.com testpass
createの後ろは「アカウント名」「 フルネーム」「 メールアドレス」「 パスワード」になります。createの代わりにshowを渡せばユーザーリストを取得できますし、updateやdeleteコマンドもあります。
クライアント側の準備
次にクライアントの設定を行います。これまでのUbuntu Oneクライアントパッケージは、 サーバーとしてone.ubuntu.comを向いていたり、証明書がサービス当時のそれになっていたりと、 そのままでは今回構築したサーバーには接続できません。そこでソースコードをダウンロードして設定を変更して使用することにします。
まずクライアントの環境ですが、Ubuntu 14.04 LTSを使用します。必要なパッケージはPythonモジュールだけですので、12.04や15.04でも そのまま動くはずです。
$ sudo apt-get install python-twisted-bin python-twisted-core \
python-dirspec python-pyinotify python-configglue \
python-twisted-names python-ubuntu-sso-client \
python-distutils-extra protobuf-compiler python-protobuf
適当なディレクトリを作成し、Ubuntu Oneサーバーの証明書(cacert.pem)を保存します。ちなみに他のファイルを置くとエラーになるので注意してください。
$ mkdir -p ~/u1client/cacert/
$ cp cacert.pem ~/u1client/cacert/
次にUbuntu Oneと通信するためのメッセージプロトコルを定義したPythonモジュールを インストールしましょう。
$ cd ~/u1client/
$ bzr branch lp:~facundo/ubuntuone-storage-protocol/opensourcing storage-protocol
$ cd storage-protocol
$ ./setup.py build
最後にクライアント本体をインストールします。
$ cd ~/u1client/
$ bzr branch lp:~facundo/ubuntuone-client/opensourcing client
$ cd client/ubuntuone
$ ln -s ~/u1client/storage-protocol/ubuntuone/storageprotocol .
$ cd ..
$ ./setup.py build
あとはクライアントを起動するだけです。「 --auth」オプションにはサーバーに作成したアカウント名とパスワードを指定します。「 --host」はサーバーのホスト名です。さらにこれは証明書のCommon Nameと一致している必要があります[4] 。
$ export $(dbus-launch)
$ PYTHONPATH=. SSL_CERTIFICATES_DIR=$HOME/u1client/cacert bin/ubuntuone-syncdaemon \
--auth=testuser:testpass --host=10.0.3.19 \
--port=21101 --logging-level=DEBUG
クライアントはデーモンとして動作します。終了するときは「Ctrl-C」です。
「~/.cache/ubuntuone/log/syncdaemon.log」にサーバーとの通信ログが残ります。README.txtにもあるように、SYS_AUTH_OKが残っていれば同期ができています。もしSYS_AUTH_OKより前でエラーが出ているようなら、サーバー側のログと突き合わせながら 原因を追求してください。
クライアントが起動したら「~/Ubuntu One/」ディレクトリが自動的に作成されます。このディレクトリに適当なファイルを置くと、クライアントのログファイルに以下のような メッセージが表示されます。
ubuntuone.SyncDaemon.EQ - DEBUG - push_event: FS_FILE_CREATE,
kwargs: {'path': '/home/ubuntu/Ubuntu One/testfile'}
同期イベントが開始したら、サーバー側にも次のようなメッセージが表示されるはずです。
TRACE storage.server[16866]: 1b42e918-c57a-4857-acf9-e6a79992e1d0 127.0.0.1:47878 testuser
MakeResponse 15 - IN: id: 15 type: MAKE_FILE make { share: "" parent_node:
"04142ddc-98ef-4c84-b2e0-0f209b4eab43" name: "testfile" }
あとは同じように複数のマシンにクライアントを準備して、きちんと同期するかどうか 試してみるのも良いでしょう。
[4] Common Nameとの不一致の場合は、「 'Host name does not match certificate. Expected 10.0.3.19 but got None.'」の ようなエラーが表示されます。
Ubuntu Oneのフォーク「Magicicada」
「Magicicada 」は、 このUbuntu Oneのソースコードをフォークして、オンラインストレージサーバーの 開発を行うプロジェクトです[5] 。CanonicalでUbuntu Oneの開発に関わっていたメンバーが、 そのままこのフォークプロジェクトにも関わっています。
当面は開発プラットフォームを14.04に移行すべく、不要なものを整理している状態です。今はまだ動いたり動かなかったりとリビジョンによってばらつきがありますが、 将来的にはこちらのコードのほうがより品質の高いものになっていくでしょう。
[5] 「Magicicada」はいわゆる「素数ゼミ」のことです。虫が苦手な人は、慎重にGoogleで検索してください。ちなみにもともとはUbuntu OneのGTK+クライアントを 作るプロジェクトでした。