高機能クラウドストレージNextCloudをdocker-composeでセットアップする


TL;DR

  • 高機能なクラウドストレージNextCloudを,オンプレミス環境にセットアップする方法を紹介します
  • docker-composeで,稼働に必要なコンテナ群をまとめて稼働させます
  • https接続して通信の安全性を向上させます
    • Let's Encryptで発行してもらった証明書を組み込みます
    • httpsを使用しない方法についても合わせて記載します

構成

  • docker-composeで,下図の3つのコンテナを立ち上げて運用します
    • NextCloud本体
    • nginx
    • MariaDB

  • NextCloudコンテナ
    • 80/TCPでアクセスを受け付けます(Dockerでローカルホストからの接続しか受付ません)
  • MariaDBコンテナ
    • NextCloudがメタ情報の保存のために使用するコンテナです
  • (任意) nginxでリバースプロキシする
    • https(443/TCP)で受け付けたリクエストを,NextCloudコンテナにフォワードします
    • リバースプロキシが別の場所にある場合は,docker-compose.ymlを編集して不使用にします

最も簡単な使い方

  • HTTPS用の認証キーファイルを,git cloneしてきたディレクトリのkeys内に格納して,docker-compose upします
git clone https://github.com/myoshimi/nextcloud-docker-compose
cd nextcloud-docker-compose
cp <Directory Path>/fullchain.pem ./keys/
cp <Directory Path>/privkey.pem ./keys/
docker-compose up -d

docker-compose.ymlでの作業の解説

  • 3つのコンテナ(app, rev, db)を立ち上げます
    • appコンテナ: NextCloud本体のコンテナ
      • volumeとして,コンテナの/var/www/htmlを,ローカルディレクトリ(nextcloud-docker-compose)にマウントします
      • 環境変数MYSQL_*によって,同じdocker-composeのdbコンテナに接続します
      • portsディレクティブで,ローカルホストからのみアクセス許可(3040/TCP)をしています
    • revコンテナ: リバースプロキシ用のコンテナ
      • 443/TCP(https)を外部からのアクセス許可しています
      • ローカルディレクトリのnginx.conf,およびkeysディレクトリの認証用鍵ファイル(fullchain.pem, privkey.pem)をマウントしています
    • dbコンテナ: MariaDBコンテナ
      • volumeとして,コンテナの/var/lib/mysqlを,ローカルディレクトリにマウントします
      • 環境変数MYSQL_*で初期設定をしています
      • exposeディレクティブで,appコンテナからのみからのアクセス許可(3306/TCP)をしています
  • 不揮発化ボリュームについて
    • コンテナが落ちたり消えたりしてもデータが飛ばないように,不揮発化領域を各コンテナがマウントしています
    • docker-compose up -dしたときに作られるディレクトリは,nextcloud-docker-compose内の以下のものです.これらが残っていれば,NextCloudの環境を復元できます
      • /data: NextCloudが持つデータ(プラグインアプリなど)
      • /db: MariaDBのデータ

リバースプロキシをしない場合

  • 別の既存のリバースプロキシでNextCloudへ接続する場合,または,ローカルネットワークで運用してHTTPS接続が不要な場合
    • インターネットから接続できる環境での運用はセキュリティ上問題になるのでご注意ください
  • docker-compose.ymlを2箇所修正して,docker-compose up -dします.

1. リバースプロキシを使用しないようにする

  • revコンテナ(nginx)に関する記述をdocker-compose.ymlから削除します
-  rev:
-    image: nginx:1.15
-    network_mode: "host"
-    ports:
-      - "443:443"
-    volumes:
-      - ./nginx.conf:/etc/nginx/nginx.conf:ro
-      - ./keys/fullchain.pem:/etc/nginx/keys/fullchain.pem:ro
-      - ./keys/privkey.pem:/etc/nginx/keys/privkey.pem:ro

2. nextcloudのアクセス許可の変更

  • docker-compose.ymlのnextcloudに関する記述を変更し,外部から80/TCPでのアクセスを許可します
    • 以下の記述は,外部から3040/TCPでの接続を許可しています
    • IPアドレス制限や,ポート番号は別のものを使用することができます
   app:
     image: nextcloud:15-apache
     restart: always
     ports:
-      - "127.0.0.1:3040:80"
+      - "3040:80"
     depends_on:
       - db

参照