nextCloudをdockerで導入し、NginXでリバースプロキシをかけてサブディレクトリでアクセスする

## 前提

1. `docker`、`docker-compose`はインストールされているものとします。
2. 作業フォルダとファイル構成は以下ファイルツリーの通りです。
3. <a href="#docker-compose.yml">`docker-compose.yml`</a>、<a href="#nc.conf">`config/nc.conf`</a>は下記の通りあらかじめ用意しておきます。

```:ファイルツリー
workdir
├─docker-compose.yml
├─config
│   └─nc.conf
└─data
```
<a href="#docker_compose.yml"></a>

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

volumes:
  nc:
  db:

services:
  nginx:
    container_name: nginx
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./config/nc.conf:/etc/nginx/conf.d/default.conf
    links:
      - nc:nc

↓↓↓↓↓↓↓ あなたの記事の内容
  nc:
    container_name: nc
    image: nextcloud
    links:
      - db
    volumes:
      - nc:/var/www/html

  db:
    container_name: nc_db
    image: mariadb
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root   #
      - MYSQL_PASSWORD=root        # 左記のままでは防御力弱そうなので、
      - MYSQL_DATABASE=nextcloud   # ユーザ名とパスワードは変えましょう
      - MSYQL_USER=nextcloud       #
───────
nc:
  container_name: nc
  image: nextcloud

db:
  container_name: nc_db
  image: mariadb
  volumes:
    - db:/var/lib/mysql
  environment:
    - MYSQL_ROOT_PASSWORD=root   #
    - MYSQL_PASSWORD=root        # 左記のままでは防御力弱そうなので、
    - MYSQL_DATABASE=nextcloud   # ユーザ名とパスワードは変えましょう
    - MYSQL_USER=nextcloud       #
↑↑↑↑↑↑↑ 編集リクエストの内容
```
<a href="#nginx.conf"></a>

```nginx:config/nc.conf
server {
  listen 80;
  server_name _;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  location / {
    rewrite /nc/(.*)$ /$1 break;
    proxy_pass http://nc;
  }
}
```

## コンテナの作成

```sh:手順1
cd workdir
sudo docker-compose up -d
```

`nginx`コンテナと`nc`（nextCloud）コンテナ、`db`（mariaDB）コンテナが作成され、バックグラウンドで起動します。

## nextCloudサーバの設定

本来なら`docker-compose.yml`ファイルから設定できないとあまり意味がないのですが、今回は解決方法がわからなかったので手動で直しました。😅
~~きれいな解決方法でないので、うまいやり方がわかり次第、記事を更新します。~~
今回更新した手順は、だいぶきれいだと思います！

```sh:手順2
# 上記 docker-compose の続きとします
docker-compose exec nc bash

# 以下は nc コンテナの内部での作業です
# 仮想端末を使っているのなら5行まとめてコピペでOK
cp /usr/src/nextcloud/config/config.sample.php /usr/src/nextcloud/config/config.php 
sed -i -e "s/'dbuser' => ''/'dbuser' => 'nextcloud'/" /usr/src/nextcloud/config/config.php
sed -i -e "s/'dbpassword' => ''/'dbpassword' => 'nextcloud'/" /usr/src/nextcloud/config/config.php 
exit
;
```

`http://<物理サーバIP>/nc/`にアクセスするとnextCloudが起動します。
`<物理サーバIP>`は`192.168.0.32`（docker toolbox for windows の場合は`192.168.99.100`）など、適宜インストールしたサーバのものと読み替えてください。

## 初期セットアップ

`http://<物理サーバIP>/nc/`にアクセスすると、データベースの初期設定を終えるまでは以下の画面が表示されます。
設定内容は、`docker-compose.yml`に合わせて入力して下さい。

「ユーザー名」と「データベースのホスト名」に割と引っかけなプレースホルダが表示されていますが、画像の下の説明を見ながら入力して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76242/c2d68807-7e52-33eb-f2ae-810a93ef2dc2.png)

- ユーザー名：admin （公開サーバの場合は、安全のため別のものにすること）
- パスワード：admin （公開サーバの場合は、安全のため別のものにすること） 
- データフォルダー：/var/www/html/data （デフォルトのまま）
- データベースのユーザ名；`root` （`MYSQL_ROOT_PASSWORD`で指定したもの。公開サーバの場合は、安全のため別のものにすること）
- データベースのパスワード：`root` （`MYSQL_PASSWORD`で指定したもの。公開サーバの場合は、安全のため別のものにすること）
- データベース名：`nextcloud` （`MYSQL_DATABASE`で指定したもの）
- データベースのホスト名（localhost）：`db:3306` （`docker-comopse.yml`で指定したものにポート番号を指定する）

## おわりに

VPSのWebシェルを利用しているため、コピペが簡単にできず手打ちで記事を書きました。
おそらくtypoのひとつやふたつあると思われますので、動かない等不具合がありましたら、編集リクエストまたはコメントでお知らせください。

### 2019.12.07 追記：

docker toolbox for Windows 用に手順を変更しました。docker ならどの環境でもいけると思いますが。