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
で無効にした。
参考
- https://www.virment.com/setup-nextcloud-docker/
- https://docs.docker.com/network/links/
- https://kurafuto.homeip.net/index.php/linux/199-nextcloud-2
- https://help.nextcloud.com/t/cron-when-in-docker/11659/2