カテゴリー: nextcloud Page 1 of 5

Ubuntu 24.04にNextcloudをインストール

Ubuntu 20.04もEOLを迎えたため、こちらのバージョンでのインストールを確認です。

前提

以下が稼働済みです。

  • OS: Ubuntu 24.04 LTS
  • データベース: MySQL 8.0 (Ubuntu 24.04 の標準リポジトリで利用可能)
  • Webサーバー: Apache 2.4 (Ubuntu 24.04 の標準リポジトリで利用可能)
  • ドメインと証明書: Nextcloud を設定するドメイン名と、それに対応する有効なSSL/TLSサーバー証明書(例: Let's Encrypt などで取得したもの)が準備されていること。

さっくりとした手順

※SSHログインし、ターミナルでの操作を行います。

  1. 必要なPHPパッケージ(PHP 8.3 と関連モジュール)をインストールします。
  2. PHPの設定(メモリ制限、OPcache、APCu)を行います。
  3. Nextcloud用のデータベースとユーザーを作成します。
  4. Nextcloudの最新版プログラムをダウンロードし、適切な場所に配置します。
  5. Nextcloudを動かすためのApache設定ファイルを設定します。
  6. Webブラウザで設定を行います。

必要パッケージをインストールします。

  • PHP・モジュールインストール
sudo aptitude install php8.3 php8.3-fpm php8.3-opcache php8.3-pdo php8.3-bcmath php8.3-calendar php8.3-ctype php8.3-fileinfo php8.3-ftp php8.3-gd php8.3-intl php8.3-json php8.3-mbstring php8.3-mysql php8.3-posix php8.3-readline php8.3-sockets php8.3-bz2 php8.3-tokenizer php8.3-zip php8.3-curl php8.3-iconv php8.3-xml php8.3-imagick php8.3-gmp php8.3-apcu libapache2-mod-php8.3
補足
  • php8.3-fpm: Apache で mod_php の代わりに PHP-FPM を使用する場合にインストールします。(今回は libapache2-mod-php8.3 を使っていますが、FPMの方がパフォーマンスや分離の点で推奨される場合もあります)。もしFPMを使う場合はApacheの設定も変わります。この手順ではlibapache2-mod-php8.3(mod_php)を前提とします。
  • php8.3-ldap: LDAP/AD連携を使用する場合にインストールしてください。
  • php8.3-dev: 通常の運用には不要ですが、PECLなどで拡張機能をコンパイルする場合に必要です。
  • Apache再起動
sudo systemctl restart apache2.service
  • PHPインストール確認
php -v

表示例:PHP 8.3.n

PHPの設定を行います。

Nextcloud のパフォーマンスと安定性のために、PHPの設定を調整します。

  • memcacheとAPCuの有効化
cd /etc/php/8.3/cli/conf.d

以下のファイルのように修正します。ない場合は、以下のように追記します。

cat <<- __EOF__ | sudo tee -a /etc/php/8.3/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.3/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.3/apache2/php.ini /path/to/backup/php.ini.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.3/apache2/php.ini 

差分が存在しないことにより、バックアップが取れていることを確認します。

  • sedによるファイル書き換え
sudo sed -i 's/memory_limit = .*/memory_limit = 512M/g' /etc/php/8.3/apache2/php.ini

memory_limitを推奨値の512Mに置き換えます。

  • 書き換え後の差分確認
diff -u  /path/to/backup/php.ini.$(date +%Y%m%d) /etc/php/8.3/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 WITH mysql_native_password BY 'YOUR_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;

★重要: YOUR_STRONG_PASSWORD は必ず推測されにくい強固なパスワードに変更してください。

IDENTIFIED WITH mysql_native_password BY は MySQL 8.0 で推奨される認証方式の一つです。

  • 追加した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】
# 中間証明書が発行元から別ファイルで提供されている場合は、この直上をコメントアウトして中間証明書を指定します

    # 推奨されるSSL/TLS設定 (Mozilla Intermediate Compatibility)
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder     on
    SSLCompression          off
    SSLSessionTickets       off # PFSを強化する場合

    # OCSP Stapling (パフォーマンス向上)
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

    # セキュリティヘッダー
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    Header always set Referrer-Policy "no-referrer"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Permitted-Cross-Domain-Policies "none"

</VirtualHost>
__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のポート番号)

