ownCloud10からNextcloud 31へ

事の起こりは、Ubuntu環境を最新のPHP 8.5にアップデートしたことでした。安定稼働していた ownCloud 10.15 が、新しすぎるPHP環境では動かなくなり、ついにNextcloudへの完全移行を決意。しかし、そこには数年分におよぶ「メジャーバージョンの巨大な溝」が横たわっていました。

Step 1:phpenvの挫折とDockerという救世主

最初は古いPHP 7.4を phpenv でビルドしようと試みましたが、PHP公式サイトの404エラーにより頓挫。ここで方針を180度転換し、「ホストOSを汚さず、必要なPHP環境をコンテナで使い分ける」 Docker作戦を採用しました。

Step 2:最初の難関、コンテナとホストの「対話」

最初のターゲットはNextcloud 20。Dockerコンテナの中からホスト側のMySQLに接続し、かつファイルの所有権(UID 33: www-data)を同期させる必要がありました。

  • 解決策: --network host を使用してホストのMySQLを 127.0.0.1 で叩き、chown -R 33:33 でコンテナ内のユーザーと権限を一致させました。

Step 3:ガードレールの破壊(コードハック)

Nextcloudには「一度に1つ上のメジャーバージョンまでしか上げられない」という強力な安全装置があります。

  • ハック: config.php のバージョンを偽装(10.0.10や19.0.0など)してもデータベース側のチェックで弾かれるため、最終的には lib/private/Updater.php 内の 「例外を投げるコード」を直接コメントアウト
  • 結果: ついにチェックを素通りさせ、ownCloudからNextcloud 20へのデータベース変換に成功しました。

Step 4:アップグレード・マラソンの完走

20系からは、「ソースコードの入れ替え」→「Dockerイメージの差し替え」→「occ upgradeの実行」 という黄金サイクルを確立しました。

  • 21 → 22 → … → 30 と、Dockerタグを1つずつ上げながら階段を登る。
  • 各ステップで Maintenance mode を解除しつつ、整合性を保ちながら最新版へと近づけました。

Step 5:PHP 8.5 最終決戦

最終ステップのNextcloud 31では、ついにDockerを離れ、ホストOSのPHP 8.5で直接起動を試みました。しかし、ここでも「PHPが新しすぎる」という制限が。

  • 対応: lib/versioncheck.php を書き換えてPHP 8.5を許可
  • 最後の敵: Internal Server Error(APCuモジュールの不足)が発生
  • 終結: config.php から一時的にキャッシュ設定(APCu)をオフにする

結び:エンジニアリングは「諦めないこと」

ownCloudという過去の遺産を、最新のPHP 8.5とNextcloud 31という縛りも色々あるなかアップグレードを繰り返しし何とか最新にすることができました。

メモ書き:

  • 最終的な構成: Ubuntu 24.04 (or 26.04) / PHP 8.5.3 / Nextcloud 31.0.14

コメント

タイトルとURLをコピーしました