お金をかけずにサーバーの勉強をしよう

NextCloud ちょっと本気環境 3

2023年4月26日

メニューへ戻る

NextCloud ちょっと本気環境 1」で環境設計をし、
NextCloud ちょっと本気環境 2」で MySQLサーバーを作りました。

ここでは NextCloudをインストールする、いわゆるアプリケーションサーバーを作ります。

構成図ではここです。
構成図

それではスタートです。


1.OSインストール

VMware Workstation PlayerのゲストOSとして、Ubuntu Server 22.04.2 を1つ作ります。

インストールについては、以下に書いている通りに作りました。
Ubuntu Linux Serverをインストール
Ubuntu Serverの初期設定

私の家のLANに作りますので IPアドレスは以下にし、他のネットワーク設定は上のページに書いてあるものに準じています。

マシン名: nextcloud
IP: 192.168.1.109


2.IPv6無効化

IPv4での運用にしたいと思います。
Ubuntu 22.04の IPv6無効化」に書いておりますので、それに従ってやっておきました。


3.マシン名解決

我が家には家庭内LAN用の DNSがありませんので、[/etc/hosts]ファイルでマシン名解決(マシン名からIPアドレスに変換)をしています。

[nextcloud]サーバーは、[nginx]サーバー・[mysql]サーバーと通信しますので、IPv4の記載部分を以下のように変更しています。

[/etc/hosts]

127.0.0.1 localhost
192.168.1.109 nextcloud ← IPアドレス変更
192.168.1.108 nginx ← この行を追加
192.168.1.110 mysql ← この行を追加


4.NFSクライアント設定

[mysql]サーバーが NFSで提供してくれるディスク領域を使うため、NFSクライアントのパッケージをインストールします。

subro@nextcloud:~$ sudo apt install -y nfs-common
〜〜〜 省略 〜〜〜

インストールできました。

マウントポイント [/files]ディレクトリを作ります。

subro@nextcloud:~$ sudo mkdir /files

できました。

OS起動時にマウントするよう [/etc/fstab]ファイルを以下のように変更します。

[/etc/fstab]

mysql:/ /files nfs4 auto,nofail,noatime,nolock,intr,tcp,actimeo=1800,port=60002 0 0 ← 追記

書き換えたら、一度再起動してみます。

subro@nextcloud:~$ sudo reboot

再起動した後に確認した結果がこちら。

subro@nextcloud:~$ df
Filesystem                        1K-blocks    Used Available Use% Mounted on
tmpfs                                398320    1476    396844   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  18631360 8570988   9088596  49% /
tmpfs                               1991584       0   1991584   0% /dev/shm
tmpfs                                  5120       0      5120   0% /run/lock
/dev/sda2                           1790136  132860   1548016   8% /boot
mysql:/                           5066752       0   4788736  0% /files
tmpfs                                398316       4    398312   1% /run/user/1000

NFSマウントできています。