推奨アプリのインストールに関しては、好みでスキップかインストールを行ってください。

インストールが完了したら、以下のような画面が出ます。

Nextcloud、ユーザー作成時に作成されるファイルを編集。

概要

企業内やコミュニティでNextcloudを運用する際のアカウント作成は割と簡単ですが、

{{thumbnail(clipboard-202503081731-br3pd.png, size=640)}}

このようにデフォルトのファイルがアカウントを作成するたびに増えていきます。

1アカウントにつき33MB程ではありますが、不要なファイルではあるので

  • 「アカウント作成時にファイルを作らない」
  • 「または特定のファイルやディレクトリを作る」

ように修正します。

環境

以下の環境で動作を確認。

  • Ubuntu 22.04
  • php 8.2
  • Nextcloud 30.6
  • Apache 2.4
  • MySQL

さっくりとした手順

  1. サーバにコンソールログインします。
  2. Nextcloudのルートディレクトリに移動します。
  3. ディレクトリ情報を修正します。
  4. Nextcloud(Apache)を再起動します。

Nextcloudのルートディレクトリに移動

cd /path/to/nextcloud/root/directory/core/skeleton && pwd

筆者環境/home/www-data/nextcloud/core/skeleton

ディレクトリ・ファイル情報修正

ここに、アカウント作成時に自動的に追加されるファイルが含まれています。

  • 'Nextcloud intro.mp4'
  • Photos
  • 'Reasons to use Nextcloud.pdf'
  • 'Templates credits.md'

等を消していきます。

例)

sudo rm 'Reasons to use Nextcloud.pdf'

任意の方法でファイル(マニュアルなど)をこのディレクトリに入れることで、アカウント作成時にそのファイルが追加されます。その場合は

sudo chown www-data hoge

として、ファイルの所有者をapache(nextcloud)の実行者に変えます。

設定変更確認

  • apache再起動
sudo systemctl restart apache2.service && echo $?

0を確認します。

  • apache再起動確認
systemctl status apache2.service

active(running)を確認します。

  • アカウント作成確認
  1. Nextcloudで管理者権限でログインします。
  2. 任意のアカウントを作成します。
  3. 作成したアカウントでログインします。
  4. 「ファイル」に進み、削除したファイルやディレクトリがないことと追加したファイルがあることを確認すれば設定できています。

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サーバの全体的な変更を伴います。作業は慎重に、可能な限り検証環境で試してからの反映を強く推奨します。

ややさっくりしない手順

  1. Nextcloudのメンテナンスモードを有効化します。
  2. Nextcloudで用いているDBのバックアップを取ります。
  3. PHP8.2をインストールします。
  4. PHP8.2の設定を行います。
  5. PHP8.1の無効化とPHP8.2の有効化を行います。
  6. 警告に対する対処を行います。
  7. Nextcloudのメンテナンスモードを無効化します。
  8. 復旧を確認します。

メンテナンスモードを有効化

  • 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

復旧確認

  1. 設定を行ったNextcloudにアクセスします。
  2. メンテナンスモードが解除されていることを確認します。
  3. 管理者権限でアクセスし、管理者設定から上記のエラーやワーニングがないことを確認します。

備考:切り戻し

何か不具合があった場合の切り戻し手順です。上記、メンテナンスモードを有効化してから行ってください。

  • 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

ファイルが無いことを確認します。

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

特記事項

データ格納ディレクトリを別パーティションにしています。

さっくりとした手順

  1. 切り戻し前のプログラムを退避させます。
  2. 切り戻しを行いたいプログラムをダウンロードします。
  3. プログラムを解凍して再配置します。
  4. コンフィグやアプリデータなどを再配置します。
  5. DBをリストアします。
  6. 切り戻しを確認します。

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

