Nextcloud

OSSのオンラインストレージの

など

Nextcloudインストール

Nextcloudインストール

Ubuntu 20.04(22.04)にNextcloudをインストール

新たにインストールしたUbuntu20.04系/Ubuntu22.04サーバにNextcloudを導入します。

前提

以下が稼働済みです。

また、設定するドメインに即したサーバ証明書があることを前提に本記事を作成しています。

さっくりとした手順

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

  1. PHPのレポジトリを追加して、Ubuntu20.04でもPHP8.xが使えるようにします。
  2. PHPの設定を行います。
  3. Nextcloud用のDBを作成します。
  4. Nextcloudのプログラムを適切な位置に配置します。
  5. Nextcloudを動かすためのApache設定ファイルを設定します。
  6. Webブラウザで設定を行います。

PHPレポジトリを追加して必要パッケージをインストールします。

sudo add-apt-repository ppa:ondrej/php

Ubuntu20.04系ではこれを行わないとPHP7.4系しかインストールされません。

sudo aptitude update
sudo aptitude install php8.1
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}
sudo systemctl restart apache2.service
php -v

表示例:PHP 8.1.21 (cli) (built: Jul 8 2023 07:09:57) (NTS)

PHPの設定を行います。

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__
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)

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

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
sudo systemctl restart apache2.service

NextcloudのDBを作成します。

mysql -u root -p
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;
mysql -u nextcloud -p

設定したパスワードでログインできることを確認します

SHOW DATABASES;

作成したデータベースnextcloudがあることを確認します

EXIT;

Nextcoludのプログラムを配置します。

cd /hoge && pwd

任意の作業用ディレクトリを指定します。

wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest
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
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__
sudo a2ensite nextcloud.conf
sudo apache2ctl configtest

Syntax OKを確認します

sudo systemctl restart apache2.service

ブラウザ上でNextcloudのセットアップを行います。

ブラウザで、

http://設定したドメイン

にアクセスし、以下を確認してください。

以下を入力して「インストール」をクリックします。

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

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

Nextcloudインストール

Nextcloudインストール後の設定(Gmail連携)

Nextcloudインストール後に出てくるこの警告画面を一つずつ潰していきます。

メールサーバーの設定が未設定または未確認です。基本設定で設定を行ってください。その後、フォームの下にある「メールを送信」ボタンで設定を確認してください。

基本的に、Redmineと同じ方法でNextcloudはメールサーバの設定が可能になります。

前提

のみです。

管理>基本設定に進みます。

設定の前に

最終ジョブ実行は %s です。何か問題が発生しています。

と表示されていますが、これはまた別の機会に実施します。

メールサーバーの設定を行います。

認証情報を入力します。

上記の設定後、「認証を必要とする」にチェックを入れます。

資格情報を入力する欄が出てきます。

を入力後、保存をクリックします。

送信チェックをします。

「メールを送信」をクリックして、Nextcloudからのメールが送信されれば成功です。

Nextcloudインストール

Nextcloudインストール後の設定(config修正とredis-server組み込み)

メール設定後、Nextcloudのセキュリティ&セットアップ警告をまとめて対応します。

動作を確認した環境

さっくりとした手順

  1. 追加パッケージ(redis-server)をインストールします。
  2. config.phpを追記・修正します。
  3. Apacheを再起動します。

追加パッケージのインストール

※Nextcloud 27系からキャッシュサーバの組み込みは推奨となりました。

sudo aptitude install redis-server php8.1-redis

自分のPHPバージョンを付与することを忘れないようにしてください。(でないと、最新のPHPもインストールされます)

systemctl status redis-server.service

active (running)を確認します

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)を確認します。

設定反映確認

  1. Nextcloudに管理者権限でログインします。
  2. 管理>概要で冒頭のエラーが解消されていることを確認します。

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

こちらの対処を行います。

エラーが出る要件

  1. Nextcloud 28.x以降を利用している。
  2. External Storageプラグインを利用している。
  3. このプラグインで、S3(乃至はS3互換のオンラインストレージ)をマウントしている。
  4. マウントしたストレージにファイルやフォルダを保存した。

詳細:Nextcloud Hub 8, copying files to an External Storage configured as primary storage isn't reliable

環境

解決策

上記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

とあったので、この通りに実施します。

さっくりとした手順

  1. rootに昇格します。
  2. パッチファイルを入手します。
  3. ファイルを適用します。
  4. Apacheを再起動します。

root昇格

sudo su -

Nextcloudはwww-dataユーザーのみアクセス可能と、厳しめのアクセス権が設定されているので、ここで昇格させます。

ディレクトリ移動

cd /var/www/html/nextcloud && pwd

自分の環境に合わせます。

cd lib/private/Files/Cache

ファイルバックアップ

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)

差分がなければバックアップは成功です。

パッチ適用

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;

systemctl restart apache2.service

既にrootに昇格しているので、sudoは不要のはずです。

rm 43794.diff 

エラー解消確認

  1. ブラウザでNextcloudサイトに管理者権限でログインします。
  2. 管理メニュー→ログへと進み、適用時刻以降に冒頭のログが出力されていないことを確認します。