ownCloudをDockerで導入した

概要

本記事では、Dropboxのようなオンラインストレージをオンプレミスで構築することができるソフトウェアであるownCloudを導入する方法を説明する。今回は、公式で配布されているDockerイメージを使って導入するため、比較的手軽に導入できる。ただし、読者はDockerに関する最低限の知識を必要とするだろう。加えて記事中では、イメージに変更を加えownCloudが動作するユーザとグループを変更する方法についても述べる。これは、ある事情から、特定のユーザからしか読めない既存のディレクトリをownCloudに管理させる必要があったために行った。

背景と環境

自宅でサーバを動かしNASを運用しているが、それならばownCloudを入れると色々捗るという話を同僚から聞いたということが発端となり、導入してみた。ownCloudは、Dropboxのようなオンラインストレージをオンプレミスで構築するためのオープンソースのソフトウェアだ。すなわち自分が管理するNASに導入すれば、搭載されているHDD/SSDの範囲内で無限オンラインストレージが実現できる。

個人的には無限オンラインストレージがほしいということよりも、NAS上のファイルにWebブラウザからアクセスできるようになることが嬉しい。これまで何度かその必要に迫られることがあり、そのたびscpするのはめんどくさいなーと思っていたところだった。この理由から、今回の目標として:

  • ownCloudを導入する
  • ホーム(のように使っている)ディレクトリownCloudの管理下に置き、Webからアクセスできるようにする。
    このディレクトリは現状で主にファイル置き場に利用されており、LAN内ではSambaで共有されている。所有者は mecab:mecab で、ディレクトリのパーミッションは770 、中のファイルはほとんど 660 となっており、他のユーザから見ることはできない。パスは /storage とする。

ということを設定した。

ownCloudは構築済みの環境がDockerイメージとしても提供されているので、これを利用することにする。NASの環境を汚さないで済むし、WebサーバやPHPの実行環境の準備に時間を取られず、楽だからだ。また、ownCloudはMySQLやPostgreSQLなどのDBを必要とする(今回はMySQLを利用した。なお、使わないでもsqliteを使って動くものの、推奨されないようだ)が、これもownCloud専用のDBサーバをDockerコンテナで準備することにする。

なお、本記事においてパス名やポート番号など、本質的でない部分については僕が実際に設定する際に使ったものから変更してある部分がある。

構築

MySQLの配置

MySQLもDockerイメージが公開されているのでこれを利用する。

まず、MySQLのコンテナを配置する。DBの実体のファイルが置かれる場所がホスト上に必要なので、まずはこれを作成する。/var/docker/mysql-owncloud/var/lib/mysql に保存するものとして、

# mkdir -p /var/docker/mysql-owncloud/var/lib/mysql

早速MySQLのコンテナを動作させる。

docker run -d \  
  --name mysql-owncloud \
  -e MYSQL_ROOT_PASSWORD=${ROOT_PASS} \
  -e MYSQL_DATABASE=owncloud \
  -v /var/docker/mysql-owncloud/var/lib/mysql:/var/lib/mysql \
  --restart=always

ここで、${ROOT_PASS} はMySQLのrootパスワードを何にするか指定する。今回はownCloud専用にDBを作るので、rootユーザをアプリケーションからも使うことにする。気になる場合は -e MYSQL_USER=username -e MYSQL_PASSWORD=password のオプションを足し、一般ユーザを追加するか、 docker exec -it mysql-owncloud bash でコンテナに入り mysql コマンドを使って一般ユーザを作ること。MYSQL_DATABASE を指定することで、コンテナの初回起動時にここで指定された名前の新規のDBを作成できる。--restart=always はdockerのデーモンが再起動した時やサーバが再起動した時にコンテナを(たとえその直前に終了されていようとも)起動するオプションである。これは好みで。

ownCloudの配置

動作するユーザの変更

DBの準備ができたところで早速ownCloudを動かしたいところだが、ここで1つ問題がある。目標に書いた、前述のディレクトリのパーミッションは 770 であるため、ownCloud(のコンテナ内で動くApache。www-data:www-data で動いている)から見ることができない。ホームディレクトリの所有者やパーミッションを変更するのは影響が大きいため、Apacheが動作するユーザをディレクトリの所有者に変更することにした。当然ながら、僕のように既存のディレクトリを管理させたいという要件がない場合はこの手順は必要ない。

ということで、公式のDockerイメージに変更を加える。以下の内容でDockerfileを作り、

FROM owncloud:latest  
MAINTAINER [名前] <[メールアドレス]>  
RUN useradd --no-create-home --uid {UID} --shell /usr/sbin/nologin {USERNAME}  
RUN sed -i -e 's/www-data/mecab/g' /etc/apache2/apache2.conf  
RUN sed -i -e 's/www-data/mecab/g' /entrypoint.sh  
# docker build -t mecab/owncloud .

としてビルドする。

