NextcloudのWindowsアプリからフォルダの同期を行っている途中、~ Locked errorが度々表示されていました。Nextcloudはデフォルトだとmysqlを使用してロック管理をしていますが、高負荷時に問題がおこる場合があるようです。ファイルのロックにかかる問題を回避するために、Redisを導入してTransactional file lockingを有効にします。
Docker環境でRedisを有効にするにはdocker-conpose.ymlに、redisのイメージを追加し、nextcloudのenvironemntにREDIS_HOST、REDIS_HOST_PORT、REDIS_HOST_PASSWORDを、下記の様に追加します。
version: '3'
volumes:
nextcloud:
nextcloud-db:
nextcloud-redis:
services:
nextcloud-redis:
image: redis
ports:
- 6379:6379
volumes:
- ./redis:/data
nextcloud-db:
image: mariadb
...
nextcloud:
image: nextcloud
...
environment:
- REDIS_HOST=nextcloud-redis
- REDIS_HOST_PORT=6379
- REDIS_HOST_PASSWORD=${redis_password}
その後、以下のコマンドを実行します。
$ sudo docker-compose up -d
docker-compose.ymlの設定だけでは Transactional file locking は有効になっていません。./html/config/config.phpを編集して、「’filelocking.enabled’ => true,」を追記します。
'filelocking.enabled' => true,
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'nextcloud-redis',
'password' => '',
'port' => 6379,
),