[/files]ディレクトリに NextCloudがファイルを書き込めるよう ディレクトリのオーナー・グループ・パーミッションを OSの[www-data」ユーザー・[www-data]グループのものに変えておきます。

subro@nextclooud:~$ sudo chown www-data:www-data /files

セキュリティのため、[www-data」ユーザー・[www-data]グループ以外にはファイルを読ませないように、ディレクトリパーミッションを [770]にします。

subro@nextclooud:~$ sudo chmod 770 /files

設定できました。

結果こうなりました。

subro@nextclooud:~$ sudo ls -la /files
合計 44
drwxrwx---  6 www-data www-data  4096  4月 25 17:07 .
drwxr-xr-x 20 root     root      4096  4月 25 11:04 ..
drwx------  2 root     root     16384  4月 24 15:11 lost+found


5.Apache2(WEBサーバー)・PHPのパッケージをインストール

インストールマニュアル Example installation on Ubuntu 22.04 LTS に沿って進めます。
マニュアルに載ってるパッケージから MySQLサーバーを抜いた残りの作業をします。

subro@nextcloud:~$ sudo apt install apache2 libapache2-mod-php php-gd php-mysql \
php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  apache2-bin apache2-data apache2-utils bzip2 fontconfig-config fonts-dejavu-core fonts-droid-fallback fonts-noto-mono fonts-urw-base35 ghostscript gsfonts imagemagick-6-common libaom3
  libapache2-mod-php8.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libavahi-client3 libavahi-common-data libavahi-common3 libcups2 libdav1d5 libde265-0 libdeflate0
  libfftw3-double3 libfontconfig1 libgd3 libgomp1 libgs9 libgs9-common libheif1 libidn12 libijs-0.35 libjbig0 libjbig2dec0 libjpeg-turbo8 libjpeg8 liblcms2-2 liblqr-1-0 libltdl7 liblua5.3-0
  libmagickcore-6.q16-6 libmagickwand-6.q16-6 libonig5 libopenjp2-7 libpaper-utils libpaper1 libtiff5 libwebp7 libwebpdemux2 libwebpmux3 libx265-199 libxpm4 libzip4 mailcap mime-support
  php-common php8.1-bcmath php8.1-cli php8.1-common php8.1-curl php8.1-gd php8.1-gmp php8.1-imagick php8.1-intl php8.1-mbstring php8.1-mysql php8.1-opcache php8.1-readline php8.1-xml php8.1-zip
  poppler-data ssl-cert
提案パッケージ:
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser bzip2-doc fonts-noto fonts-freefont-otf | fonts-freefont-ttf fonts-texgyre ghostscript-x php-pear cups-common
  libfftw3-bin libfftw3-dev libgd-tools liblcms2-utils libmagickcore-6.q16-6-extra poppler-utils fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic | fonts-ipafont-gothic
  fonts-arphic-ukai fonts-arphic-uming fonts-nanum
推奨パッケージ:
  ttf-dejavu-core
以下のパッケージが新たにインストールされます:
  apache2 apache2-bin apache2-data apache2-utils bzip2 fontconfig-config fonts-dejavu-core fonts-droid-fallback fonts-noto-mono fonts-urw-base35 ghostscript gsfonts imagemagick-6-common libaom3
  libapache2-mod-php libapache2-mod-php8.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libavahi-client3 libavahi-common-data libavahi-common3 libcups2 libdav1d5 libde265-0
  libdeflate0 libfftw3-double3 libfontconfig1 libgd3 libgomp1 libgs9 libgs9-common libheif1 libidn12 libijs-0.35 libjbig0 libjbig2dec0 libjpeg-turbo8 libjpeg8 liblcms2-2 liblqr-1-0 libltdl7
  liblua5.3-0 libmagickcore-6.q16-6 libmagickwand-6.q16-6 libonig5 libopenjp2-7 libpaper-utils libpaper1 libtiff5 libwebp7 libwebpdemux2 libwebpmux3 libx265-199 libxpm4 libzip4 mailcap
  mime-support php-bcmath php-common php-curl php-gd php-gmp php-imagick php-intl php-mbstring php-mysql php-xml php-zip php8.1-bcmath php8.1-cli php8.1-common php8.1-curl php8.1-gd php8.1-gmp
  php8.1-imagick php8.1-intl php8.1-mbstring php8.1-mysql php8.1-opcache php8.1-readline php8.1-xml php8.1-zip poppler-data ssl-cert
アップグレード: 0 個、新規インストール: 86 個、削除: 0 個、保留: 3 個。
38.1 MB のアーカイブを取得する必要があります。
この操作後に追加で 146 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libapr1 amd64 1.7.0-8ubuntu0.22.04.1 [108 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libaprutil1 amd64 1.6.1-5ubuntu4.22.04.1 [92.6 kB]

〜〜〜 途中省略 〜〜〜

No VM guests are running outdated hypervisor (qemu) binaries on this host.

インストールできました。


6.NextCloudのプログラム部分のインストール

インストールマニュアルには Nextcloud Download Page でダウンロードしてこいとありますので、ダウンロードページに行きます。

マニュアルには Download Nextcloud Server → Download → Archive file for server owners と辿れと書いてあるんですが、2023年4月22日時点でダウンロードページを見るに、

DOWNLOAD SERVER → COMMUNITY PROJECTS → Archive

だと思います。

Get ZIP Fileを押すとダウンロードが始まります。
アーカイブダウンロード画面
ボタンを押すとダウンロードが始まるんですが、[nextcloud]には Firefox等の WEBブラウザがありませんので、curlコマンドでダウンロードします。

subro@nextcloud:~$ curl -O https://download.nextcloud.com/server/releases/latest.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  176M  100  176M    0     0  3390k      0  0:00:53  0:00:53 --:--:-- 3426k

subro@nextcloud:~$ ls -l latest.zip
-rw-rw-r-- 1 subro subro 184987285  4月 26 07:25 latest.zip

[latest.zip]というファイルがダウンロードされました。

ダウンロードページの手順にある通り、正当なファイルであることを確認します。
どの方法を使うかは好みですが SHA256を使ってみますので、赤枠のリンクが対象です。
ダウンロードファイルのチェック
サーバーで curlコマンドで直接取ることにします。

subro@nextcloud:~$ curl -O https://download.nextcloud.com/server/releases/latest.zip.sha256
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    77  100    77    0     0     72      0  0:00:01  0:00:01 --:--:--    72

subro@nextcloud:~$ ls -l latest*
-rw-rw-r-- 1 subro subro 184987285  4月 26 07:25 latest.zip
-rw-rw-r-- 1 subro subro        77  4月 26 07:26 latest.zip.sha256

必要なファイルが揃いましたので、ファイルを検証します。

subro@nextcloud:~$ sha256sum -c latest.zip.sha256 < latest.zip
latest.zip: OK

検証は OKでした。

unzipをインストールして、[latest.zip]ファイルを解凍します。

subro@nextclooud:~$ sudo apt -y install unzip
〜〜〜 以下略 〜〜〜

subro@mysql:~$ unzip latest.zip

〜〜〜 途中略 〜〜〜

 extracting: nextcloud/config/CAN_INSTALL
  inflating: nextcloud/config/config.sample.php
  inflating: nextcloud/config/.htaccess

解凍できました。

できあがったディレクトリをコピーします。
移動でも良いと思いますけど、コピーするのは何故だろう。

subro@nextclooud:~$ sudo cp -r nextcloud /var/www/

subro@nextclooud:~$ ls -la /var/www
合計 16
drwxr-xr-x  4 root root 4096  4月 26 07:28 .
drwxr-xr-x 14 root root 4096  4月 22 10:09 ..
drwxr-xr-x  2 root root 4096  4月 26 07:20 html
drwxr-xr-x 14 root root 4096  4月 26 07:28 nextcloud

[/var/www/nextcloud]ディレクトリができます。

[/var/www/nextcloud] ディレクトリ以下を全て [www-data] ユーザー・ [www-data] グループに変更します。

subro@nextclooud:~$ sudo chown -R www-data:www-data /var/www/nextcloud

subro@nextcloud:~$ ls -l /var/www
合計 8
drwxr-xr-x  2 root     root     4096  4月 26 07:20 html
drwxr-xr-x 14 www-data www-data 4096  4月 26 07:28 nextcloud

変更できました。


7.Apache2の設定

Next Steps という段落に書いてある通り、Apacheの設定に移ります。

こちらの段落です。
Apache Web server configuration

Apacheの設定ファイルとして、NextCloud用の [/etc/apache2/sites-available/nextcloud.conf]ファイルを以下の内容で作成します。

Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>

ファイルができました。
ファイルのオーナー・グループ・パーミッションは既存の他ファイルと同じなので良いようです。

subro@nextclooud:~$ ls -l /etc/apache2/sites-available
total 16
-rw-r--r-- 1 root root 1332 Sep  8  2022 000-default.conf
-rw-r--r-- 1 root root 6338 Sep 30  2022 default-ssl.conf
-rw-r--r-- 1 root root  214 Apr 26 07:38 nextcloud.conf

設定を有効にします。

subro@nextclooud:~$ sudo a2ensite nextcloud.conf
Enabling site nextcloud.
To activate the new configuration, you need to run:
  systemctl reload apache2

設定が有効になって、Apacheの再起動を促されますが、次の作業の後にします。

マニュアルには Apacheへのモジュール追加設定がありました。
必須と推奨がありましたので、全部やっておきます。

subro@nextclooud:~$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2

subro@nextcloud:~$ sudo a2enmod headers
Enabling module headers.
To activate the new configuration, you need to run:
  systemctl restart apache2

subro@nextcloud:~$ sudo a2enmod env
Module env already enabled

subro@nextcloud:~$ sudo a2enmod dir
Module dir already enabled

subro@nextcloud:~$ sudo a2enmod mime
Module mime already enabled

設定しました。
いくつかは既に有効になっていたようです。

Apacheの 80/tcpは知られてしまっているので変更します。 [/etc/apache2/port.conf]ファイルを以下の通り変更します。
[/etc/apache2/port.conf]

Listen 80
 ↓
Listen 60004

変更したら、Apacheを再起動します。

subro@nextclooud:~$ sudo service apache2 restart


8.sshd ポート変更

[22/tcp]から変えてしまいます。
[/etc/ssh/sshd_config]ファイルを以下の通り変更します。

[/etc/ssh/sshd_config]

#Port 22
  ↓
Port 60003 ← コメントアウト(#)を消して番号を変更します 60003は適当です

設定の反映を確認するため再起動しました。

subro@mysql:~$ sudo reboot

なお、ポート番号を変更された sshサーバーには [-p]オプションを使ってログインします。

subro@Lubuntu2204:~$ ssh subro@nextcloud -p 60003

リブート後の待受ポート状態です。

subro@mysql:~$ ss -atl
State                  Recv-Q                 Send-Q                                 Local Address:Port                                   Peer Address:Port                 Process
LISTEN                 0                      4096                                         0.0.0.0:sunrpc                                      0.0.0.0:*
LISTEN                 0                      4096                                   127.0.0.53%lo:domain                                      0.0.0.0:*
LISTEN                 0                      128                                          0.0.0.0:60003                                       0.0.0.0:*
LISTEN                 0                      511                                          0.0.0.0:60004                                       0.0.0.0:*

良さげです。


9.NextCloud初期化

NextCloudに初回ログインすると初期化が行われます。
ここで作った環境では、[http://nextcloud:60004/nextcloud]に WEBブラウザでアクセスします。

初回ログイン画面では、管理者ユーザーを設定します。
管理者ユーザーは[subro]としています。
(これは NextCloudのユーザーで OSの[subro]ユーザーとは別物です)
パスワードも併せて登録します。
下の枠は NextCloudがアップロードされたデータファイルを格納する場所で、上で NFSマウントした [/files]ディレクトリになります。
初回ログイン画面 1

こちらはデータベースへのアクセス情報の設定です。
NextCloud ちょっと本気環境 1」で作った MySQLが対象になりますので、以下の設定になります。
パスワードは「Abcd1234#」ですね。
初回ログイン画面 2

インストールを押すと、初期化が始まって暫くかかります。

初期化が終わると「http://nextcloud:60004/index.php/core/apps/recommended」にリダイレクトされましたが、File not found のエラーになってしまいました。
途中の作業で何か欠けているのかと思いましたが、よく分かりませんでした。
バグレポートにも上がってはいるようです。

改めて[http://nextcloud:60004/nextcloud]にアクセスしますとこちらの画面に。
初回画面
NextCloudとしてちゃんと稼働しているようです。


10.ファイアウォール有効化

ufw(program for managing a netfilter firewall)で、Apache2へのアクセスを [nginx]サーバーからのみ可能になるよう締め付けます。

この手順は一部「Ubuntuでもファイアウォール」に書いていますので、良かったら見てやって下さい。

現在の状態を確認します。

subro@nextcloud:~$ sudo ufw status
状態: 非アクティブ


ファイアウォールのロギングを有効にします。

subro@nextcloud:~$ sudo ufw logging on
ログ取得を有効にしました


入ってくる方は全閉じの設定です。
デフォルトではこうなっているので、やらなくても良いです。

subro@nextcloud:~$ sudo ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)


先に sshdの [60003/tcp] を作業用の PCがあるネットワークにだけ許可しておきます。

※これはネットワークセグメントに対して許可する参考です。
この実験環境で [192.168.1.0/24]に許可してしまうと、他のサーバーからでも sshでアクセスできてしまいます。
自分の環境に適宜置き換えて下さい。

subro@nextcloud:~$ sudo ufw allow from 192.168.1.0/24 to any port 60003 proto tcp
ルールをアップデートしました


Apache2の[60004/tcp]を [nginx]サーバーの IPのみに許可します。

subro@nextcloud:~$ sudo ufw allow from 192.168.1.108 to any port 60004 proto tcp
ルールをアップデートしました

セッティングが済みましたので、ファイアウォールを有効化します。

subro@nextcloud:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。

リブート後も有効になっているか確認するため、一旦リブートします。

subro@nextcloud:~$ sudo reboot

リブート後に改めてログインしました。
sshコマンドの [-p 60003]オプションを忘れずに。

状態確認です。

subro@nextcloud:~$ sudo ufw status numbered
状態: アクティブ

     To                         Action      From
     --                         ------      ----
[ 1] 60003/tcp                  ALLOW IN    192.168.1.0/24
[ 2] 60004/tcp                  ALLOW IN    192.168.1.108

良さげです。
せっかく NextCloudが動くようになったのに、[nginx]サーバーからしかアクセスできなくしてしまいました。
早く[nginx]サーバーを作りましょう。


NextCloud ちょっと本気環境 4」に続きます。