切り戻し確認

  1. Nextcloudに管理者権限でログインします。
  2. バージョンが切り戻し前に戻っていることを確認します。
  3. 主要な機能が使えることを確認します。

切り戻し後のデータ削除(必要に応じて)

  • 退避させたプログラムの削除
sudo rm -rf /path/to/backup/directory/nextcloud.$(date +%Y%m%d)
  • バックアップのSQLファイルの削除
rm /path/to/directory/nextcloud_backup.sql

思わぬ作業影響。

WebARENAにて新たなWebサービスを立ち上げようと思ったものの大失敗。

ちょっとハマってしまったので切り戻し。

しかし、同一サーバで稼働させているNextcloud上で、この謎の状況が起きました。

ロケールを en_US.UTF-8/fr_FR.UTF-8/es_ES.UTF-8/de_DE.UTF-8/ru_RU.UTF-8/pt_BR.UTF-8/it_IT.UTF-8/ja_JP.UTF-8/zh_CN.UTF-8 に設定できませんでした
これらのロケールのうちいずれかをシステムにインストールし、Webサーバーを再起動してください。

localectl 

を実行しても

System Locale: LANG=ja_JP.UTF-8
               LANGUAGE=ja_JP:ja
    VC Keymap: (unset)          
   X11 Layout: us
    X11 Model: pc105

と、正常な状況です。

何が起きたか?

新たに

  • perl
  • CGI

などを動かそうとパッケージをうにゃうにゃしていたときにこれが起きてしまったようです。

復旧

「転ばぬ先の杖」が功を奏しました。作業前にとっておいたスナップショットにより、作業前の状況に切り戻し。さながら「逆転時計(タイムターナー)」を起動させた気分です。

  • DB
  • データ

はバックアップを取ることで復旧できますが、新たなパッケージを動かしたときのようにシステム深奥まで影響を及ぼすような作業は全体のバックアップを取ることを学んで助かったという心境です。

Nextcloudのメンテナンス時に出てきたエラーに対処。

環境

  • Ubuntu 24.04
  • Nextcloud 29.8
  • PHP 8.3
  • MySQL 8.0.39
  • Apache 2.4

警告内容

Nextcloudのメンテナンスのため、以下のコマンドを実行。

sudo -u www-data php occ maintenance:repair

この警告が出たので対処をしていきます。

WARNING: Failed to create filecache trigger (compatibility mode will be used): Anng a query: SQLSTATE[HY000]: General error: 1419 You do not have the SUPER privilege andmight* want to use the less safe log_bin_trust_function_creators variable)
WARNING: ffmpeg binary could not be configured

DBのトリガー修正

mysqlの設定ファイルのバックアップ

サーバの要となるサービスです。バックアップは確実に行ってください。

  • ファイルバックアップ
sudo cp -pi /etc/mysql/mysql.conf.d/mysqld.cnf /path/to/backup/directory/mysqld.conf.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • ファイルのバックアップ確認
diff -u /path/to/backup/directory/mysqld.conf.$(date +%Y%m%d) /etc/mysql/mysql.conf.d/mysqld.cnf

エラーがなければバックアップは成功です。

設定ファイル書き換え

  • sedによるファイル書き換え
sudo sed -i '/\[mysqld\]/a log_bin_trust_function_creators = 1' /etc/mysql/mysql.conf.d/mysqld.cnf
  • 書き換え後の差分確認
diff -u /path/to/backup/directory/mysqld.conf.$(date +%Y%m%d) /etc/mysql/mysql.conf.d/mysqld.cnf
  • 差分
 [mysqld]
+log_bin_trust_function_creators = 1

設定反映

  • 反映前のサービス確認
systemctl status mysql.service

active(running)を格納します。

  • サービス再起動
sudo systemctl restart mysql.service
  • 反映後のサービス確認
systemctl status mysql.service

active(running)を格納します。

ffmgetのインストール

