Nextcloud
OSSのオンラインストレージの
- インストール
- 設定
- アプリ
など
- Nextcloudインストール
- Ubuntu 20.04(22.04)にNextcloudをインストール
- Nextcloudインストール後の設定(Gmail連携)
- Nextcloudインストール後の設定(config修正とredis-server組み込み)
- Nextcloud運用
Nextcloudインストール
Ubuntu 20.04(22.04)にNextcloudをインストール
新たにインストールしたUbuntu20.04系/Ubuntu22.04サーバにNextcloudを導入します。
前提
以下が稼働済みです。
- Ubuntu 20.04
- Ubuntu 22.04でも動作を確認しました。
- MySQL 8.0.33
- Apache 2.4
また、設定するドメインに即したサーバ証明書があることを前提に本記事を作成しています。
さっくりとした手順
※SSHログインし、ターミナルでの操作を行います。
- PHPのレポジトリを追加して、Ubuntu20.04でもPHP8.xが使えるようにします。
- PHPの設定を行います。
- Nextcloud用のDBを作成します。
- Nextcloudのプログラムを適切な位置に配置します。
- Nextcloudを動かすためのApache設定ファイルを設定します。
- Webブラウザで設定を行います。
PHPレポジトリを追加して必要パッケージをインストールします。
- レポジトリ追加
sudo add-apt-repository ppa:ondrej/php
Ubuntu20.04系ではこれを行わないとPHP7.4系しかインストールされません。
- レポジトリ追加後のパッケージアプデート
sudo aptitude update
- PHPインストール
sudo aptitude install php8.1
- PHPモジュールインストール
sudo aptitude install php8.1-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,dev,imagick,gmp}
- Apache再起動
sudo systemctl restart apache2.service
- PHPインストール確認
php -v
表示例:PHP 8.1.21 (cli) (built: Jul 8 2023 07:09:57) (NTS)
PHPの設定を行います。
- memcacheとAPCuの有効化
cd /etc/php/8.1/cli/conf.d
cat <<- __EOF__ | sudo tee -a /etc/php/8.1/cli/conf.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
__EOF__
cat <<- __EOF__ | sudo tee -a /etc/php/8.1/cli/conf.d/20-apcu.ini
[apcu]
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
__EOF__
- php.iniバックアップ
sudo cp -pi /etc/php/8.1/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
- バックアップ確認
diff -u /etc/php/8.1/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)
差分が存在しないことにより、バックアップが取れていることを確認します。
- sedによるファイル書き換え
sudo sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php/8.1/apache2/php.ini
memory_limitを推奨値の512Mに置き換えます。
- 書き換え後の差分確認
diff -u /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.1/apache2/php.ini
- 差分
-memory_limit = 128M
+memory_limit = 512M
- apache 再起動
sudo systemctl restart apache2.service
NextcloudのDBを作成します。
- MySQLにroot権限でログイン
mysql -u root -p
- MySQLユーザ追加
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
- 追加したNextcloud用ユーザでログイン
mysql -u nextcloud -p
設定したパスワードでログインできることを確認します
- DB作成確認
SHOW DATABASES;
作成したデータベースnextcloudがあることを確認します
EXIT;
Nextcoludのプログラムを配置します。
- 作業用ディレクトリ移動
cd /hoge && pwd
任意の作業用ディレクトリを指定します。
- ファイル取得
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest
- Web公開用ディレクトリにファイル一式を移動
sudo mv nextcloud /home/www-data/
自分の環境に合わせます。(筆者はファイルサーバとして運用するので、/home領域に設置しました)
- 所有者変更
sudo chown -R www-data:www-data /home/www-data/nextcloud
Apacheの設定ファイルを作成します。
- ログディレクトリの作成
sudo mkdir /var/log/nextcloud
環境に合わせます。
- ディレクトリの所有者変更
sudo chown www-data:www-data /var/log/nextcloud
- nextcloud用の設定ファイル作成
- 【】部分は自分の環境に合わせます。
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
servername 【hoge.example.com】
# ドメイン名を指定します
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTPアクセスを強制的にHTTPSにリダイレクトします
</VirtualHost>
<VirtualHost *:443>
ServerName 【hoge.example.com】
# ドメイン名を指定します
CustomLog /var/log/nextcloud/nextcloud_access.log combined
ErrorLog /var/log/nextcloud/nextcloud_error.log
DocumentRoot 【/home/www-data/nextcloud】
# 自身の環境に合わせます
<Directory 【/home/www-data/nextcloud】>
# 自身の環境に合わせます
Options -MultiViews
AllowOverride All
Require all granted
</Directory>
#SSL設定
SSLEngine on
Protocols h2 http/1.1
# SSLを有効化します
SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
# SSL証明書を指定します
SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】
# 秘密鍵を指定します
# SSLCACertificateFile 【/etc/certs/hoge.example.com.CA.crt】
# 中間証明書が発行元から別ファイルで提供されている場合は、この直上をコメントアウトして中間証明書を指定します
#セキュリティヘッダー付与
Header always set Strict-Transport-Security "max-age=63072000"
Header set X-Content-Type-Options "nosniff"
Header always append X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
</VirtualHost>
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
__EOF__
- Apache設定ファイル反映
sudo a2ensite nextcloud.conf
- 設定ファイルのコンフィグ確認
sudo apache2ctl configtest
Syntax OKを確認します
- Apache再起動
sudo systemctl restart apache2.service
ブラウザ上でNextcloudのセットアップを行います。
- ブラウザでアクセス
ブラウザで、
http://設定したドメイン
にアクセスし、以下を確認してください。
- 以下のセットアップ画面が出ること。
- httpがhttpsとなっていること。
以下を入力して「インストール」をクリックします。
- ユーザ名:
- 管理者のユーザ名
- パスワード:
- 管理者パスワード
- データベースのユーザー名
- 作成したユーザー名(nextcloud)
- データベースのパスワード
- 設定したデータベースのパスワード
- データベース名
- 作成したデータベース(nextcloud)
- データベースのホスト名
- localhost:3306
- (MySQLのポート番号)
- localhost:3306
推奨アプリのインストールに関しては、好みでスキップかインストールを行ってください。
インストールが完了したら、以下のような画面が出ます。
Nextcloudインストール後の設定(Gmail連携)
Nextcloudインストール後に出てくるこの警告画面を一つずつ潰していきます。
メールサーバーの設定が未設定または未確認です。基本設定で設定を行ってください。その後、フォームの下にある「メールを送信」ボタンで設定を確認してください。
基本的に、Redmineと同じ方法でNextcloudはメールサーバの設定が可能になります。
前提
- Gmailのアプリパスワードを取得していること
- Nextcloudの個人設定でメールアドレスを登録していること
のみです。
管理>基本設定に進みます。
設定の前に
最終ジョブ実行は %s です。何か問題が発生しています。
と表示されていますが、これはまた別の機会に実施します。
メールサーバーの設定を行います。
- 送信モード
- SMTP
- 暗号化
- NONE/STRTLS
- 送信元アドレス
- Gmailアドレス
- サーバーアドレス
- smtp.gmail.com
- ポート
- 587
認証情報を入力します。
上記の設定後、「認証を必要とする」にチェックを入れます。
資格情報を入力する欄が出てきます。
- Username
- Gmailアドレス
- パスワード
- 発行したアプリパスワード
を入力後、保存をクリックします。
送信チェックをします。
「メールを送信」をクリックして、Nextcloudからのメールが送信されれば成功です。
Nextcloudインストール後の設定(config修正とredis-server組み込み)
メール設定後、Nextcloudのセキュリティ&セットアップ警告をまとめて対応します。
- データベースは取引ファイルを見ることに使われています。パフォーマンスをあげるには、可能であればメモリーのキャッシュを設定してください。
- ご使用のシステムには、デフォルトの電話地域が設定されていません。 メモリーキャッシュが構成されていません。
動作を確認した環境
- Ubuntu 20.04
- Apache 2.4系
- PHP8.1
- Nextcloud 27.0.2
- ※28.x系は別のエラーが出てきますが、今回の対象は上記の2つのメッセージです。
さっくりとした手順
- 追加パッケージ(redis-server)をインストールします。
- config.phpを追記・修正します。
- Apacheを再起動します。
追加パッケージのインストール
※Nextcloud 27系からキャッシュサーバの組み込みは推奨となりました。
- redisインストール
sudo aptitude install redis-server php8.1-redis
自分のPHPバージョンを付与することを忘れないようにしてください。(でないと、最新のPHPもインストールされます)
- redisインストール確認
systemctl status redis-server.service
active (running)を確認します
- hosts確認
cat /etc/hosts
を実行し、
127.0.1.1 localhost
と表示されていれば、
127.0.0.1 localhost
に修正します。Ubuntu20.04系はなぜかlocalhostを127.0.1.1と設定されるケースがありました。
コンフィグ追記
- ディレクトリ移動
cd /var/www/html/nextcloud/config && pwd
移動先は自身の環境に合わせます。
- バックアップ
sudo cp -pi config.php /path/to/backup/config.php.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
- バックアップ取得確認
sudo diff -u config.php /path/to/backup/config.php.$(date +%Y%m%d)
差分がなければバックアップは成功です。
- ファイル追記
教義、信仰に合わせたエディタで以下を追記して保存します。
注意点:最下行の);直上に追記します。
'default_phone_region' => 'JP',
'memcache.local' => '\OC\Memcache\APCu',
'filelocking.enabled' => true,
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'localhost',
'port' => 6379,
'timeout' => 3,
),
- ファイル差分確認
sudo diff -u /path/to/backup/config.php.$(date +%Y%m%d) config.php
# 先程保存したバックアップを指定します。
- 差分内容
+ 'default_phone_region' => 'JP',
+ 'memcache.local' => '\OC\Memcache\APCu',
+ 'filelocking.enabled' => true,
+ 'memcache.locking' => '\\OC\\Memcache\\Redis',
+ 'redis' =>
+ array (
+ 'host' => 'localhost',
+ 'port' => 6379,
+ 'timeout' => 3,
+ ),
);
Webサービス再起動
- サービス再起動
sudo systemctl restart apache2.service
- 再起動確認
systemctl status apache2.service
# active (running)を確認します。
設定反映確認
- Nextcloudに管理者権限でログインします。
- 管理>概要で冒頭のエラーが解消されていることを確認します。
Nextcloud運用
NextcloudのExternal StorageサービスでのArray to string conversionエラーに対処
エラー概要
Nextcloud 28.x以降にバージョンアップしてから、ログで以下が大量に出力され続けていました。
Array to string conversion at /var/www/html/nextcloud/lib/private/Files/Cache/Scanner.php#224
こちらの対処を行います。
エラーが出る要件
- Nextcloud 28.x以降を利用している。
- External Storageプラグインを利用している。
- このプラグインで、S3(乃至はS3互換のオンラインストレージ)をマウントしている。
- マウントしたストレージにファイルやフォルダを保存した。
詳細:Nextcloud Hub 8, copying files to an External Storage configured as primary storage isn't reliable
環境
- Ubuntu 20.04
- Nextcloud 29.0.0
- PHP 8.1
- Apache 2.4
- オンラインストレージサービスとしてwasabiを利用
解決策
上記issueに
Pretty sure this would be fixed by #43794. At least in my limited testing using the merge request as a patch: https://patch-diff.githubusercontent.com/raw/nextcloud/server/pull/43794.diff
とあったので、この通りに実施します。
さっくりとした手順
- rootに昇格します。
- パッチファイルを入手します。
- ファイルを適用します。
- Apacheを再起動します。
root昇格
sudo su -
Nextcloudはwww-dataユーザーのみアクセス可能と、厳しめのアクセス権が設定されているので、ここで昇格させます。
ディレクトリ移動
- Nextcloudのルートディレクトリに移動
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。
cd lib/private/Files/Cache
ファイルバックアップ
- Scanner.phpファイルのバックアップ
cp -pi Scanner.php /path/to/backup/directory/Scanner.php.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
- バックアップ確認
diff -u Scanner.php /path/to/backup/directory/Scanner.php.$(date +%Y%m%d)
差分がなければバックアップは成功です。
パッチ適用
- wgetでパッチ入手
sudo -u www-data wget https://patch-diff.githubusercontent.com/raw/nextcloud/server/pull/43794.diff
- パッチ適用
sudo -u www-data patch < 43794.diff
patching file Scanner.php
と返ってくればOKです。
パッチ適用確認
- 差分確認
diff -u /path/to/backup/directory/Scanner.php.$(date +%Y%m%d) Scanner.php
- 差分結果
}
// Only update metadata that has changed
- $newData = array_diff_assoc($data, $cacheData->getData());
-
+ // i.e. get all the values in $data that are not present in the cache already
+ // NOTE: we serialize then unserialize here because array_diff_assoc() doesn't
+ // support multidimensional arrays on its own (and otherwise internally casts any
+ // embedded array elements to attempt to compare them - not only generating warnings
+ // like "Array to string conversion" but also, as a resut, overlooking real differences)
+ $newData = array_diff_assoc(
+ array_map('serialize', $data),
+ array_map('serialize', $cacheData->getData())
+ );
+ $newData = array_map('unserialize', $newData);
+
// make it known to the caller that etag has been changed and needs propagation
if (isset($newData['etag'])) {
$data['etag_changed'] = true;
- Apache再起動
systemctl restart apache2.service
既にrootに昇格しているので、sudoは不要のはずです。
- パッチファイルを削除
rm 43794.diff
エラー解消確認
- ブラウザでNextcloudサイトに管理者権限でログインします。
- 管理メニュー→ログへと進み、適用時刻以降に冒頭のログが出力されていないことを確認します。
NextcloudのDB、照合順序を変更。
NextcloudのインストールでDBを作成す際に
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
としていました。
運用中、より正確な比較やソートが必要という判断をしたのでDBの照合順序をci(Case Insentive)ではなく、bin(Binary)に変更します。
DBを操作するため、作業前後にメンテナンスモードに入るとともに、ユーザーへの周知は徹底して行ってください。
メンテナンスモードを実行
- Nextcloudのルートディレクトリ移動
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud
)
- メンテナンスモード有効化
sudo -u www-data php occ maintenance:mode --on
- メンテナンスモード確認
運用中のNextcloudのURLにアクセスし、メンテナンスモードであることを確認します。
mysqldumpでバックアップを取得する
- 作業ディレクトリに移動
cd /hoge && pwd
任意のディレクトリを指定します。
- DBバックアップ作成
mysqldump -h localhost -u nextcloud -p --no-tablespaces --single-transaction nextcloud > nextcloud_backup.$(date +%Y%m%d).sql
DB名やユーザーは自分の環境に合わせます。
- DBバックアップ作成確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
DB設定変更
- 管理者権限でMySQLにログインする
mysql -u root -p
- 対象のDBを確認する
SHOW DATABASES;
nextcloudが動いているDBであることを再確認してください。
- データベース全体の照合順序を変更する
ALTER DATABASE nextcloud COLLATE utf8mb4_bin;
- 既存のデーテーブルの照合順序を変更する
USE nextcloud;
SET @DATABASE_NAME = 'nextcloud';
DB名は自分の環境に合わせます。
SET @COLLATE = 'utf8mb4_bin';
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE ', @COLLATE, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @DATABASE_NAME
AND TABLE_TYPE = 'BASE TABLE';
- MySQLから抜ける
EXIT
メンテナンスモードの解除を実行
- Nextcloudのルートディレクトリ移動
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud
)
- メンテナンスモード無効化
sudo -u www-data php occ maintenance:mode --off
- メンテナンスモード確認
運用中のNextcloudのURLにアクセスし、普通にアクセスできることを確認します。
切り戻し
何か不具合があった場合の切り戻し手順です。上記、メンテナンスモードを有効化してから行ってください。
- バックアップしたDBがあることを再確認する
ls -l /hoge/nextcloud_backup.$(date +%Y%m%d).sql
バックアップを行ったディレクトリを指定します。
head -100 /hoge/nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあること、平文で読めることを確認します。
- 管理者権限でMySQLにログインする
mysql -u root -p
- 対象のDBを確認する
SHOW DATABASES;
nextcloudが動いているDBであることを再確認してください。
- 不具合が発生したDBを削除する
二回ほど深呼吸して、落ち着いて作業しましょう。
DROP DATABASE nextcloud;
- DBを再作成する
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- MySQLから抜ける
EXIT
- DB復元
mysql -h localhost -u nextcloud -p nextcloud < /hoge/nextcloud_backup.$(date +%Y%m%d).sql
この後、メンテナンスモードを解除して、以前と同じ状態か確認します。
作業後:バックアップDBの削除
平文でSQLがサーバ上にあるのは危険な状態なので、以下の措置を執ります。
- 作業ディレクトリに移動
cd /hoge && pwd
バックアップを行ったディレクトリを指定します。
- DBバックアップ確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
- バックアップしたDBの削除
rm nextcloud_backup.$(date +%Y%m%d).sql
- DBバックアップ削除確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルが無いことを確認します。
Nextcloudの切り戻し(ダウングレード)手順。
Nextcloud、Webからアップグレードすることはできますが下位のメジャーバージョンにダウングレードすることはできません。
アップグレードの失敗ならびにアプリの相性などで元のバージョンに戻したい場合は以下のように切り戻しを行います。
(今回の筆者のパターンは前者です)
前提
アップグレード前のnextcloudのDBを取っていること
これがなければそもそも成り立ちません。この方法で日次のバックアップを取っていました。 取っていなかった場合は別のサイトをお探しください。
nextcloud_backup.sql
等のSQLを任意のディレクトリに格納してください。
環境
- Ubuntu 24.04
- Apache2.4
- php 8.3
- MySQL 8.0.39
- Nextcloud 29.0.8
特記事項
データ格納ディレクトリを別パーティションにしています。
さっくりとした手順
- 切り戻し前のプログラムを退避させます。
- 切り戻しを行いたいプログラムをダウンロードします。
- プログラムを解凍して再配置します。
- コンフィグやアプリデータなどを再配置します。
- DBをリストアします。
- 切り戻しを確認します。
Nextcloudの退避
- プログラム退避
sudo mv /home/www-data/nextcloud /path/to/backup/directory/nextcloud.$(date +%Y%m%d)
退避前、退避先はそれぞれ自分の環境に合わせます。
- 退避確認
ls -l /path/to/backup/directory/nextcloud.$(date +%Y%m%d)
退避先にディレクトリファイル一式があることを確認します。
切り戻し対象前のプログラムをダウンロード
- 作業用ディレクトリに移動
cd /hoge && pwd
任意のディレクトリを指定します。
- wgetによるダウンロード
wget https://download.nextcloud.com/server/releases/nextcloud-29.0.8.zip
切り戻しを行う(アップグレード前)のバージョンを指定します。
- 解凍
unzip nextcloud-29.0.8.zip
- 所有者変更
sudo chown -R www-data:www-data nextcloud
Nextcloud(Webサービス)実行ユーザーに合わせます。
- Nextcloud再配置
sudo mv nextcloud /home/www-data/
元々Nextcloudが配置されていたディレクトリに再配置します。
- 再配置確認
ls -l nextcloud /home/www-data/nextcloud
ディレクトリ・ファイル一式があることを確認します。
Nextcloud復旧
- 退避させた元のNextcloudからコンフィグをコピー
sudo cp -pi /path/to/backup/directory/nextcloud.$(date +%Y%m%d)/config/config.php /home/www-data/nextcloud/config/
- 退避させた元のNextcloudからアプリ一式をコピー
sudo -u www-data cp -r /path/to/backup/directory/nextcloud.$(date +%Y%m%d)/apps/* /home/www-data/nextcloud/apps/
- 退避させた元のNextcloudからデータ一式をコピー
sudo -u www-data cp -r /path/to/backup/directory/nextcloud.$(date +%Y%m%d)/data/* /home/www-data/nextcloud/data/
※データ格納ディレクトリを別のパーティションにしている場合は不要です。ディスクサイズによってはcp -r
の代わりにmv
を用いてください。
- DBからリストア
mysql -u nextcloud -p nextcloud < /path/to/directory/nextcloud_backup.sql
-u nextcloudのDBユーザ名
、-p nextloudDB名
です。バックアップのSQLファイルは自分の環境に合わせます。
- Webサービス再起動(Apacheの場合)
sudo systemctl restart apache2.service
- Webサービス再起動(nginxの場合)
sudo systemctl restart nginx.service
切り戻し確認
- Nextcloudに管理者権限でログインします。
- バージョンが切り戻し前に戻っていることを確認します。
- 主要な機能が使えることを確認します。
切り戻し後のデータ削除(必要に応じて)
- 退避させたプログラムの削除
sudo rm -rf /path/to/backup/directory/nextcloud.$(date +%Y%m%d)
- バックアップのSQLファイルの削除
rm /path/to/directory/nextcloud_backup.sql
Ubuntu 22.04でのNextcloudのPHPを8.1→8.2にバージョンアップ。
概要
- Ubuntu 22.04
- PHP 8.1
- Apache 2.4
- MySQL
環境でNextcloudを30.xの最新版にアップデート後、以下の警告が出ました。
One or more mimetype migrations are available. Occasionally new mimetypes are added to better handle certain file types. Migrating the mimetypes take a long time on larger instances so this is not done automatically during upgrades. Use the command
occ maintenance:repair --include-expensive
to perform the migrations.現在、あなたは PHP 8.1.31 を実行しています。PHP 8.1 は Nextcloud 30 では非推奨となっています。Nextcloud 31 では少なくとも PHP 8.2 が必要になる可能性があります。できるだけ早く、PHP グループが提供する公式にサポートされている PHP のバージョンにアップグレードしてください。 詳細については、ドキュメント↗を参照してください。
いくつかの欠落しているオプションのインデックスを検出しました。データベースのパフォーマンスを向上させるために、(Nextcloudまたはインストールされたアプリケーションによって)新しいインデックスが追加されることがあります。インデックスの追加には時間がかかり、一時的にパフォーマンスが低下することがあるため、アップグレード時には自動的には行われません。インデックスが追加されると、それらのテーブルへのクエリが速くなるはずです。インデックスを追加するには、
occ db:add-missing-indices
コマンドを使用してください。インデックスが不足: "fs_name_hash" テーブル内の "filecache". 詳細については、ドキュメント↗を参照してください。
これに対して対応を行います。
備考
Webサーバの全体的な変更を伴います。作業は慎重に、可能な限り検証環境で試してからの反映を強く推奨します。
ややさっくりしない手順
- Nextcloudのメンテナンスモードを有効化します。
- Nextcloudで用いているDBのバックアップを取ります。
- PHP8.2をインストールします。
- PHP8.2の設定を行います。
- PHP8.1の無効化とPHP8.2の有効化を行います。
- 警告に対する対処を行います。
- Nextcloudのメンテナンスモードを無効化します。
- 復旧を確認します。
メンテナンスモードを有効化
- Nextcloudのルートディレクトリ移動
cd /path/to/nextcloud/root/directory && pwd
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud
)
- メンテナンスモード有効化
sudo -u www-data php occ maintenance:mode --on
- メンテナンスモード確認
運用中のNextcloudのURLにアクセスし、メンテナンスモードであることを確認します。
mysqldumpでバックアップを取得する
- 作業ディレクトリに移動
cd /hoge && pwd
任意のディレクトリを指定します。
- DBバックアップ作成
mysqldump -h localhost -u nextcloud -p --no-tablespaces --single-transaction nextcloud > nextcloud_backup.$(date +%Y%m%d).sql
DB名やユーザーは自分の環境に合わせます。
- DBバックアップ作成確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
必要パッケージをインストールします。
- PHP8.2インストール
sudo aptitude install php8.2
→ 好みでaptitudeを用いています。aptでもOKです。
- PHPモジュールインストール
sudo aptitude install php8.2-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,dev,imagick,gmp}
- PHP8.2対応
sudo aptitude install libapache2-mod-php8.2
- PHP8.1無効化
sudo a2dismod php8.1
- PHP8.2有効化
sudo a2enmod php8.2
- Apache再起動
sudo systemctl reload apache2.service
- PHPアップグレード確認
php -v
表示例PHP 8.2.27 (cli) (built: Jan 2 2025 15:36:15) (NTS)
Nextcloudに併せたPHPの設定を行います。
- memcacheとAPCuの有効化
cd /etc/php/8.2/cli/conf.d
cat <<- __EOF__ | sudo tee -a /etc/php/8.2/cli/conf.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
__EOF__
cat <<- __EOF__ | sudo tee -a /etc/php/8.2/cli/conf.d/20-apcu.ini
[apcu]
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
__EOF__
- php.iniバックアップ
sudo cp -pi /etc/php/8.2/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。(筆者環境/etc/old/
)
- バックアップ確認
diff -u /etc/php/8.2/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)
差分が存在しないことにより、バックアップが取れていることを確認します。
- sedによるファイル書き換え
sudo sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php/8.2/apache2/php.ini
memory_limitを推奨値の512Mに置き換えます。
- 書き換え後の差分確認
diff -u /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.2/apache2/php.ini
- 差分
-memory_limit = 128M
+memory_limit = 512M
- apache 再起動
sudo systemctl restart apache2.service
Nextcloudの警告解消
- Nextcloudのディレクトリに移動
cd /path/to/nextcloud/root/directory && pwd
自分の環境に合わせます。
- DBリペア
sudo -u www-data php8.2 occ maintenance:repair --include-expensive
- DB追記
sudo -u www-data php8.2 occ db:add-missing-indices
- メンテナンスモード無効化
sudo -u www-data php8.2 occ maintenance:mode --off
復旧確認
- 設定を行ったNextcloudにアクセスします。
- メンテナンスモードが解除されていることを確認します。
- 管理者権限でアクセスし、管理者設定から上記のエラーやワーニングがないことを確認します。
備考:切り戻し
何か不具合があった場合の切り戻し手順です。上記、メンテナンスモードを有効化してから行ってください。
- PHP8.2無効化
sudo a2dismod php8.2
- PHP8.1有効化
sudo a2enmod php8.1
- Apache再起動
sudo systemctl restart apache2.service
- PHP切り戻し確認
php -v
→ 8.1に戻っていることを確認します。
- バックアップしたDBがあることを再確認する
ls -l /hoge/nextcloud_backup.$(date +%Y%m%d).sql
バックアップを行ったディレクトリを指定します。
head -100 /hoge/nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあること、平文で読めることを確認します。
- 管理者権限でMySQLにログインする
mysql -u root -p
- 対象のDBを確認する
SHOW DATABASES;
nextcloudが動いているDBであることを再確認してください。
- 本当に削除すべきDBかを確認する
SELECT COUNT(*) FROM nextcloud.oc_users;
- 不具合が発生したDBを削除する
二回ほど深呼吸して、落ち着いて作業しましょう。
DROP DATABASE nextcloud;
- DBを再作成する
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- MySQLから抜ける
EXIT
- DB復元
mysql -h localhost -u nextcloud -p nextcloud < /hoge/nextcloud_backup.$(date +%Y%m%d).sql
この後、メンテナンスモードを解除して、以前と同じ状態か確認します。
作業後:バックアップDBの削除
平文でSQLがサーバ上にあるのは危険な状態なので、以下の措置を執ります。
- 作業ディレクトリに移動
cd /hoge && pwd
バックアップを行ったディレクトリを指定します。
- DBバックアップ確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
- バックアップしたDBの削除
shred -u nextcloud_backup.$(date +%Y%m%d).sql
- DBバックアップ削除確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルが無いことを確認します。