nextcloudをUbuntu+nginx+postgreSQL+RAID1で自宅サーバーに構築する

nextcloudを使いたい

Google Photoの容量がきつくなってきたので写真と動画の保存先を移行する必要が出てきました。
他のクラウドサービスも検討したのですが、HDDが昔に比べてかなり安くなっていることもあり、自宅サーバーを立ててみることにしました。
RAID1に対応したかったので、ハードウェアRAIDに対応したHDDケースも検討したのですが、安いものは評判がよくない、本格的なものは高すぎるということで、今回はHP ProLiant Gen8を採用しました。
発売から10年程経過していますが、中古で1万円程度で買える、3.5インチベイが4つある、コンパクトでそこそこの静音性を持つといった感じで初心者が扱うには程よい感じです。
本記事では作業の流れと参考にした記事を紹介し、ハマったポイントと解決法を紹介します。

ハードウェア構成

HP microserver ProLiant Gen8
Xeon E3-1220L V2 (2.30GHz)
HDD 3TB *2
メモリ8GB
USBフラッシュメモリ32GB(Ubuntuインストール用)
USBフラッシュメモリ32GB(LIVE USB用)
Ubuntuのインストール用USBを作成するのにPCが必要になります。

環境

Ubuntu 20.04.5 LTS
PostgreSQL 12.13
PHP 8.1
nginx 1.18.0
Nextcloud 25.0.3

その他

  • 事前準備として、お名前.comでドメインを取得しています

1.UbuntuをLIVE USBから起動する

今回HDDは2つ用意していますが、RAID1で使用したいのでUbuntuUSBメモリにフルインストールします。
作業内容としては、

  1. Ubuntu 20.04.5 LTSをUSBメモリRufusで書き込む
  2. 1のUSBメモリからUbuntuを起動して、もう一つのUSBメモリをLIVE USBにする

となります。

Ubuntu 20.04.5 LTSをUSBメモリにRufasで書き込む

こちらの記事を参考に進めます。 【簡単】Rufusを使ってUbuntuのLive USBを作成する方法 – あの角を曲がれば、かぼしー

日本語対応のUbuntuはこちらからダウンロードできます。
Ubuntu Desktop 日本語 Remixのダウンロード

ここで作ったUSBメモリからUbuntuを起動することができますが、再起動するとデータが全て消えてしまいます。
では何に使うのかというと、このUSBメモリからUbuntuを起動し、もう一つのUSBメモリUbuntuをフルインストールすることで、再起動に対応したLIVE USBを作成することができます。

BIOS設定でUSBの優先順位を上げる

PCを起動した際に、OSが入ったドライブを読む前に作成したUSBメモリを読み込む必要があります。
PCのBIOS設定でUSBメモリの起動順位を上げます。
BIOSの設定方法はメーカーによって異なりますので手順は省略します。

参考:BIOS / UEFI設定: USB ドライブからパソコンを起動(Boot)する方法

LIVE USBを作成する

※この作業は失敗するとメインPCのデータが吹っ飛ぶ可能性がありますので、よく読んで進めてください
Ubuntu20.04:USB Linuxの作り方 – demura.net

【ハマりポイント】
上記記事ではEFIシステムパーティションを指定していますが、私はメニューに表示されなかったのでFAT32にし、マウントポイントに/dosを指定しました。
ルートパーティションについては上記記事と同様にしました。

完成したLIVE USBメモリをサーバーに差して起動します。

2.ソフトウェアRAIDでRAID1環境を作る

次に、mdadmを使ってRAID1環境を作ります。
【Linux】mdadmを用いたソフトウェアRAID構築 | ぺんぎんや
/mnt/raid1ができたら、オーナー情報とパーミッションを変更します。
sudo chown -R www-data:www-data /mnt/raid1
sudo chmod 770 -R /mnt/raid1

3.nginxとphp-fpmの導入

【ハマりポイント】
php-fpmは8.2以降が既に出ていますが、nextcloudが対応していないので8.1を使います。
sudo apt install php8.1-fpm

Ubuntu Server 22.04 + nginx + php-fpm 8.1 の動作環境を構築する - Symfoware

4.必要なパッケージのインストール

こちらもphp-fpmに合わせてphp8.1のものをインストールします
必要なパッケージはこちらを参考にしています。
Installation on Linux — Nextcloud latest Administration Manual latest documentation

sudo apt install imagemagick php-imagick php8.1-common php8.1-mysql  php8.1-gd php8.1-curl php8.1-zip php8.1-xml php8.1-mbstring php8.1-bz2 php8.1-intl php8.1-bcmath php8.1-gmp php-pgsql memcached php8.1-pgsql

