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を作成する。
ボリュームのマウント場所が気に入らない場合は修正してください。
FROM nextcloud:apache
RUN apt-get update && apt-get install -y libsmbclient-dev smbclient && pecl install smbclient && docker-php-ext-enable smbclient
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
ログインしたら「アプリ>あなたのアプリ>External storage support」を有効にする
「設定>管理>外部ストレージ」でファイルサーバの情報を入力してチェックマークをクリックで完了。
httpsでインターネットに公開する
リバースプロキシ+Let's Encryptで暗号化し、その後ろにNextCloudをぶら下げます。
インターネット側から80/443で実行しているホストにアクセスできること、利用するドメインが名前解決できることが前提です。
リバースプロキシに後から別のコンテナをぶら下げられるようにネットワークはexternalにしておきます。
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対応)