そもそもこのパッケージがインストールされていなかったので、

sudo aptitude install ffmpeg

として、パッケージをインストールします。

設定反映確認

  • Nextcloudのルートディレクトリに移動
cd /nextcloud/root/directory

自分の環境(/var/www/html/nextcloudなど)を指定します。

  • 設定確認
sudo -u www-data php occ maintenance:repair

冒頭のエラーがなければOKです。

AWS Lightsail → WebARENAへの移行完了。

はじめに

個人的に用いているVPSのコンテンツを、AWS LightsailからWebARENAへと移行完了。

今までUbuntu 20.04で動いていたサーバがUbuntu 24.04へと変わったことにより、Ubuntu 20.04のEOL対応を済ませたという形。

それぞれが、URLもそのままに、バージョンが上がった状態で表示されているという形です。

移行のきっかけ

Ubuntu 20.04のEOLが近づいてきた

これが一番の理由。Lightsailを最初に使い始めた頃は2022年5月だったので、まだ余裕があったのですが、そこから2年も経つとさすがに対応するしかないという形。

Lightsailにそのままインスタンスを移行させても良かったのですが

円安によるLightsail利用料高騰

という立ちはだかる壁があり、

  • 4GB Memory
  • 80 GB SSD

をもう一つ作り維持して行くには結構辛いものがありました。その上、

IPv4アドレスに追加料金

という更に手痛い値上げも発表されます。

迫るEOLに維持費の高騰、それをどうにかするために選んだのがWebARENAです。

WebARENAに切り替えた理由

利用費の安さ

https://web.arena.ne.jp/indigo

2024/10/12現在、

  • 4vCPU
  • 4GB Memory
  • 80GB SSD

で月額1630円。(筆者がサインアップしたときは1年間有効のクーポン付きでした)

Lightsailの24USD/月より安価なのは魅力的でした。

キャリア運営による回線の安定。

今回はNextcloudを使うと決めているだけに、回線が安定しているキャリア(docomo)のvpsを利用しました。

移行が思ったよりスムーズだった理由

元からデータをクラウドストレージに保存していた

これが一番大きかったです。クラウドストレージWasabiをs3でマウントしていたために、他のサーバに画像を転送する必要すらありませんでした。

また、mysqldumpの転送も、同じようにs3経由で引っ張るだけです。

サービス構築のメモを最初に残していた

冒頭の外部サイトやこのブログに

  • うまくいった手順
  • ハマったこと
  • 失敗した理由

など書いていたのが助かりました。手順を基本的にコピペで済むように済ませていたのも自賛する点です。

事前検証

この検証のように、別サーバに移行することをやっていたのもまた助かりました。

今後

最小限構成でのLightsailの転用

とはいえ、「LightsailのDNS機能」が有用であるため、一番安いインスタンスを残しつつ他の用途に使っていきます。

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

ファイルが無いことを確認します。

Mod_Securityで特定のルールを無視する設定(Nextcloudでの偽陽性を排除)

Nextcloudにmod_securityを導入するに当たり、気をつけなければならないのがファイルの閲覧や登録、入力処理中にMod_securityが不審な処理として判断してしまうこと(偽陽性)です。

そこで、

  1. 偽陽性と思われるログの調査
  2. 調査時の補助線引き
  3. 偽陽性になるルールを無視する設定

を行います。

ログ確認

/var/log/nextcloud_error.logから、以下のようなログを見ました。

[Wed Sep 11 16:35:02.048442 2024] [security2:error] [pid 32762:tid 32762] [client aaa.bbb.ccc.ddd:56994] [client aaa.bbb.ccc.ddd] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "92"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0"] [ver "OWASP_CRS/3.3.5"] [tag "event-correlation"] [hostname "nextcloud.hoge.com"] [uri "/ocs/v2.php/apps/user_status/api/v1/heartbeat"] [unique_id "ZuFIJU_udFaqxqrJvRLaPQAAAAA"]

ここで見たいのは

  • クライアントのIPアドレス
  • どのようなルールIDを
  • どのぐらい検知したか

