事の起こりは、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


コメント