NextCloudをDockerでデプロイする(SMB対応)

NextCloudを使ってみようと思ったのですが、公式のDockerイメージだけでは外部ストレージとしてSMBが利用できなくて少し詰まったので、メモとして残します。

apt-getでsmbclientのみをインストールする方法もあるみたいですが、ファイルサーバ側でSMBv1/CIFSを無効化していると「Protocol negotiation failed: NT_STATUS_CONNECTION_RESET」というエラーが出て接続できませんでした。

# 環境
Fedora release 30

# 前提
docker/docker-composeが使えること。

# 作業
適当なディレクトリを作成し、Dockerfileとdocker-compose.ymlを作成する。
ボリュームのマウント場所が気に入らない場合は修正してください。

```text:Dockerfile
FROM nextcloud:apache
RUN apt-get update && apt-get install -y libsmbclient-dev smbclient && pecl install smbclient && docker-php-ext-enable smbclient
```

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

services:
  db:
    image: postgres:11-alpine
    restart: always
    volumes:
      - /dockerdata/nextcloud/db:/var/lib/postgresql/data
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: #適当なパスワード
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud

  app:
    build: ./
    ports:
      - 8080:80
    volumes:
      - /dockerdata/nextcloud/app:/var/www/html
    restart: always
    depends_on:
      - db
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: #適当なパスワード
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_HOST: db:5432

```

起動

```
docker-compose build --pull
docker-compose up -d
```



確認/adminユーザー作成(数分放置)
http://localohost:8080
![2resized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/7ad3fd52-be3c-1843-6ea2-b44e3504be27.png)

ログインしたら「アプリ>あなたのアプリ>External storage support」を有効にする
![3resized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/059699ea-8971-ad00-72fe-1cec9b6a984c.png)

「設定>管理>外部ストレージ」でファイルサーバの情報を入力してチェックマークをクリックで完了。
![1resized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/22dfc613-3b0e-3cd5-ad5e-fb029e8d31ee.png)



# httpsでインターネットに公開する
リバースプロキシ+Let's Encryptで暗号化し、その後ろにNextCloudをぶら下げます。
インターネット側から80/443で実行しているホストにアクセスできること、利用するドメインが名前解決できることが前提です。
リバースプロキシに後から別のコンテナをぶら下げられるようにネットワークはexternalにしておきます。

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

services:
  db:
    image: postgres:11-alpine
    restart: always
    volumes:
      - /dockerdata/nextcloud/db:/var/lib/postgresql/data
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: #適当なパスワード
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud

  app:
    build: ./
    expose:
      - 80
    volumes:
      - /dockerdata/nextcloud/app:/var/www/html
    restart: always
    depends_on:
      - db
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: #適当なパスワード
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_HOST: db:5432
      VIRTUAL_HOST: #あなたのドメイン名
      LETSENCRYPT_HOST: #あなたのドメイン名
      LETSENCRYPT_EMAIL: #メアド

  nginx-proxy:
    image: jwilder/nginx-proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - /dockerdata/nginx-proxy/certs:/etc/nginx/certs:ro
      - /dockerdata/nginx-proxy/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    volumes:
      - /home/web/wordpress/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

networks:
  default:
    external:
      name: shared
```

# 補足
自宅サーバなどで公開したい場合のDDNS設定を書きました。
[Route53+MyDNSでサーバを公開する(複数サブドメイン/自動IP報知/Let's Encrypt対応)](https://qiita.com/devoimo/items/3935875e81670d15eace)