5.postgresqlの導入

RaspberryPi4でPostgresSQL+Nginx+NextCloud18構築 - Qiita

ここで設定したDB名とロール、パスワードは後で使いますので忘れないように。

6.ルーターとネームサーバーの設定

Raspberry Piとnginxでwebページを公開してみる
こちらの記事を参考にIPの固定、ルーター、ネームサーバの設定をします。
【ハマりポイント】
Ubuntuから設定する場合、interfaceを使う方法は廃止されていますので、netplanを使って設定してください。
【Ubuntu】固定IPアドレスの設定(無線LAN、Wi-Fi対応):netplan | OFFICE54

7. certbotのインストール

RaspberryPi4でPostgresSQL+Nginx+NextCloud18構築 - Qiita
記事に従い、SSL証明書を取得するためにcertbotをインストールします。

8. nextcloudの導入

以下のコマンドでnextcloudをダウンロード、展開します。
wget https://download.nextcloud.com/server/releases/nextcloud-25.0.3.zip
sudo unzip nextcloud-25.0.3.zip -d /usr/share/nginx/
sudo chown www-data:www-data /usr/share/nginx/nextcloud/ -R

9. nginxの設定

sudo vi /etc/nginx/conf.d/<取得したドメイン>で設定ファイルを作ります。
Install NextCloud on Ubuntu 20.04 with Nginx (LEMP Stack) - LinuxBabe
こちらの記事のStep 3: Create a Nginx Config File for Nextcloud 参照

コピペする場合はphp7.4-fpm.sock →php8.1-fpm.sockに書き換えてください。
webサーバを一度stopします。
systemctl stop nginx

10.SSL証明書の取得

certbot --nginxで取得します。 今後自動で取得させるために、crontabに以下を追記します

$ crontab -e
0 1 1 * * root /usr/bin/certbot renew --force-renew --webroot-path /var/www/html/ --post-hook "systemctl reload nginx"

11. nextcloudにアクセスする

systemctl start nginxでnginxをstartします。
取得したドメインにアクセスします。
設定がうまくいっていればこのような画面が表示されます。

ユーザー名とパスワードは自由に決めてください。
データフォルダーに/mnt/raid1を入力
データベースはPostgreSQLを選択
5.postgresqlの導入で設定した内容でデータベースのユーザー名、パスワード、データベース名を埋めます。
データベースのユーザ名は5.postgresqlの導入で設定したロール名です。
データベースのホスト名はlocalhost:5432を入力

12.インストールの完了

nextcloudのインストールが完了しました。
最後に細かい設定をしていきます。

メモリ最大サイズを変更する

sudo vi /etc/php/8.1/fpm/php.ini
memory_limit = 1024Mに変更します
その後sudo systemctl restart php8.1-fpm.serviceで反映

動画のサムネイルを表示させる

ffmpegをインストールします
sudo apt install ffmpeg
nextcloudの画面右上のアイコンメニューから、アプリ→マルチメディアと進み、Preview Generatorを有効にします。
config.phpを開きます。
sudo vi /usr/share/nginx/nextcloud/config/config.php
以下を追記します

'preview_max_x' => 1024,
  'preview_max_y' => 1024,
  'preview_max_scale_factor' => 1,
  'enable_preiews' => true,
  'enabledPreviewProviders' =>
  array(
          0 => 'OC\\Preview\\Image',
          1 => 'OC\\Preview\\Movie',
          2 => 'OC\\Preview\\MKV',
          3 => 'OC\\Preview\\MP4',
          4 => 'OC\\Preview\\AVI',
  ),

以下のコマンドでアップロードされたファイルのサムネイルが作成されるのですが、ファイルの量によっては数時間かかります。

sudo -u www-data php /usr/share/nginx/nextcloud/occ preview:generate-all

今後追加されたファイルにもサムネイルを作りたいのでcronで自動化します

crontab -u www-data -e
*/10 * * * * php /usr/share/nginx/nextcloud/occ preview:pre-generate

以上です

スマホのアプリを使えば自動アップロードの設定ができますが、アップロードの始まるタイミングが微妙に不規則です。
設定後にすぐ始まるときもあれば、しばらく時間がたってから突然始まってたりします。
mdadmでRAID設定をしている場合は、障害発生時にメールを送信するように設定すると安心かもです。

Linux ソフトウェアRAID 監視 メール通知│システムガーディアン株式会社 PostfixからGmail経由でメールを送信するための設定メモ | あぱーブログ