Nextcloud の docker を使ったインストールと設定

VPS の Ubuntu 18.04 で行った。

Nextcloud のインストール

docker を使ってインストールした。

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=ROOTPASSWORD
      - MYSQL_PASSWORD=MYSQLPASSWORD
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 127.0.0.1:8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always
    environment:
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=MYSQLPASSWORD
      - MYSQL_DATABASE=nextcloud
      - MYSQL_HOST=db:3306

のように docker-compose.yml を作り

docker-compose up -d

とした。

nginx の設定

ここで、nginx は docker ではなく Ubuntu のパッケージを使用した。 nginx を reverse proxy として使い、Let’s Encrypt の SSL を利用した。 http でのアクセスは https に転送するようにした。

server{
    listen 80 default_server;
    listen [::]:80 default_server;

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

    location = /.well-known/carddav {
        return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location / {
        proxy_pass    http://localhost:8080/;
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host       $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        client_max_body_size 0;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
        add_header Referrer-Policy "same-origin";
    }
}

というようなファイルを /etc/nginx/sites-available に作り /etc/nginx/sites-enable にシンボリックリンクを張った。

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/html;
}

の部分は Let’s Encrypt 用に https に転送しないようにしている。また、

location = /.well-known/carddav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
}

の部分は https に転送していることによって URL がきちんと処理されないことを 修正するために加えてある。

service nginx restart

などとして読み込めば良い。 証明書が更新されたときに nginx のリロードをしないといけないので、cron で

42 2 * * * /bin/systemctl reload nginx.service

とした。

Nextcloud での cron の利用

docker でインストールした Nextcloud で cron を使うために https://help.nextcloud.com/t/cron-when-in-docker/11659/2 にあるように設定した。まず、

docker exec --user www-data nextcloud_app_1 php cron.php

が動くことを確認する。 root で

crontab -e

として次の行を加える。

*/15 * * * * /usr/bin/docker exec --user www-data nextcloud_app_1 php cron.php

Ubuntu のクライアント

apt install nextcloud-desktop

として Ubuntu 19.04 のアプリケーションをインストールしたが segmentation fault でまともに動かなかった。 PPA から次のようにしてインストールすれば問題なく動いた。

add-apt-repository ppa:nextcloud-devs/client
apt install nextcloud-client

ログイン時に毎回、Nextcloud のパスワードを求められていたのだが https://help.nextcloud.com/t/nextcloud-client-asks-for-password-every-time-it-starts/28591 にあるように

rm -v ~/.local/share/keyrings/*.keyring

とすれば解消した。

データベースが壊れる 2019-06-13

Nexcloud にブラウザでアクセスすると

Internal Server Error

The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.

と出て使えなくなった。

docker exec -it nextcloud_app_1 bash

でシェルに入れる。

ls -lha /var/log/apache2/

とすると

total 8.0K
drwxrwxrwx 2 www-data www-data 4.0K May  8 02:37 .
drwxr-xr-x 1 root     root     4.0K Jun  1 05:31 ..
lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 access.log -> /dev/stdout
lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 error.log -> /dev/stderr
lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 other_vhosts_access.log -> /dev/stdout

と出るので

docker logs -f nextcloud_app_1

で apache2 のログは見られるようだ。

docker exec --detach-keys "ctrl-^" -it nextcloud_db_1 bash

としてから

mysql -u root -p

として mysql にアクセスする。

use nextcloud;
show tables;

として、nextcloud のテーブル一覧を見ると

WARNING

しかなかった。

データベースが壊れたようなので、すべて削除して最初から作り直すことにした。 あまり使っていなかったのでバックアップなどは作らず、 インストール後にファイルを再びアップロードすることにした。

docker volume ls

でボリュームの名前を確認して

docker container rm nextcloud_db_1
docker container rm nextcloud_app_1
docker volume rm nextcloud_db
docker volume rm nextcloud_nextcloud

としてすべて削除した。 インストールは上述のように docker-compose を使った。

サンプルのファイルをなくす

Nextcloud にアカウントを作るとサンプルのファイルがあるが、 不要なのでサンプルのファイルをなくす設定を行った。 docker のシェルを使い config/config.php に

'skeletondirectory' => '',

を加えれば良い。docker のイメージに適当なエディタがインストールされていないようなので

sed -r "s/^\\);$/  'skeletondirectory' => '',\\n);/" config/config.php > config.php

として config.php を確認し

chown www-data config.php
mv config.php config/config.php

とする。

MariaDB のバックアップ

データベースが壊れても復旧できるように docker で動いている MariaDB のバックアップを作った。 データベースにアクセスするには

docker exec --detach-keys "ctrl-^" -it nextcloud_db_1 mysql -uroot -p

などとする。環境変数 MYSQL_ROOT_PASSWORD に MariaDB の root ユーザのパスワードを設定して

docker exec nextcloud_db_1 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > mariadb.sql

とするとバックアップができる。 データベースをこのファイルから復元するには

docker exec -i nextcloud_db_1 sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < mariadb.sql

とする。

files_texteditor を無効にする

files_texteditor を更新したら、動かなくなった。とりあえず

docker exec --user www-data nextcloud_app_1 php occ app:disable files_texteditor

で無効にした。

参考

Tags of current page

,