Docker+Nginx+ownCloud+SSLで構築した
自宅サーバのストレージへどこからでもアクセスできるようにしたい。
現在、宅内では 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/
を開くと、初期設定画面が出てくる。
各設定値は次のようにして埋める。
- 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証明書関連
- Getting Started - Let’s Encrypt
- 無料で貰えるSSL証明書でLet’s Encrypt!
- Best practice for adding sub-domain certificates?
Docker関連
Nginx関連