自宅サーバのストレージへどこからでもアクセスできるようにしたい。

現在、宅内では Samba サーバを立てている。 本当はこれをインターネットから使えるようにすれば楽だが、 Samba はイントラネットでのファイル共有が主な用途であり、 外部に晒すのはセキュリティ的にまずそうなのでやめておく。

そこで、ownCloud on HTTPS で使ってみることにした。 ownCloud はオープンソースのファイル共有 Web サーバである。

ownCloud はセキュアを謳っており、SSL対応、ファイル暗号化あたりがその根拠らしい。 SSL 対応はいまの Web では普通だし、今回は既存のストレージを ownCloud で 公開するため暗号化もできない、ということで、実際に ownCloud が Samba と比べて どれだけセキュアかはよくわからない。

だが、ownCloud は SSL 対応できる時点で Samba よりはいいだろうし、 用途もマッチしているので、ownCloud を使う。

今後の拡張も考えて、Nginx で HTTPS を受け、ownCloud にプロキシすることにした。

SSL 証明書も持っていないので、今回 Let’s Encrypt で取得する。

さらに、せっかくなので、これらを Docker 上に構築してみる。

追記

本稿で Docker の使い方がイケていなかった部分は、 Docker ComposeでownCloudを構築した で修正した。隙ならそちらも参考にするとよい。

環境

Arch Linux。

% uname -a
Linux fg-arch 4.9.8-1-ARCH #1 SMP PREEMPT Mon Feb 6 12:59:40 CET 2017 x86_64 GNU/Linux

Docker。

% pacman -Su docker
% docker --version
Docker version 1.13.1, build 092cba3727

共有したいディレクトリ。

% ls /house 
library  living

ドメインは伏せておく。

example.com

証明書 のインストール

Let’s Encrypt から取得する。

certbot コマンドを実行すると、対話的にいろいろ訊いてくるので、よしなに答える。l

# pacman -S certbot
# certbot certonly --standalone \
    -d example.com

うまくできたら、次のようにファイルが作成される。

# ls /etc/letsencrypt/live/example.com
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

Docker のインストール

省略。

# pacman -Su docker

Docker をユーザ権限から使えるようにしたいので、 自分のユーザを docker グループに追加しておく。

# usermod -a -G docker fujii
# exit
% exit

再度自分のユーザでログインし、 docker グループに入っていることを確認する。

% groups 
docker fujii

ownCloud のインストール

まずは ownCloud が利用するデータベースから作る。 今回はなんとなく、PostgreSQL にした。

PostgreSQL の起動

% docker run -d \
  --name postgres-owncloud \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=任意のパスワード \
  postgres:9.6.2

これだけでOK。PostgreSQL プロセスが居るはず。

% docker ps | grep postgres-owncloud 
2d247d93b821        postgres:9.6.2      "docker-entrypoint..."   16 hours ago        Up 16 hours         5432/tcp                                   postgres-owncloud

ownCloud の起動

次に ownCloud を作成する。

-v <source> <directory> オプションは Volume の指定である。 ホストの <source> がゲストの <directory> にマウントされる。

ownCloud の各ファイルはゲストの /var/www/html に生成されるので、 それをホストの /var/lib/docker/data/owncloud/var/www/html にとっておく。

それが次の行の意味。

-v /var/lib/docker/data/owncloud/var/www/html:/var/www/html

これをしないと、ownCloud を起動するたびに設定とかが消える模様。

あと、共有対象の /house が ownCloud に見えるようにしておく。

-v /house:/house

これはあとで意味がある。

で、結局、こうする。

mkdir -p /var/lib/docker/data/owncloud/var/www/html

docker run -d \
  -v /var/lib/docker/data/owncloud/var/www/html:/var/www/html \
  -v /house:/house \
  -p 80:80
  --link postgres-owncloud \
  --name owncloud \
  owncloud:8.1

ownCloud の初期設定

Web ブラウザから http://localhost/ を開くと、初期設定画面が出てくる。

ownCloud

各設定値は次のようにして埋める。

  • user: 任意の管理ユーザ名
  • password: 任意の管理パスワード

  • login: postgres
  • password: PostgreSQLのパスワード
  • db: owncloud
  • hostname: postgres-owncloud

トラブルシューティング

