proxmox のLXCにNextCloudサーバーを立てる

Memo
この記事は約19分で読めます。

背景

サーバー構成などの前情報はこちらを参照してください

proxmox で自宅サーバーを立て直した話
背景これまで TrueNAS Core をホストに色々なサービスを運用していたのですが、メンテナンスをサボりすぎたせいか、Jail内でパッケージのインストールや更新ができなくなってしまったりして、色々めんどうくさくなったのでいっそのこと完全…

概要

proxmox VE 8.3 のLXCコンテナ上に、NextCloud を立てます。
コンテナに割り振っているIPは 192.168.1.8 とします。

コンテナのテンプレートは「rockylinux-9-default_20240912_amd64」
メモリは4GB、プロセッサは2コア与えています。
コンテナストレージは16GBで、データ領域としてproxmoxホスト側で認識している12TBの領域をマウントします。

事前準備

以下を使用します。
テキストエディタに vim を導入していますが別に nano でも何でも好みのもので構いません。

[root@cloud ~]# dnf -y install vim
[root@cloud ~]# dnf -y install unzip

NextCloudの外部データストレージとして、proxmoxホストで認識しているZFSストレージのディレクトリをLXCコンテナにマウントします。
マウントが不要な場合はこれ関連の手順は不要です。

ホストのコンソールからコンテナの設定ファイルを開く

root@mcs2:~# nano /etc/pve/lxc/1008.conf

以下を追記
カンマの左側がホスト側のディレクトリ、右側がLXC側のマウントポイント

mp0: /raid-pool/jails/nextcloud,mp=/mnt

コンテナを再起動させて、マウントを反映させます。

後でNextCloudのデータ領域として、 /mnt/data を指定するのでディレクトリを作成しておきます。

[root@cloud ~]# mkdir /mnt/data

インストール

apache

まずはhttpサーバとしてapacheを導入します。

[root@cloud ~]# dnf -y install httpd

PHP

2025/2/24現在のNextcloud最新版のシステム要件は PHP8.3 が推奨となっています。
最新のシステム要件については以下を参照
https://docs.nextcloud.com/server/30/admin_manual/installation/system_requirements.html

dnf -y install php でインストールされるPHPは8.0なので、サードパーティリポジトリをインストールします

[root@cloud ~]# dnf install -y 'dnf-command(config-manager)'
[root@cloud ~]# dnf config-manager --set-enabled crb
[root@cloud ~]# dnf install -y epel-release
[root@cloud ~]# dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
[root@cloud ~]# dnf config-manager --enable remi
[root@cloud ~]# dnf module install -y php:remi-8.3

続けてPHP拡張機能のインストール
後で追加で要求されるものもありますが、とりあえず最低限必要そうなものを入れておきます。

[root@cloud ~]# dnf install -y php-mysqli
[root@cloud ~]# dnf install -y php83-php-gd.x86_64
[root@cloud ~]# dnf install -y php-zip

gd.sockの場所を確認します。

[root@cloud ~]# find / -name gd.so

Permission denied が大量に出ると思いますが、正しくインストールされていればどこかに表示されるはずです。
当環境では、/opt/remi/php83/root/usr/lib64/php/modules/gd.so にありました。

/etc/php.ini に以下を追記
場所は多分どこでも良いです。一番下でも、extentionを書き連ねそうなコメントがある所など。

extension=/opt/remi/php83/root/usr/lib64/php/modules/gd.so

ついでに /etc/php.ini の以下の部分を変種してPHPのメモリ制限を緩和します

memory_limit = 4G
post_max_size = 4G
upload_max_filesize = 4G

max_input_time = 86400
max_execution_time = 86400
# 大きなファイルのアップロードに時間がかかる場合の考慮
# NexrCloud Windowsクライアントで同期中に 299 ネットワークエラーが発生する問題の対策でもある

php-fpm と httpd の有効化と起動

[root@cloud ~]# systemctl enable --now httpd; systemctl start httpd
[root@cloud ~]# systemctl enable php-fpm; systemctl start php-fpm

データベース(mariadb)

2025/2/24現在、dnf install -y mariadb-server でインストール出来るのは 10.5.22-1.el9_2
NextCloudのシステム要件は MariaDB 10.6/10.11/11.4 なので本家から直接もってきてインストールします。

とりあえず新しい方の 11.4 で入れてみます。
まずはリポジトリの作成

[root@cloud ~]# vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://mirror.mariadb.org/yum/11.4/rocky9-amd64/
gpgkey = https://mirror.mariadb.org/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

