Docker で NextCloud & OnlyOffice 環境を構築した時の備忘録

はじめに
---
Docker で NextCloud ＆ OnlyOffice 環境を構築した時の備忘録。

基本的には以下のサイトの手順に従う。
[How to Easily Integrate OnlyOffice and NextCloud Using Docker](https://www.linuxbabe.com/docker/onlyoffice-nextcloud-integration-docker)

が、OSが違ったり、手順通りでうまくいかなかったところがあるので。

【環境、使用ソフトなど】
・さくらVPS
・CentOS7
・Docker
・NextCloud 
・OnlyOffice 
・Let's Encrypt

ドメインの取得、DNS設定
---
httpsでのアクセスが基本となるようなので、あらかじめドメインを取得してさくらVPSへのDNS設定をしておく。
今回はとりあえずお試しということで無料の
[freenom](https://my.freenom.com/)
を使用。

まずはユーザ登録、ドメイン取得。
このあたりは参考になるページがいくつもあるので、割愛。
![01_freenom.png](https://qiita-image-store.s3.amazonaws.com/0/285246/cd0f2425-2f1c-4fe2-cf21-c6a87e22ed34.png)

こんな感じでドメインとさくらVPSのIPアドレスを紐付けるAレコードを登録する。

さくらVPSの設定
---
さくらVPSで、CentOS7をインストールし、基本設定を行う。
このあたりも参考サイトがあるので、実際に実行したコマンドだけ雑に列挙。

・CentOS7を選択してOSインストール
　スタートアップスクリプトは選択しない。

・インストール済みのパッケージをアップデート

```
# yum update
```

・日本語化、結果確認

```
# localectl set-locale LANG=ja_JP.UTF-8
# localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
```

・ユーザ追加

```
# useradd ユーザ名
```

・パスワード設定

```
# passwd ユーザ名
→パスワードを設定
```

・権限の設定

```
# usermod -G wheel ユーザ名
```

・追加したユーザでsudoできるように設定

```
# visudo
```

```
## Allows people in group wheel to run all commands
#%wheel  ALL=(ALL)       ALL　　　←この行がコメントアウトされていたら、コメントアウトを解除。
```

```
# vim /etc/pam.d/su
```

```/etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid　　　　←この行がコメントアウトされていたら、コメントアウトを解除。
auth            substack        system-auth
```

参考：[基本設定 | 初心者でもわかる！さくらVPS | Sakura VPS 設定マニュアル](http://www.xn--vps-073b3a72a.com/4.html)

必要があれば、rootのパスワードの変更やログイン禁止なども適当に。
で、作業ユーザでログインし直す。

ポート開放
---
http,httpsのポートを開放する。

```
$ sudo firewall-cmd --zone=public --add-service=http --permanent	
$ sudo firewall-cmd --zone=public --add-service=https --permanent	
$ sudo firewall-cmd --reload	
$ sudo firewall-cmd --list-all		
	public (active)
	  target: default
	  icmp-block-inversion: no
	  interfaces: eth0
	  sources:
	  services: dhcpv6-client ssh http https　　←http,httpsが追加されている。
	  ports:
	  protocols:
	  masquerade: no
	  forward-ports:
	  source-ports:
	  icmp-blocks:
	  rich rules:
```

Dockerのインストール
---

すでにインストールされていたら削除

```
$ sudo yum remove docker docker-common docker-selinux docker-engine
```


最新バージョンをインストール

```
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum makecache fast
$ sudo yum install docker-ce
```

起動

```
$ sudo systemctl start docker
```

sudoグループに追加（sudoを付けなくてもdockerコマンドが使用できるように）

```
$ sudo groupadd docker
$ sudo usermod -aG docker ユーザ名
```
※ 「sudo groupadd docker」はすでに存在するため不要のはずだが、念のため。

自動起動の設定

```
$ sudo systemctl enable docker
```


OS再起動（念のため）

```
$ reboot
```

参考：[CentOS7にDockerをインストールする](https://qiita.com/inakadegaebal/items/be9fecce813cebec5986)

Docker Composeのインストール
---

インストール

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`
> uname -m` -o /usr/local/bin/docker-compose
→パスワード入力
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    752      0 --:--:-- --:--:-- --:--:--   752
100 11.2M  100 11.2M    0     0  1765k      0  0:00:06  0:00:06 --:--:-- 2677k
```

※ バージョンは、
　　https://github.com/docker/compose/releases
　　で確認できる。

実行権限付与

```
$ sudo chmod +x /usr/local/bin/docker-compose
```


確認

```
$ docker -v
Docker version 18.09.2, build 6247962
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
```

参考：[How to Easily Integrate OnlyOffice and NextCloud Using Docker](https://www.linuxbabe.com/docker/onlyoffice-nextcloud-integration-docker)

docker-onlyoffice-owncloudの設定
---

gitからファイル取得

```
git clone --recursive https://github.com/ONLYOFFICE/docker-onlyoffice-owncloud
cd docker-onlyoffice-owncloud
git submodule update --remote
```

docker-compose.ymlの設定

```
vi docker-compose.yml
```

5行目を「image: nextcloud:fpm」に変更する。

```docker-compose.yml
ersion: '3'
services:
  app:
    container_name: app-server
    image: nextcloud:fpm　　　　　←変更
    stdin_open: true
    tty: true
```

nginxブロックに「- /etc/letsencrypt:/etc/letsencrypt」を追記する。

```docker-compose.yml
  nginx:
    container_name: nginx-server
    image: nginx
    stdin_open: true
    tty: true
    restart: always
    ports:
      - 80:80
      - 443:443
    networks:
      - onlyoffice
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - app_data:/var/www/html
      - /etc/letsencrypt:/etc/letsencrypt　　　　　←追記
networks:
  onlyoffice:
    driver: 'bridge'

```

nginx.confの設定

```
vi nginx.conf
```

サーバブロックにサーバのドメインを追加する。

```nginx.conf
    server {
        listen 80;
↓↓↓↓↓↓↓↓↓追記
        server_name ドメイン名;
↑↑↑↑↑↑↑↑↑追記

        # Add headers to serve security related headers
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

```

dockerコンテナ起動
---

```
$ docker-compose up -d
```

確認

```
$ docker network ls
NETWORK ID          NAME                                  DRIVER              SCOPE
6ea1f4ff6067        bridge                                bridge              local
33d05649cf53        dockeronlyofficeowncloud_onlyoffice   bridge              local
56fe104ece72        host                                  host                local
d10e8d381e95        none                                  null                local
$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED              STATUS              PORTS                                      NAMES
b645decc529b        onlyoffice/documentserver:latest   "/bin/sh -c /app/onl…"   About a minute ago   Up About a minute   80/tcp, 443/tcp                            onlyoffice-document-server
5d0ed88e01c1        nginx                              "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-server
48192a961cbc        nextcloud:fpm                      "/entrypoint.sh php-…"   About a minute ago   Up About a minute   80/tcp, 9000/tcp                           app-server

```


http://ドメイン名.com
でサイトにアクセスできることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/285246/ea103ce3-11fb-d390-65a4-53ca559cccf7.png)
とりあえずここまででNextCloudの構築は成功。

※ Chromeで一度httpsで接続してしまうと、再構築後もhttpsにリダイレクトされてしまって接続できない現象が発生。その場合、以下を参考にHSTSを削除する。

　　[Chromeでhttpからhttpsへ強制リダイレクトされる場合の対処法](https://i-think-it.net/chrome-http-https-force-redirect-approache/)

Let's Encryptの設定
---

まずはインストール

```
$ sudo yum install epel-release
$ sudo yum install certbot
```


nginx.confにLet's Encryptアクセス用の定義を追加

```
vi nginx.conf
```

末尾にlocationを追加する。

```nginx.conf
        # Optional: Don't log access to other assets
        location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
            access_log off;
        }

↓↓↓↓↓↓↓↓↓追記
        location ~ /.well-known/acme-challenge {
            root /var/www/html/;
            allow all;
        }

        location ^~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            root         /var/www/html/;
        }
↑↑↑↑↑↑↑↑↑追記

    }
}
```

NGINX再起動

```
$ docker restart nginx-server
```
※ 参考サイトでは`location ~ /.well-known/acme-challenge {`の記載だったが、証明書の発行でエラーになった。
　　参考サイトのコメントに従って、`location ^~ /.well-known/acme-challenge/ {`も追加する。

証明書発行

```
$ sudo certbot certonly --webroot --agree-tos --email メールアドレス -d ドメイン名 -w /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data
```

こんなメッセージが出て、
/etc/letsencrypt/live/ドメイン名/fullchain.pem
/etc/letsencrypt/live/ドメイン名/privkey.pem
が生成されたら成功。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ドメイン名/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ドメイン名/privkey.pem
   Your cert will expire on 2019-05-25. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

nginx.confのサーバブロックにSSL証明書の設定を追加する。

```
vi nginx.conf
```

```nginx.conf
    server {
        listen 80;
        server_name ドメイン名;

↓↓↓↓↓↓↓↓↓追記
        listen 443 ssl http2;

#        if ($scheme != "https") {
#            return 301 https://$host$request_uri;
#        }

        ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
        ssl_session_cache shared:le_nginx_SSL:1m;
        ssl_session_timeout 1440m;

        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;

        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
↑↑↑↑↑↑↑↑↑追記

        # Add headers to serve security related headers
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
```


※ 構築後にスプレッドシートを開こうとすると、「文書を保存できませんでした。」のエラーになったので、参考サイトのコメントに従って、
　　`if ($scheme != "https") {  ・・・`
　　からの3行はコメントアウトする。

NGINX再起動

```
$ docker restart nginx-server
```

今度は「https://ドメイン名」でアクセスできること、証明書が有効になっていることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/285246/423fc120-bd0a-15e9-9535-c24d02ab9295.png)

【2019/05/20 追記】
証明書の自動更新の設定。
以下のコマンドで更新＆NGINX再起動し、有効期限が伸びていることを確認する。

```
sudo certbot certonly --webroot -w /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data -d ドメイン名
docker restart nginx-server
```

OKなら、コマンドをcronに登録し、cronを再起動。

```
sudo crontab -e
00 0 * * 0 certbot renew --post-hook "docker restart nginx-server"
sudo systemctl restart crond
```
※ ↑毎週日曜日の00:00に「certbot renew」を実行し、nginxを再起動。

これでOKなはず。（未確認。。。）

MariaDBの設定
---

インストール

```
$ docker run --restart=always --net docker-onlyoffice-owncloud_onlyoffice --name mariadb-server -e MYSQL_ROOT_PASSWORD=パスワード -d mariadb --log-bin --binlog-format=MIXED
```

※ 微妙にオプションが違ってた。Dockerのバージョンのせい？
　`--net dockeronlyofficeowncloud_onlyoffice`
→`--net docker-onlyoffice-owncloud_onlyoffice`

```
$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                      NAMES
a8669abf86cb        mariadb                            "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        3306/tcp                                   mariadb-server
bb915afe1f28        onlyoffice/documentserver:latest   "/bin/sh -c /app/onl…"   26 hours ago        Up 26 hours         80/tcp, 443/tcp                            onlyoffice-document-server
9446de803483        nextcloud:fpm                      "/entrypoint.sh php-…"   26 hours ago        Up 26 hours         80/tcp, 9000/tcp                           app-server
f311556e7c31        nginx                              "nginx -g 'daemon of…"   26 hours ago        Up 20 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-server
```

MariaDBのdockerにログイン

```
$ docker exec -it mariadb-server bash
```

MariaDBでデータベース作成など

```
mysql -u root -p 
→rootのパスワードを入力。
create database nextcloud;
create user nextclouduser@172.18.0.3 identified by 'パスワード';
grant all privileges on nextcloud.* to nextclouduser@172.18.0.3 identified by 'パスワード';
flush privileges;
exit;
exit
```
※ IPアドレスは「172.18.0.3」のはずだが、念のため確認する。
　`docker inspect app-server | grep IPAddress`

NextCloudにログイン
---

以下の設定を入力し、「セットアップを完了します」を選択する。
(管理者アカウント、パスワードは適当に設定。)

| |設定値 |
|:-----------------|:-----------------|
|データフォルダー|/var/www/html/data　※変更なし|
|データベース|MySQL/MariaDB|
|データベースのユーザー名|nextclouduser|
|データベースのパスワード|上で設定したパスワード|
|データベース名|nextcloud|
|localhost|mariadb-server|

NextCloudにログインできることを確認する。
あなたの全データの安全な家・・・。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/285246/fe0b6030-9263-0bd6-4722-17f66b821fb6.png)

OnlyOfficeとの連携
---

以下のコマンドを発行

```
$ sudo bash set_configuration.sh
```

以下のエラーになった。

```
  App "ONLYOFFICE" cannot be installed because it is not compatible with this
   version of the server.
```

onlyofficeを再取得して置き換える。

```
$ cd ..
$ sudo git clone --depth=1 https://github.com/ONLYOFFICE/onlyoffice-nextcloud.git onlyoffice
$ sudo mv onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
```

「ファイルが存在します」のエラーとなった。
cpならどうか。

```
$ sudo cp -rf onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
cp: ディレクトリではない `/var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/onlyoffice/.git' をディレクトリ `onlyoffice/.git' で上書きすることはできません
```

どうやら「.git」のファイルが邪魔しているらしい。
削除して再度cp。

```
$ sudo rm /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/onlyoffice/.git
$ sudo cp -rf onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
```

今度は成功したらしい。
で、再度コマンド発行。

```
$ cd docker-onlyoffice-owncloud
$ sudo bash set_configuration.sh
```

今度は成功。
NextCloudのページをリロードすると、SpreedSheetなどが作成可能になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/285246/92bad6b6-883e-ec69-8aed-5477571305d7.png)