【Docker】Nextcloud の警告を潰すメモ2【Nextcloud】

はじめに

サーバーの再構築の際、Nextcloud で出ていた警告も解決したのでメモって起きます。
前回

更新が必要です config.phpでブラウザ経由でのアップデートが無効になっていますので、コマンドラインアップデーターをご利用ください。

テストで動作確認し、データベースや volume を本番環境に持って来ると、「更新が必要です」から進めなくなってました。

不明すぎるのでドキュメントを確認してみる。が、見つけれないためググってみました。

こちら様を参考に解決しました。

Docker で動かしているため、コンテナに侵入する。

$ docker exec -it <コンテナの名前> bash

occ upgrade を実行、怒られる。

# php occ upgrade
Console has to be executed with the user that owns the file config/config.php
Current user id: 0
Owner id of config.php: 33
Try adding 'sudo -u #33' to the beginning of the command (without the single quotes)
If running with 'docker exec' try adding the option '-u 33' to the docker command (without the single quotes)

あぁ、以前にも怒られたな。デジャブかな?
気を取り直し侵入し直す。

// コンテナから出る
# exit

// www-data 権限 #33 で入りなおす
$ docker exec -u 33 -it <コンテナの名前> bash

更新し、メンテナンスモード解除

// 更新
# php occ upgrade

// メンテナンスモード解除
# php occ maintenance:mode --off

// コンテナから出る
# exit

無事ログイン画面に遷移しました。

ログイン後の警告群

一つ潰した後のスクリーンショットなので、項目が少ないですが…

データベースがトランザクションファイルロックに使われています。パフォーマンスをあげるには、可能であればメモリーのキャッシュを設定してください。 詳細については、ドキュメント↗を参照してください。

ドキュメント

MySQL がファイルの排他処理に使われているから、遅いしメモリキャッシュ使ってね。ってことだと思うが、メモリキャッシュの Redis の概念を知らないので、そこから勉強することに…

Gemini 先生に聞いてみる。こちら

メモリ上に構築されたデータベース、シンプルな構造でシングルスレッドで動くようです。

アプリごとに Redis を構築するのが一般的のようで、Nextcoud の コンテナに追加することにしました。
redis: を追加してます。
(注意)ポート割当や名前解決・データベースは別のコンテナで動かしているので、この docker-compose.yml は単体では動かないです。nextcloud の設定部分は省いてます。

version: "3.7"

services:
  nextcloud-app:
    container_name: nextcloud
    image: nextcloud:latest
    networks:
      - front_bridge
      - back_bridge
      - default
    environment:
      - MYSQL_HOST=docker-mysql:3306
      - REDIS_HOST=redis-nextcloud
      - REDIS_PORT=16379
      (省略)
    depends_on:
      - redis
    volumes:
      - nextcloud.d:/var/www/html
    restart: always

  redis:
    container_name: redis-nextcloud
    image: redis:latest
    ports:
      - 16379:6379
    volumes:
      - redis.d:/data
    restart: always


networks:
  front_bridge:
    external: true
  back_bridge:
    external: true

volumes:
  nextcloud.d:
  redis.d:

redis を構築し、nextcloud の environment へ指定すると自動で使ってくれるようです。

動作確認は redis コンテナに redis-cli で侵入し INFO を実行する。

// redis コンテナに侵入
$ docker exec -it redis-nextcloud redis-cli

// INFO を実行
> INFO
# Server
redis_version:7.2.4
redis_git_sha1:00000000
redis_git_dirty:0
...
# Keyspace
db0:keys=90,expires=8,avg_ttl=1157449

問題なく動いてそう。

サーバーにはメンテナンスウィンドウの開始時間が設定されていません。これは、リソースを多く使用する日常のバックグラウンドジョブが、メインの利用時間中にも実行されることを意味します。利用者がこれらの重いタスクによる負荷の影響を受けにくくするために、低い利用時間に設定することをおすすめします。 詳細については、ドキュメント↗を参照してください。

ドキュメント

ドキュメントにあるように 設定してみる。

// #33 でコンテナに侵入する
$ docker exec -u 33 -it nextcloud bash

// occ で設定する
# php occ config:system:set maintenance_window_start --type=integer --value=1

// コンテナから出る
# exit

このインスタンスには、いくつかの推奨 PHP モジュールがありません。パフォーマンスと互換性を向上させるために、これらをインストールすることを強くお勧めします: bz2. 詳細については、ドキュメント↗を参照してください。

ドキュメント

bzip2 圧縮ライブラリがインストールされてないので、インストールする。

// コンテナに侵入する
$ docker exec -it nextcloud bash

// apt でインストールしてみる
# apt update
# apt install php-bz2

怒られた

Package php-bz2 is a virtual package provided by:
 php8.2-bz2 8.2.7-1~deb12u1 [Not candidate version]

E: Package 'php-bz2' has no installation candidate

// 諦めてコンテナから出る
# exit

Gemini さんに聞いても同じことを繰り返すので、Bing さんに聞いてみる。

// コンテナに侵入する
$ docker exec -it nextcloud bash

// bzip2 圧縮ライブラリ追加 & 有効化
# apt update
# apt-get install -y libbz2-dev && docker-php-ext-install bz2

// コンテナから出る
# exit

// コンテナの再起動
$ docker restart nextcloud

うまくいきました。

Gimini さんは相談しやすいけど、よくに嘘つきます。最近は「専門家に相談することをお勧めします。」と他人に丸投げする傾向があります。
Bing さんは喋るのが遅いけど精度が高い気がします。回数制限がなければ良いのですがね…
質問はいくつかの AIチャットをハシゴして聞き周り、比較・検証するのが良いですね。

スッキリ

すべて解決しました。スッキリした。