インストールと有効化と起動

[root@cloud ~]# dnf install -y --allowerasing mariadb-server mariadb
[root@cloud ~]# systemctl enable --now mariadb; systemctl start mariadb

データベースのセットアップウィザードを実行します

[root@cloud ~]# mariadb-secure-installation

新しいバージョンでは mysql_secure_installation ではなく mariadb-secure-installation に変更されたようです。内容は同じっぽいです。
内容はお好みで、私は大体以下のようにしています。

パスワード
Switch to unix_socket auth: n
Change root pass: n
Remove anonymous users: y
Deallow remote root login: y
Remove test db: y
Reload privilege table now: y

NextCloud本体は後でインストールします

Apacheの設定

[root@cloud ~]# vim /etc/httpd/conf/httpd.conf

公式マニュアルをベースにしています。(https://docs.nextcloud.com/server/latest/admin_manual/installation/source_installation.html#apache-web-server-configuration)
<Directory “/var/www/html”>の所を探し出して以下のように編集します。

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    <IfModule mod_dav.c>
        Dav off
    </IfModule>
</Directory>

再起動

[root@cloud ~]# systemctl restart httpd

NextCloud用データベース作成

mariadbにログイン

[root@cloud ~]# mariadb -u root -p

DB名を nextcloud
DBユーザー名を dbuser
DBパスワードを dbpass とした場合、

MariaDB [(none)]> CREATE DATABASE nextcloud;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud.* TO "dbuser"@"localhost" IDENTIFIED BY 'dbpass';
MariaDB [(none)]> FLUSH PRIVILEGES;

もし、手違いなどで削除する場合は

MariaDB [(none)]> drop database db_wordpress;

退出は exit で出れます。

NextCloud本体のインストール

[root@cloud ~]# curl -OL https://download.nextcloud.com/server/releases/nextcloud-30.0.5.zip
[root@cloud ~]# unzip -q nextcloud-*.zip

設置先の作成と移動
mvだと隠しファイルが移動されないのでcpを使います

[root@cloud ~]# cp -a nextcloud/. /var/www/html/
[root@cloud ~]# rm -rf nextcloud

ファイルに所有権を与えます

[root@cloud ~]# chown -R apache:apache /var/www/html

データフォルダとして指定する /mnt/data にも所有権を与えておきます

[root@cloud ~]# chown -R apache:apache /mnt/data

NextCloudの設定

これで、ブラウザからアクセスすると初期設定画面が出てくると思います。

管理者アカウント名とパスワードを入力したら、「ストレージとデータベース▼」の所をクリックし、データフォルダーに「/mnt/data」を設定します。

「データベースを選択してください」の所で、MySQL/MariaDBをクリックし、作成したデータベースの情報を入力します。

「インストール」をクリックするとデータベース設定などに問題が無ければ、推奨アプリ選択画面が出てきます。
お好みのものを選択してください。

これでインストールは完了です。

管理画面でのセキュリティ&セットアップ警告対策メモ

エラー解決

インストールは最低限完了しましたが、エラーや警告などが出ていますのでこれを解消していきます。

右上のアイコンをクリックして、メニューから「管理者設定」を選択します。
セキュリティ&セットアップ警告の画面でエラーや警告がリストアップされます。

An exception occured while running the setup check (以下略)

以下をインストール

[root@cloud ~]# dnf install -y php-process

安全ではないHTTP経由でのサイトへのアクセス。代わりにHTTPSを要求するようにサーバーを設定することを強くお勧めします。

httpでアクセスすると出ます。
本構成の前提として、traefikにSSLを任せているのでtraefik経由でhttpsでアクセスするようにしましょう。

が、それだけでは以下のようなエラー画面が出てしまいます。

ので、指示通りに対応します

[root@cloud ~]# vim /var/www/html/config/config.php 

で、下記を追記します。
(‘nextcloud.cyane.infoの部分はtraefik設定しているドメインを設定してください)

'trusted_domains' =>
array (
  0 => 'nextcloud.cyane.info',
),

とすると、下記のエラーが新たに出てくると思います。

リバースプロキシヘッダの設定が正しくありません。これはセキュリティ上の問題で、攻撃者が自分のIPアドレスをNextcloudに見えるように偽装することができます。

このエラーメッセージは、Nextcloud のリバースプロキシ設定が正しくないことを示しています。リバースプロキシを使用している場合、Nextcloud がクライアントの正しい IP アドレスを取得できるように設定を正しく行う必要があります。このエラーが発生する主な原因は、リバースプロキシが X-Forwarded-For ヘッダを正しく設定していないか、Nextcloud がそのヘッダを正しく認識していない場合です。

/var/www/html/config/config.php に以下を追加
192.168.1.4 は traefik のIPアドレスです

'trusted_proxies' => 
array (
  0 => '192.168.1.4',
),
'forwarded_for_headers' => 
array (
  0 => 'HTTP_X_FORWARDED_FOR',
),

PHP OPcacheモジュールが正しく設定されていません。 PHP OPcacheモジュールがロードされていません。パフォーマンスを向上させるには、OPcacheモジュールをPHPインストールにロードすることをお勧めします。

このエラーメッセージは、NextcloudがPHP OPcacheモジュールを利用できていないことを示しています。OPcacheは、PHPのパフォーマンスを大幅に向上させるため、コードのコンパイル済みバイトコードをキャッシュするモジュールです。Nextcloudのパフォーマンス向上のために、OPcacheを正しく設定することが推奨されています。

[root@cloud ~]# dnf install -y php-opcache

私の環境ではこれでエラーはすべて消えましたが警告が残っているので引き続き対処していきます

警告解決

ログには 2025年2月17日 21:40:34 以降、エラーが 2 件あります。

管理メニューの「ログ」のエラーが出ている場合表示されます。
ログイン失敗などもエラーに計上されます。
とりあえず後回し

サーバーにはメンテナンスウィンドウの開始時間が設定されていません。これは、リソースを多く使用する日常のバックグラウンドジョブが、メインの利用時間中にも実行されることを意味します。利用者がこれらの重いタスクによる負荷の影響を受けにくくするために、低い利用時間に設定することをおすすめします。

/var/www/hosts/cloud/public_html/config/config.php に以下を設定する

'maintenance_window_start' => 1,

公式ドキュメントによると
値が 1 の場合、これらのバックグラウンド ジョブは UTC の午前 1 時から午前 5 時の間だけ実行されます。
とのことです。

One or more mimetype migrations are available. (以下略)

以下を実行

[root@cloud ~]# cd /var/www/html
[root@cloud ~]# sudo -u apache php occ maintenance:repair --include-expensive

インスタンスの一部のヘッダーが正しく設定されていません – `Strict-Transport-Security` HTTPヘッダーが設定されていません(少なくとも `15552000` 秒に設定する必要があります)

ドキュメント通り vim に以下を設定する

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    <IfModule mod_dav.c>
        Dav off
    </IfModule>
    # ↓ここを追記
    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    </IfModule>
</Directory>
[root@cloud ~]# systemctl restart httpd

いくつかの欠落しているオプションのインデックスを検出しました。データベースのパフォーマンスを向上させるために、(Nextcloudまたはインストールされたアプリケーションによって)新しいインデックスが追加されることがあります。(以下略)

occ db:add-missing-indices コマンドを使用してください。 とのことなので指示通りにします

[root@cloud ~]# cd /var/www/html/
[root@cloud ~]# sudo -u apache php occ db:add-missing-indices

PHP OPcacheモジュールが正しく設定されていません。 OPcache のインターン化文字列バッファがほぼいっぱいです。繰り返しの文字列を効果的にキャッシュするために、PHPの設定に “opcache.interned_strings_buffer” を “8” よりも高い値で設定することをおすすめします。

https://docs.nextcloud.com/server/30/admin_manual/installation/server_tuning.html#enable-php-opcache
の指示通り設定します。

OPcache設定は php.ini にあるらしいのですが、/etc/php.ini を見に行くと

[opcache]
; see /etc/php.d/10-opcache.ini

とのことなので、それを見に行きます。それっぽい設定があるのでドキュメントの指示通りに設定していきます。
基本的に設定はコメントアウトで記載済みなので、コメントアウト解除と値の修正を行っていきます。

[root@cloud ~]# /etc/php.d/10-opcache.ini
opcache.interned_strings_buffer=12

「8よりも高い」なのでデフォルトの8では駄目です。16だとshm が崩壊してエラーが出てしまう不具合が過去にあって修正済みみたいですが大きくする理由も分からないので10にしていたのですが、しばらくして10以上にしろと言われたので12に設定し直しました。

一応これだけで警告は消えますが、
公式ドキュメントには以下も設定すると良いみたいなことが書かれているのでついでにやっておきます。

opcache.revalidate_freq = 60
opcache.validate_timestamps = 0
opcache.save_comments = 1

JITの設定はコメントにも無かったので一番下に追記しておきます

opcache.jit = 1255
opcache.jit_buffer_size = 8M
[root@cloud ~]# systemctl restart php-fpm; systemctl restart httpd

Mimetypeの移行が可能

(32.0.xへのアップデート時に追加)

(TBD)

第二要素の設定

(32.0.xへのアップデート時に追加)

(TBD)

データベースに存在しないインデックス

(32.0.xへのアップデート時に追加)

(TBD)

管理画面での情報解決

データベースがトランザクションファイルロックに使われています。パフォーマンスをあげるには、可能であればメモリーのキャッシュを設定してください。

Redisをインストール。後述の php-redis が 7 は無いっぽいので 最新の7ではなく 6 にしておきます。

[root@cloud ~]# dnf module -y install redis:remi-6.0

php-redisをインストール

[root@cloud ~]# dnf install -y php-redis

Redisの設定
/etc/redis.conf で以下のコメントアウトを外してUnixソケットを有効化

unixsocket /tmp/redis.sock
unixsocketperm 700
[root@cloud ~]# systemctl restart redis; systemctl enable redis

/var/www/html/config/config.php に以下を追加

'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
  'host' => 'localhost',
),

