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, ),