Docker+NextCloud+https-portalでお手軽NextCloud環境 

# はじめに

[NextCloud](https://nextcloud.com/)
セキュアでLineチックなOSSを探ししていて、NextCloudを知りました。
NextCloudはownCloudからフォークしたプロジェクトでその後も拡張を加えられているプロジェクトです。
具体的な機能として、
・ファイル共有
・メールクライアント
・カレンダー
・チャット
・Web会議
があり、グループウェアとしても使用可能です。
特にweb会議の機能は昨今のコロナ禍もあり、注目されている機能ではないでしょうか。
社内のLAN上にNextCloud環境を構築することにより、セキュアなWeb会議環境が作れるのが魅力だと感じています。

[https-portal](https://github.com/SteveLTN/https-portal)
https-portalはDockerで起動する、httpsリバースプロキシになります。
既存のwebページに特に手を加えることもなく、httpsリバースプロキシを立てられるという便利なコンテナです。
https-portalのDockerイメージはIntel系のみ動作するようです。
**Raspberry Pi等、AMD系のCPUでは動かないようですので注意が必要です。**

https-portalが必要となった理由は、NextCloudでWeb会議を行う場合、https接続が必須との条件によるものです。

#この投稿をした理由
タイトルのDocker+NextCloud+https-portalの構成例がネット上に見つからなかったので投稿しました。
興味はあるので試したい。でも環境は汚したくない。って人をターゲットにしています。

# 参考URL
非常に参考になりました。秀逸な記事をありがとうございました。
[NextcloudをDockerで構築する手順](https://www.virment.com/setup-nextcloud-docker/)
[NextCloudをDockerでデプロイする(SMB対応)](https://qiita.com/devoimo/items/b0c399a8dc8282cab9cb)
[https-portalで簡単https対応！](https://qiita.com/Yuttti/items/2a985174583e71ba46a0)


# 環境
CentOS Linux release 7.7.1908 (Core)
Docker version 1.13.1, build cccb291/1.13.1
docker-compose version 1.22.0, build f46880fe
NextCloud 19.0.0
https-portal 1.11.0

# 構築手順

といってもDockerなので・・・
適当なディレクトリを掘って、docker-composeで起動します。
（丁寧に説明しても、みんな結論だけ知りたいのだろうし・・・）

````:/root
# mkdir NextCloud
# cd NextCloud
````

````docker:docker-compose.yml
version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password # 適当なパスワードを設定
      - MYSQL_PASSWORD=password      # 適当なパスワードを設定
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
#    ports:
#      - 80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - app
    restart: always
    environment:
      # DOMAINS: 'localhost.example.com -> http://app:80'
      DOMAINS: 'litmus.local -> http://app:80'
      # DOMAINS: 'litmus.local'
      STAGE: local
#    volumes:
#      - ./org-chimata-ssl-certs:/var/lib/https-portal
````
STAGE は local,staging,productionのいずれかが指定できます。
Let's encryptを使用することができますが、今回はお試しですので、
オレオレ証明書になるlocalを指定しています。

app:のportのところにコメントがありますが、あえて残してます。
不要ですよ。という意味です。

https-portalのvolume:にもコメントを残しています。
この部分は作成した証明書を保存する場合の記述方法とのことでしたが、
当方の環境ではpermisson deniedでうまく動いてくれませんでした。


必要に応じてポートを開けます。

````:ファイアウォールポートの追加（恒久的な追加）
# firewall-cmd --add-port=80/tcp --zone=public --permanent 
# firewall-cmd --add-port=443/tcp --zone=public --permanent 
# firewall-cmd --reload
success
````

````:docker-composeで起動
# docker-compose up -d

(省略)

Starting nextcloud_db_1 ... done
Starting nextcloud_app_1 ... done
Starting nextcloud_https-portal_1 ... done
````

今回はDNSに登録せず、hostsファイルの登録で対応します。
ip a s などでサーバ側のIPアドレスを確認します。
また、hostnameなどで、自ホストネームを確認します。

````:例
[root@litmus NextCloud]# hostname
nextcloud.local
[root@litmus NextCloud]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:02:94:07 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.174/24 brd 192.168.2.255 scope global noprefixroute dynamic eth0
       valid_lft 19064sec preferred_lft 19064sec
    inet6 fe80::5b0e:38df:1ea7:53b2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
````

クライアント側をwindowsとして、hostsファイルを設定します。
メニュー＞Windows システムツール＞コマンド プロンプト＞（右クリック）＞その他＞管理者として実行

````:hostsファイルの更新
c:\WINDOWS\system32
notepad drivers\etc\hosts 
````

````
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost
192.168.2.174 nextcloud.local # <-確認したIPアドレス、hostnameを追加
````

クライアント側のWindowsでブラウザを起動します。
起動したらアドレスバーに、https://nextcloud.local とタイプし、接続できれば成功です。

接続出来たらDBの設定をします。

画面に、「SQLiteを選択しました・・・」というメッセージが出力されますのでDBを指定します。

画面中央の「ストレージとデータベース▼」をクリックします。

出てきた項目の「データベースを選択してください」で「MySql/MariaDB」を選択します

データベースのユーザ名：nextcloud  **<-docker-compose.ymlで指定したMYSQL_USER(ごめん。MYSQL_ROOT_PASSWORDかも。)**
データベースのパスワード:nextcout  **<-docker-compose.ymlで指定したMYSQL_PASSWORD**
データベース名：nextcloud         **<-docker-compose.ymlで指定したMYSQL_DATABASE**
localhost：db:3306               **<-mariadbのデフォルトポート。「db」はdocker-compose.ymlの指定情報**

「セットアップを完了します」をクリックします。

※管理者アカウントのユーザ／パスワードは任意です。

# デバッグ
うまくつながらない場合もあるかもしれませんのでデバッグ方法をメモします。

##https-portalを外してやり直します。
とりあえずコンテナの停止

````
# docker-compose down
````

````:docker-compose-yml
version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password # 適当なパスワードを設定
      - MYSQL_PASSWORD=password      # 適当なパスワードを設定
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 80:80
#   ↑コメント外れてます
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

#  https-portal:
#    image: steveltn/https-portal:1
#    ports:
#      - "80:80"
#      - "443:443"
#    depends_on:
#      - app
#    restart: always
#    environment:
#      # DOMAINS: 'localhost.example.com -> http://app:80'
#      DOMAINS: 'litmus.local -> http://app:80'
#      # DOMAINS: 'litmus.local'
#      STAGE: local
#    volumes:
#      - ./org-chimata-ssl-certs:/var/lib/https-portal
````

起動します。

````
# docker-compose up -d
````

上記はhttps-portalを除外しています。
ブラウザでhttp://nextcloud.local で接続してください。 <- http **s**ではなくhttpであることに注意

NextCloudの画面が出れば、NextCloud側には問題がないということになります。

##https-portalだけにして確認します。

とりあえずコンテナの停止

````
# docker-compose down
````

https-portalだけにします。

````:docker-compose-yml
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - app
    restart: always
    environment:
      # DOMAINS: 'localhost.example.com -> http://app:80'
      DOMAINS: 'litmus.local -> http://app:80'
      # DOMAINS: 'litmus.local'
      STAGE: local
    volumes:
      - ./org-chimata-ssl-certs:/var/lib/https-portal
````

起動します。

````
# docker-compose up -d
````

ブラウザでhttp **s**://nextcloud.local で接続してください。 <- http ではなくhttp **s**であることに注意

nginxの初期画面が表示されるようであればhttps-portalは正常に動いています。


## それでもダメな時

まずdocker logs で各コンテナのログを確認してください。

````
# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                      NAMES
cc73024b476b        steveltn/https-portal:1   "/init"                  45 minutes ago      Up 43 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nextcloud_https-portal_1
75eee3b780e3        nextcloud                 "/entrypoint.sh ap..."   2 days ago          Up 43 minutes       80/tcp                                     nextcloud_app_1
d4bd53696f14        mariadb                   "docker-entrypoint..."   2 days ago          Up 43 minutes       3306/tcp                                   nextcloud_db_1

# docker logs -f --tail="20" nextcloud_https-portal_1
# docker logs -f --tail="20" nextcloud_app_1
# docker logs -f --tail="20" nextcloud_db_1
````

エラーメッセージが出ていないか確認して下さい。

##Raspberry Piでお試しになっている場合は注意してください。
https-portalはRaspberry Piでは動かないようです。
vmware、Hyper-V等でwindows上に仮想環境を用意し、Intel系のCPUで再度お試しください。