メモリキャッシュが設定されていません。パフォーマンスを向上させるため、利用可能であればメモリキャッシュを設定してください。

APCuのインストール

[root@cloud ~]# dnf install -y php-pecl-apcu
[root@cloud ~]# systemctl restart php-fpm

/var/www/html/config/config.php に以下を追加

'memcache.local' => '\OC\Memcache\APCu',

ご使用のシステムには、デフォルトの電話地域が設定されていません。これは、プロフィール設定で国コードなしの電話番号を有効にするために必要です。国コードなしの電話番号を許可するには、”default_phone_region” を地域の ISO 3166-1 コードとともに設定ファイルに追加してください。

/var/www/html/config/config.php に以下を追加

'default_phone_region' => 'JP',

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

基本設定メニューからメールを設定する

Gmailを設定する場合
   送信モード:SMTP
     暗号化:None/STARTSSL
 送信減アドレス:[email protected]
サーバーアドレス:smtp.gmail.com:587
      認証:ON
    資格情報:SMTPログイン(gmailアドレス) / SMTPパスワード

このインスタンスには、いくつかの推奨 PHP モジュールがありません。パフォーマンスと互換性を向上させるために、これらをインストールすることを強くお勧めします: – bcmath WebAuthn パスワードレスログイン用 – gmp WebAuthn パスワードレスログインと、SFTPストレージ用 – intl 言語翻訳のパフォーマンスが向上し、非ASCII文字のソートが修正されました

