Docker for WindowsでNextcloudサーバ構築

Macでは、比較的簡単にNextcloudを動かす事ができました。

今度は、Docker for Windowsで動かしてみたいと思います。

バージョンは、17.03.1を使いました。新しいバージョンを使う理由があります。以前は、Windowsではdocker execが使えず、大変不便でした。しかし、このバージョンでは、execを使ってコンテナ内でbashが使えます。素晴らしい!


Doker for Windowsのインストール

  1. Docker for Windowsをインストールします。
    よくわからない場合は、こちらの記事をご参照下さい。

  2. Dockerの設定→Shared Drivesを開きます。Nextcloudを運用するディスクドライブで、Sharedを有効にします。
    下図は、CドライブのSharedを有効にしたところです。C:\docker\nextcloudフォルダで動かそうと思います。
    ※18.11.23追記:この設定を行った時点で、Cドライブが丸ごとネットワーク共有されてしまいます。dokcerがsmb(ファイル共有サービス)を使用するためのようです。運用上のリスクが無いかどうか、ご注意下さい。

Nextcloudのインストール

  1. Nextcloudを運用するフォルダを作成します。
    mkdir nextcloud; cd nextcloud
  2. Nextcloudの公式リポジトリ情報を拝見すると。
    docker-composeを使う場合の例は、こちらのページを参照とあります。
    docker-compose.yamlとnginx.confファイルをダウンロードして使用させて頂きます。
  3. 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の時)で最新バージョンに更新できるようです。

  4. 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;
        }
      }
    }
    
  5. SSLのキーペアを作成するために、OpenSSLをインストールします。
    こちらからバイナリをダウンロードしてインストールします。
    Win64のLight版で問題ありませんでした。
  6. DLLのインストール先はbinを指定します。
  7. インストールが完了したら、システム環境変数のPathを編集。
  8. 一番下に、OpenSSLインストール先のbinフォルダを追加します。
  9. キーペアを作成します。
    cd C:\docker\nextcloud
    mkdir certs
    cd certs
    openssl req -new -x509 -nodes -out server.crt -keyout server.key

    画面の指示に従い、必要な情報を入力します。

  10. dockerを起動すると「ネットワークがない」エラーが出るので、予めネットワークを作っておきます。
    docker network create lb_web

  11. docker-composeを起動します。
    docker-compose up -d

    イメージのダウンロードが始まります。

  12. 全てのコンテナが起動しているかどうか、確認します。
    docker-compose ps

    TCPポート80番と443番を使用します。

  13. Webブラウザで、Nextcloudにアクセスします。
    https://localhost
    502 Bad Gatewayが表示されても、しばらく待ってからアクセスし直してみてください。起動に数分かかるようです。
    しばらく経つと、初期設定画面が表示されます。日本語に対応していますね。
  14. 設定情報を入力し、「セットアップを完了します」をクリックします。
    • ユーザ名: 任意のユーザ名
    • パスワード: 任意のパスワード
    • データベースを設定してください: MySQL/MariaDBを選択
    • データベースのユーザ名:root
    • データベースのパスワード: docker-compose.yamlに記入したもの
    • データベース名: nextcloud
    • データベースのホスト名: db
  15. すると・・・・またチミかね!
    owncloudをインストールしたときと同じエラーが。
    Docker for Windowsのトラブルシューティングの一番最初のところに、「Docker for Windowsの共有ボリュームは0755のパーミッション。変えられない。SMBを使ってるから。」という記述があります。回避策として、nextcloudのphpを変更します。
  16. コマンドプロンプトから、nextcloudのappコンテナの中でbashを起動します。
    docker-compose exec app bash

  17. エディタ(nanoやvim)をインストールします。
    apt-get update; apt-get -y install nano vim
  18. エディタで、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') {
    
  19. 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') {
  1. docker psでnextcloudのappコンテナのIDを確認します
  2. パッチファイルをコピーします
    docker cp util.php.patch <コンテナID>:/tmp
  3. appコンテナでbash実行
    docker-compose app bash
  4. パッチを適用します
    /usr/bin/patch /var/www/html/lib/private/legacy/util.php < /tmp/util.php.patch
スポンサーリンク

フォローする

スポンサーリンク