ここで、{UID}{USERNAME} はそれぞれ管理させるディレクトリの所有者のuidとusernameにする。/entrypoint.sh には、初回起動時に/var/html/www以下にownCloud関連のファイルをコピーし、その所有者を www-data:www-data にする処理が含まれているため、Apacheの設定だけでなくこのスクリプトについても書き換えている。

以上でカスタマイズされたイメージの準備が整った。永続化の設定をするだけだ。MySQLの時と同様に、ホスト上のファイルシステムに設定を保存するディレクトリを作成する。 /var/docker/owncloud/var/www/html に保存するものとして、

# mkdir -p /var/docker/owncloud/var/www/html

あとは起動するだけだ。

docker run -d \  
  --name owncloud \
  -p 10080:80 \
  -v /pool0/docker/owncloud/var/www/html:/var/www/html \
  -v /storage:/storage \
  --link mysql-owncloud \
  --restart=always \
  mecab/owncloud

--link には上で設定したMySQLコンテナの名前を指定する。このオプションは立ち上がるコンテナから指定したホスト名 mysql-owncloud でMySQLコンテナに接続できるようにする。また、この例ではホストのTCP10080番ポートをコンテナのTCP80番、すなわちownCloudのWebUIが提供されるポートにマッピングしている。これにより、http://(ホストのIP):10080/ で外部からownCloudに接続できるようになる。

以上まででownCloudが動作する環境が整った。

初期設定

ownCloudの初期設定画面

http://(ホストのIP):10080/ に接続すると上記の初期設定画面が表示される。管理者のユーザ名とパスワードを設定し、「ストレージとデータベース」をクリックすると表示されるDBの設定も忘れずに行う。図のように

  • データベース: MySQL / MariaDB
  • データベースのユーザ名: root
  • データベースのパスワード: MySQLコンテナの起動時に設定したrootパスワード
  • データベース名: owncloud
  • データベースのホスト名: mysql-owncloud

上で述べたように、データベースのホスト名は --link したMySQLコンテナの名前で良い。その他データベース名や資格情報を変更した場合は適宜変更すること。入力したら「セットアップを完了します」ボタンをクリックする。

外部ストレージの設定

最後に、ownCloudにデータ置き場として使っているディレクトリを読みこませる。右上のメニューの「管理」中、「外部ストレージ」のところで、以下のような項目を追加する:

  • フォルダー名: 任意の名前(今回はHome)
  • 外部ストレージ: ローカル
  • Authentication: なし
  • 設定: /storage
  • 利用可能: 適切に設定(今回は空白=全てのユーザ)

ownCloudの管理画面で外部ストレージを設定している様子

設定後、トップページに戻れば、以下のように外部ストレージが追加され、クリックすれば当該のディレクトリ内のファイルを閲覧できることが確認できる。

外部ストレージが追加されたトップページの様子

以上でownCloudの構築は完了となる。

躓いたこと

ownCloudに(外部ストレージではない場所に)アップロードしたファイルの実体は、デフォルトではコンテナ上の /var/www/html/data に置かれる。当初、外部ストレージの機能を使わずこのディレクトリ自体を、/storage に設定しようとした。こうすれば、ルートが/storageになり、今回作ったHomeのように無駄に一段階階層が深くなることもなく、管理がしやすいのではないかと考えたからだ。しかし、この場合ownCloud外でファイルを追加/削除した場合に同期されなくなってしまった。ownCloudのデータフォルダはownCloud専用とすべきであるようだ。外部ストレージとして読んだ場合では正しく同期されたので、今回のようなケースでは外部ストレージとして設定するのが良い。

おわりに

本記事では、ownCloudを公式配布のDockerイメージを使って導入する方法を説明した。導入してから10日ほどになるが、Webからのアクセスに関しては安定して動いているようだ。Dropboxのように同期ができるデスクトップアプリケーションもあるのでこちらも試してみたい。なお、スマートフォン版は$0.99で販売されている。お布施しても良いかなと考えている。

なお、今回外部ストレージとしディレクトリを登録したが、この機能はローカルのディレクトリだけではなく、Dropboxを始めとしてGoogle DriveやAmazon S3などのオンラインストレージを登録して一箇所で管理することもできる。この機能も面白そうだ。また、SMBにも対応しているので、すでにSMBで共有されているディレクトリであれば、こちらを使うのも有りかもしれない1。そうすれば、ownCloudの動作ユーザを変更する作業も必要なくなる。

最後に、セキュリティについては今回深く考慮していないので注意されたい。例えば、少し触れたがMySQLにownCloud専用の一般ユーザを追加するなどしたほうが良いかもしれない。また、WANに公開する場合は特にSSLを設定するのは必須だろう。僕はnginxでリバースプロキシを立て、そこで暗号化してWANに公開している。

楽しいownCloudライフを。

  1. 今回も行えたのだが、パフォーマンスがどれくらい出るのか不安に思ったためSMBは使わず、ローカルのディレクトリとして登録した。