です。

ログ確認のワンライナー

これらを確認するため、copilotの助けを借りてawkスクリプトを生成します。

awk '/ModSecurity/ {
ip = gensub(/.*\[client ([0-9.]+):.*/, "\\1", "g", $0);
rule_id = gensub(/.*\[id "([0-9]+)"\].*/, "\\1", "g", $0);
print rule_id, ip;
}' /var/log/nextcloud/nextcloud_error.log | sort | uniq -c

これを実行したところ、Mod_Securityがエラーとして検知したログの中から

     36 911100 127.0.0.1
    267 911100 aaa.bbb.ccc.ddd
     65 920420 aaa.bbb.ccc.ddd
     36 949110 127.0.0.1
    267 949110 aaa.bbb.ccc.ddd
     36 980130 127.0.0.1
    267 980130 aaa.bbb.ccc.ddd

という結果を確認しました。127.0.0.1はローカルアドレス、aaa.bbb.ccc.dddも自分がアクセスしてきたIPアドレス。この間、自分がしていたのはNextcloudの設定変更やファイルの閲覧のみです。

Mod_securityが検知したルールIDを「偽陽性」と判断し、処置していきます。

Mod_Securityで特定のルールを検知させない処理

Apacheのバーチャルサイトで設定しているという形です。

設定ファイルの修正

  • ファイルのバックアップ
sudo cp -ci /etc/apache2/sites-available/nextcloud.conf /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d)

設定ファイルやバックアップディレクトリは自分の環境に合わせます。

  • バックアップ確認
diff -u /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d) /etc/apache2/sites-available/nextcloud.conf

エラー無く、差分も表示されていなければバックアップは成功です。

  • ファイル修正

/etc/apache2/sites-available/nextcloud.confを以下のように修正していきます。(要root権限)

# Mod_security
## 最初は検知モード

SecRuleEngine DetectionOnly

## 偽陽性と判断したID
SecRuleRemoveById 911100
SecRuleRemoveById 920420
SecRuleRemoveById 949110
SecRuleRemoveById 980130
  • ファイル修正確認
diff -u /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d) /etc/apache2/sites-available/nextcloud.conf

SecRuleRemoveById IDで、これにマッチするパターンは無視します。

  • 差分例
 ## 最初は検知モード

 SecRuleEngine DetectionOnly
+
+## 偽陽性と判断したID
+SecRuleRemoveById 911100
+SecRuleRemoveById 920420
+SecRuleRemoveById 949110
+SecRuleRemoveById 980130
+
 </VirtualHost>

設定ファイルの設定反映

  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • 設定反映
sudo systemctl restart apache2.service
  • Apache稼働確認
systemctl status apache2.service

active(running)を確認します。

動作確認

ターミナルで

tail -f /var/log/nextcloud/nextcloud_error.log

としてエラーログを流します。(エラーログは自分の環境に合わせます)

  • 上記処理を行ったNextcloudにアクセスして操作をしていきます。
  • 処理を行ったIDが検知されないことを確認します。

Nextcloud Ver.29.05(?)でのうれしい改良点。

バージョンアップしたNextcloudに、ある意味で待っていた機能が改善されました。

見出しのマルチバイト対応。

なぜか、今まで、

# で見出しタグを指定した後に文字を入力しようとすると日本語で文字が入力できないというかなり厳しい事象がありました。

そのため、Markdwonの文書の書き出しは

  • テキストエディタでMarkdwon直打ち
  • ローカル環境のGrowiをコピペする
  • その上で、一度、Redmineのチケットにする

ぐらいしか手はありませんでしたですが、今回(かは不明ですが)のバージョンアップによって

このように、見出しの後にそのまま日本語入力ができます。

「オンラインで気兼ねなくメモを取れる」環境がほしかったので、これは大きな改善。

モバイルアプリなどを利用してのメモ書きの効率化も図れそうです。

Page 1 of 5

Powered by WordPress & Theme by Anders Norén