NextcloudをDockerでお手軽に構築してみる


# 概要
OSSのオンラインストレージサービス「Nextcloud」をDockerで構築してどのように使えるのか確認してみます

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

# Nextcloud立ち上げ
まずNextcloudのコンテナを立ち上げて、ブラウザからアクセスをしてみます

イメージはOfficial Imageが用意されているのでこちらを使います
https://hub.docker.com/_/nextcloud

また、Apacheとfpmのイメージがありますが、今回は起動してすぐに使えるApacheのイメージを使います

``` docker-compose.yml
version: '2'
services:
  web:
    image: nextcloud:16.0.5-apache
    ports:
      - "8080:80"
```

docker-compose.ymlを作成し、コンテナを起動します

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

これでNextcloudが立ち上がったので、ブラウザでアクセスしてみます

http://localhost:8080

<img width="2160" alt="スクリーンショット 2019-09-28 18.14.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/f1d4f83f-c57c-127b-a5a5-c65ad5b97cdf.png">

初回アクセス時には管理者アカウントの作成とDBの初期設定を行う画面が表示されるので、
一旦DBはこのままで管理者アカウントを入力してセットアップを完了します

<img width="2160" alt="スクリーンショット 2019-09-28 18.19.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/07756e5e-d8bd-fca5-fae9-6ef8d9799e66.png">

セットアップ完了後、作成した管理者でログインした状態でトップページが表示されます

デフォルトでサンプルファイルがいくつか用意されています

<img width="2160" alt="スクリーンショット 2019-09-28 18.23.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/cac76cea-4f26-5e53-bd90-af27dbaae89b.png">

PDFファイルを選択すると、内蔵されたビュワーで表示されます

<img width="2160" alt="スクリーンショット 2019-09-28 18.25.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/6462e068-2570-6aa6-a480-260ac24778d6.png">

テキストファイルを選択すると、エディターが表示されてそのまま編集することができます

その他にもNextcloudにはアプリというものが用意されており、
プラグインのような形で機能の追加や画面のカスタマイズを行うことができます

# DBとの連携
NextcloudではDBにSQLite, MySQL, MariaDB, PostgreSQLを使用することができ、
先ほどは別途環境を用意しなくても良いSQLiteでセットアップを行いましたが、
本番環境でも使用できるようにPostgreSQLのコンテナを立ち上げて接続を行います

まず先ほどのコンテナを一度落としておきます

```
$ docker-compose down
```

docker-compose.ymlを以下のように変更します

``` docker-compose.yml
version: '2'
services:
  web:
    image: nextcloud:16.0.5-apache
    volumes:
      - webdata:/var/www/html
    ports:
      - "8080:80"

  db:
    image: postgres:11.5-alpine
    ports:
      - "5432:5432"
    volumes:
      - dbdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret

volumes:
  webdata:
  dbdata:
```

コンテナを落としてもデータを永続化できるようにデータボリュームを追加しています

この状態で再度コンテナの立ち上げを行います

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

コンテナが起動したらブラウザでアクセスします

http://localhost:8080

先ほどと同じように管理者アカウントを入力し、ストレージとデータベースをクリックして以下のように入力します

- データベース：PostgreSQL
- ユーザー名：postgres
- パスワード：secret
- データベース名：nextcloud
- ホスト名：db:5432

※データベース名はここで入力したものをセットアップ時に自動作成してくれるため、
事前に作成しておく必要はありません

セットアップが完了すると先ほどと同じようにトップページが表示されます

DBのコンテナに入って見てみるとテーブルなどが作成されていることが確認できます

```
bash-5.0# psql -U postgres nextcloud
psql (11.5)
Type "help" for help.

nextcloud=# \d
                          List of relations
 Schema |                 Name                 |   Type   |  Owner   
--------+--------------------------------------+----------+----------
 public | oc_accounts                          | table    | oc_admin
 public | oc_activity                          | table    | oc_admin
 public | oc_activity_activity_id_seq          | sequence | oc_admin
 public | oc_activity_mq                       | table    | oc_admin
 public | oc_activity_mq_mail_id_seq           | sequence | oc_admin
 public | oc_addressbookchanges                | table    | oc_admin
 public | oc_addressbookchanges_id_seq         | sequence | oc_admin
 public | oc_addressbooks                      | table    | oc_admin
 public | oc_addressbooks_id_seq               | sequence | oc_admin
 public | oc_appconfig                         | table    | oc_admin
 public | oc_authtoken                         | table    | oc_admin
 public | oc_authtoken_id_seq                  | sequence | oc_admin
 public | oc_bruteforce_attempts               | table    | oc_admin
 public | oc_bruteforce_attempts_id_seq        | sequence | oc_admin
 public | oc_calendar_invitations              | table    | oc_admin
 public | oc_calendar_invitations_id_seq       | sequence | oc_admin
 public | oc_calendar_resources                | table    | oc_admin
 public | oc_calendar_resources_id_seq         | sequence | oc_admin
 public | oc_calendar_rooms                    | table    | oc_admin
 public | oc_calendar_rooms_id_seq             | sequence | oc_admin
 public | oc_calendarchanges                   | table    | oc_admin
 public | oc_calendarchanges_id_seq            | sequence | oc_admin
 public | oc_calendarobjects                   | table    | oc_admin
 public | oc_calendarobjects_id_seq            | sequence | oc_admin
 public | oc_calendarobjects_props             | table    | oc_admin
 public | oc_calendarobjects_props_id_seq      | sequence | oc_admin
 public | oc_calendars                         | table    | oc_admin
 public | oc_calendars_id_seq                  | sequence | oc_admin
 public | oc_calendarsubscriptions             | table    | oc_admin
 public | oc_calendarsubscriptions_id_seq      | sequence | oc_admin
 public | oc_cards                             | table    | oc_admin
 public | oc_cards_id_seq                      | sequence | oc_admin
 public | oc_cards_properties                  | table    | oc_admin
 public | oc_cards_properties_id_seq           | sequence | oc_admin
 public | oc_collres_accesscache               | table    | oc_admin
 public | oc_collres_collections               | table    | oc_admin
 public | oc_collres_collections_id_seq        | sequence | oc_admin
 public | oc_collres_resources                 | table    | oc_admin
 public | oc_comments                          | table    | oc_admin
 public | oc_comments_id_seq                   | sequence | oc_admin
 public | oc_comments_read_markers             | table    | oc_admin
 public | oc_credentials                       | table    | oc_admin
 public | oc_dav_shares                        | table    | oc_admin
 public | oc_dav_shares_id_seq                 | sequence | oc_admin
 public | oc_directlink                        | table    | oc_admin
 public | oc_directlink_id_seq                 | sequence | oc_admin
 public | oc_federated_reshares                | table    | oc_admin
 public | oc_file_locks                        | table    | oc_admin
--More-- 
```