なぜか「PostgreSQLのバージョンチェックに失敗しました」とか出たが、 「セットアップを完了します」ボタンを押す前に、 雑にownCloud のソースコードを書き変えてスルーするようにしておいた。

% docker exec -it owncloud bash
# apt-get update
# apt-get install vim-tiny
# vi /var/www/html/lib/private/util.php
/*
try {
	$result = \OC_DB::executeAudited('SHOW SERVER_VERSION');
	$data = $result->fetchRow();
	if (isset($data['server_version'])) {
		$version = $data['server_version'];
		if (version_compare($version, '9.0.0', '<')) {
			$errors[] = array(
				'error' => $l->t('PostgreSQL >= 9 required'),
				'hint' => $l->t('Please upgrade your database version')
			);
		}
	}
} catch (\Doctrine\DBAL\DBALException $e) {
	\OCP\Util::logException('core', $e);
	$errors[] = array(
		'error' => $l->t('Error occurred while checking PostgreSQL version'),
		'hint' => $l->t('Please make sure you have PostgreSQL >= 9 or'
			. ' check the logs for more information about the error')
	);
}
*/

良い子は真似しないでね!!(゚∀゚)

/house ストレージの有効化

ホストのストレージは、まだ ownCloud から見えるようになっていない。 Webブラウザから、画面をポチポチして ownCloud に追加する。

  • 左上メニューの アプリ を選択し、
  • 左側メニューから 無効 を選択、
  • 右側に出るアプリ一覧から External storage support有効にする
  • 右上 admin メニューから 管理 を選択すると、
  • 左側メニューに 外部ストレージ が出現している。

外部ストレージの追加フォームで、次のように入力する。

  • フォルダー名: /House
  • 外部ストレージ: ローカル
  • 設定: /house
  • 利用可能: admin(group)

うまくいくと入力行の左端に緑色のが表示される。

ここまでできたら、OwnCloud のホームに戻ると、House が表示されており、 ローカルの /house の内容にアクセスできるはずである。

出来ない場合、パーミッションとかにひっかかっているかもしれない。

ドメインの登録

あとでエラーになるので、先回りしてやっておく。 ownCloud にドメインを登録。

% docker exec -it owncloud bash
# apt-get update
# apt-get install vim-tiny
# vi /var/www/html/config/config.php
  'trusted_domains' =>
  array (
    0 => 'example.com',
  ),

80番ポートの閉塞

いまの状態では、80番ポートが外部に空いてしまっている。 今回は Nginx からプロキシするので外部にポートを開放する必要は無い。

コンテナ起動時のオプションから -p 80:80 を削除するだけでよい。

先にコンテナを終了する。

% docker stop owncloud
% docker rm owncloud

で、起動。

docker run -d \
  -v /var/lib/docker/data/owncloud/var/www/html:/var/www/html \
  -v /house:/house \
  --link postgres-owncloud \
  --name owncloud \
  owncloud:8.1

Webブラウザから再度、 http://localhost を開いてもアクセスできなくなっているはず。

Nginx のインストール

Nginx を起動。

mkdir -p /var/lib/docker/data/nginx/conf/conf.d

docker run -d \
  --name nginx-proxy \
  --link owncloud \
  -p 443:443 \
  -v /var/lib/docker/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  -v /var/lib/docker/data/nginx/conf/conf.d:/etc/nginx/conf.d \
  -v /etc/letsencrypt:/etc/letsencrypt \
  nginx

設定を投入。

% vi /var/lib/docker/data/nginx/conf/conf.d/default.conf
server {
    listen       443;
    server_name  example.com;

    ssl on;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    #location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html;
    #}

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://172.17.0.3/;
        proxy_redirect http:// https://;
    }
...
}

設定を再ロード。

docker exec -t nginx-proxy /usr/sbin/nginx -s reload

あとは、HTTPSでページを開いてみる。

https://example.com/

ログイン画面が出たらOK。

感想

かねてより、やりたいことキューに積みっぱなしだった SSL 対応を勢いでできてよかった。

ownCloud についてはまだこれから使うのでわからない。

Docker のつかいかたがわかってよかったです。 まだわからないところもけっこうあるけど、今回はごまかした。 こんどは、Docker composeをつかわなきゃとおもいました。

参考にしたページ

ownCloud関連

SSL証明書関連

Docker関連

Nginx関連