Macでは、比較的簡単にNextcloudを動かす事ができました。
今度は、Docker for Windowsで動かしてみたいと思います。
バージョンは、17.03.1を使いました。新しいバージョンを使う理由があります。以前は、Windowsではdocker execが使えず、大変不便でした。しかし、このバージョンでは、execを使ってコンテナ内でbashが使えます。素晴らしい!
Doker for Windowsのインストール
- Docker for Windowsをインストールします。
よくわからない場合は、こちらの記事をご参照下さい。 - Dockerの設定→Shared Drivesを開きます。Nextcloudを運用するディスクドライブで、Sharedを有効にします。
下図は、CドライブのSharedを有効にしたところです。C:\docker\nextcloudフォルダで動かそうと思います。
※18.11.23追記:この設定を行った時点で、Cドライブが丸ごとネットワーク共有されてしまいます。dokcerがsmb(ファイル共有サービス)を使用するためのようです。運用上のリスクが無いかどうか、ご注意下さい。
Nextcloudのインストール
- Nextcloudを運用するフォルダを作成します。
mkdir nextcloud; cd nextcloud
- Nextcloudの公式リポジトリ情報を拝見すると。
docker-composeを使う場合の例は、こちらのページを参照とあります。
docker-compose.yamlとnginx.confファイルをダウンロードして使用させて頂きます。 - docker-compose.yamlファイルを編集します。SSLを使う場合の問題の記事を参考に、portsとvolumes行を追加します。MYSQL_ROOT_PASSWORDもここで指定します。
version: '2' networks: lb_web: external: true back: driver: bridge services: web: image: nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./certs:/etc/nginx/certs:ro links: - app volumes_from: - app environment: - VIRTUAL_HOST networks: - back - lb_web ports: - 80:80 - 443:443 app: image: nextcloud:fpm links: - db volumes: - ./data/apps:/var/www/html/apps - ./data/config:/var/www/html/config - ./data/data:/var/www/html/data networks: - back db: image: mysql volumes: - ./mysql/runtime:/var/lib/mysql environment: # - MYSQL_ROOT_PASSWORD MYSQL_ROOT_PASSWORD: <mysqlのパスワード> networks: - back cron: image: nextcloud:fpm links: - db volumes_from: - app user: www-data entrypoint: | bash -c 'bash -s <<EOF trap "break;exit" SIGHUP SIGINT SIGTERM while /bin/true; do /usr/local/bin/php /var/www/html/cron.php sleep 900 done EOF' networks: - back
※17.9.20追記:「nextcloud:11-fpm」を「nextcloud:fpm」に変更しました。すでにバージョン11をダウンロードして利用している場合、docker-compose downで停止→「nextcloud:fpm」に書換えてから、こちらの方法(502 Bad Gatewayの時)で最新バージョンに更新できるようです。
- nginx.confファイルを編集します。SSLを使う場合の問題の記事を参考にSSL対応に書き換えます。listen, ssl_certificate, ssl_certificate_key行を追加します。
user www-data; events { worker_connections 768; } http { upstream backend { server app:9000; } include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80; listen 443 ssl; ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; # Add headers to serve security related headers add_header X-Content-Type-Options nosniff; add_header X-Frame-Options "SAMEORIGIN"; 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; root /var/www/html; location = /robots.txt { allow all; log_not_found off; access_log off; } location = /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; } location = /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; } client_max_body_size 1G; fastcgi_buffers 64 4K; gzip off; index index.php; error_page 403 /core/templates/403.php; error_page 404 /core/templates/404.php; location / { rewrite ^ /index.php$uri; } location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { deny all; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) { include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; #Avoid sending the security headers twice fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass backend; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ ^/(?:updater|ocs-provider)(?:$|/) { try_files $uri/ =404; index index.php; } # Adding the cache control header for js and css files # Make sure it is BELOW the PHP block location ~* \.(?:css|js)$ { try_files $uri /index.php$uri$is_args$args; add_header Cache-Control "public, max-age=7200"; # Add headers to serve security related headers (It is intended to # have those duplicated to the ones above) # Before enabling Strict-Transport-Security headers please read into # this topic first. # add_header Strict-Transport-Security "max-age=15768000; # includeSubDomains; preload;"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options "SAMEORIGIN"; 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; # Optional: Don't log access to assets access_log off; } location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ { try_files $uri /index.php$uri$is_args$args; # Optional: Don't log access to other assets access_log off; } } }
- SSLのキーペアを作成するために、OpenSSLをインストールします。
こちらからバイナリをダウンロードしてインストールします。
Win64のLight版で問題ありませんでした。
- DLLのインストール先はbinを指定します。
- インストールが完了したら、システム環境変数のPathを編集。
- 一番下に、OpenSSLインストール先のbinフォルダを追加します。
- キーペアを作成します。
cd C:\docker\nextcloud mkdir certs cd certs openssl req -new -x509 -nodes -out server.crt -keyout server.key
- dockerを起動すると「ネットワークがない」エラーが出るので、予めネットワークを作っておきます。
docker network create lb_web
- docker-composeを起動します。
docker-compose up -d
- 全てのコンテナが起動しているかどうか、確認します。
docker-compose ps
- Webブラウザで、Nextcloudにアクセスします。
https://localhost
502 Bad Gatewayが表示されても、しばらく待ってからアクセスし直してみてください。起動に数分かかるようです。
しばらく経つと、初期設定画面が表示されます。日本語に対応していますね。
- 設定情報を入力し、「セットアップを完了します」をクリックします。
- すると・・・・またチミかね!
owncloudをインストールしたときと同じエラーが。
Docker for Windowsのトラブルシューティングの一番最初のところに、「Docker for Windowsの共有ボリュームは0755のパーミッション。変えられない。SMBを使ってるから。」という記述があります。回避策として、nextcloudのphpを変更します。 - コマンドプロンプトから、nextcloudのappコンテナの中でbashを起動します。
docker-compose exec app bash
- エディタ(nanoやvim)をインストールします。
apt-get update; apt-get -y install nano vim
- エディタで、util.phpを編集します。
nano lib/private/legacy/util.php
926行付近 ‘0’を’5’に変えます。2箇所あります。
編集前:if (substr($perms, -1) != '0') { chmod($dataDirectory, 0770); clearstatcache(); $perms = substr(decoct(@fileperms($dataDirectory)), -3); if (substr($perms, 2, 1) != '0') {
編集後:
if (substr($perms, -1) != '5') { chmod($dataDirectory, 0775); clearstatcache(); $perms = substr(decoct(@fileperms($dataDirectory)), -3); if (substr($perms, 2, 1) != '5') {
※18.7.26追記:Docker バージョン18.06.0の場合、次のように変更する必要がありました。
if (substr($perms, -1) != '7') { chmod($dataDirectory, 0777); clearstatcache(); $perms = substr(decoct(@fileperms($dataDirectory)), -3); if (substr($perms, 2, 1) != '7') {
- Nextcloudのメイン画面が表示されましたでしょうか?
前回、ownCloudをインストールした時と似た流れでしたが。
今回は、Docker for windowsが新しくなり、execが使えるようになりました。そのため、コンテナの中でphpを編集する事ができて、設定が少し楽になりました。
実用になりますでしょうか・・・試してみましょう!
※17.11.9追記
util.phpにパッチを適用する方法
dockerをリセットした時など、パーミッション0770エラーが再発する場合があります。その時、util.phpをすぐに書換えられるように、次の内容のパッチファイル(util.php.patch)を用意しておくと便利です。
967c967
< if (substr($perms, -1) !== '0') {
---
> if (substr($perms, -1) !== '5') {
971c971
< if ($perms[2] !== '0') {
---
> if ($perms[2] !== '5') {
- docker psでnextcloudのappコンテナのIDを確認します
- パッチファイルをコピーします
docker cp util.php.patch <コンテナID>:/tmp
- appコンテナでbash実行
docker-compose app bash
- パッチを適用します
/usr/bin/patch /var/www/html/lib/private/legacy/util.php < /tmp/util.php.patch