以下をインストール

[root@cloud ~]# dnf install -y php-bcmath php-gmp php-intl php-sodium

テーマ別アプリは有効ですが、PHPモジュール「imagick」が有効ではありません。ファビコン生成を正しく行うには、このモジュールをインストールし、有効化する必要があります。

ImageMagickは脆弱性とか yum install ImageMagick すると Ver6 が入ってその後の依存関係云々とか、一回やって躓いたとか、
諸々あって、別にいれなくても画像は表示できるし、基本閲覧は PhotoPrismかimmichを 使う予定なので、保管だけちゃんとできれば十分かなと思ったので、今回導入は見送ろうと思います。

AppAPIデプロイデーモン

(32.0.xへのアップデート時に追加)

(TBD)

その他設定・トラブルシューティング

cronの設定

(TBD)

デフォルトの言語とロケールを日本に設定する

/var/www/html/config/config.php に以下を追加

'default_language' => 'ja',
'default_locale' => 'ja',
'default_phone_region' => 'JP',

クライアントで同期中に 413 entity too large エラーが発生する

Nextcloud+CloudflareTunnelで発生する413エラーについて

Webアップデートに失敗する

Downloadingのステップで以下のような Parsing response failed. の失敗をした場合、

コンソールから直接アップデートする
(※/mnt/data/はデータストレージフォルダ。updater-octwjzyrbiw0 の名前も環境により異なります。)

[root@cloud ~]# rm /mnt/data/updater-octwjzyrbiw0/.step
[root@cloud ~]# cd /var/www/hosts/cloud/public_html/updater/
[root@cloud ~]# sudo -u apache php updater.phar
        (省略)
        Start update? [y/N] y
        (省略)
        Should the "occ upgrade" command be executed? [Y/n] Y
        (省略)
        Keep maintenance mode active? [y/N] N
タイトルとURLをコピーしました