「NextCloud ちょっと本気環境 1」でブチ上げました通り、NextCloudの環境を作ります。
この図の一番下の、MySQLサーバーを作りますね。
それではスタートです。
1.OSインストール
VMware Workstation PlayerのゲストOSとして、Ubuntu Server 22.04.2 を1つ作ります。
インストールについては、以下に書いている通りに作りました。
「Ubuntu Linux Serverをインストール」
「Ubuntu Serverの初期設定」
私の家のLANに作りますので IPアドレスは以下にし、他のネットワーク設定は上のページに書いてあるものに準じています。
マシン名: mysql
IP: 192.168.1.110
後の工程で出てきますが、このサーバーには RAID1(ミラーリング)のディスク領域を2つ作りたいので、VMware Workstation Playerの仮想マシン設定で 5GBのハードディスクを 4つ欲しいのです。
VMware Workstation Playerでの仮想ディスク増設については「Ubuntuのディスク増設」に書いておりますので、それに従ってディスク増設のところまでやっておきました。
結果、VMWare Workstation Playerでの設定画面はこんな絵になりました。
2.IPv6無効化
IPv4での運用にしたいと思います。
「Ubuntu 22.04の IPv6無効化」に書いておりますので、それに従ってやっておきました。
3.マシン名解決
我が家には家庭内LAN用の DNSがありませんので、[/etc/hosts]ファイルでマシン名解決(マシン名からIPアドレスに変換)をしています。
[mysql]サーバーは、[nextcloud]サーバーと通信しますので、IPv4の記載部分を以下のように変更しています。
[/etc/hosts]
127.0.0.1 localhost
192.168.1.110 mysql ← IPアドレス変更
192.168.1.109 nextcloud ← この行を追加
4.RAID構築
NextCloudのデータ領域は RAID1(ミラーリング)にしたいです。(必須ではありません)
用途は以下 2つです。
① | NextCloudにユーザーがアップロードしてくるファイルの格納場所 |
② | MySQLのデータ領域 |
RAID構築前のブロックデバイスの様子です。
ちゃんと 5GBのが 4つあります。
subro@mysql:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.3M 1 loop /snap/core20/1852
loop1 7:1 0 111.9M 1 loop /snap/lxd/24322
loop2 7:2 0 49.8M 1 loop /snap/snapd/18357
loop3 7:3 0 63.3M 1 loop /snap/core20/1822
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 18.2G 0 lvm /
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 1.8G 0 rom
Ubuntuの LVMの機能で RAIDを組むのは。「LVM2でソフトウェアRAID構築」に書いておりますので、それに沿って作ります。
sdb〜sdeそれぞれのディスクを Physical Volume(PV)として登録します。
subro@mysql:~$ sudo pvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
Physical volume "/dev/sdd" successfully created.
Physical volume "/dev/sde" successfully created.
PVとして登録できました。
Volume Group(VG)を作ります。
名前は[nextcloud-vg]にしました。
subro@mysql:~$ sudo vgcreate -v nextcloud-vg /dev/sdb /dev/sdc /dev/sdd /dev/sde
Wiping signatures on new PV /dev/sdb.
Wiping signatures on new PV /dev/sdc.
Wiping signatures on new PV /dev/sdd.
Wiping signatures on new PV /dev/sde.
Adding physical volume '/dev/sdb' to volume group 'nextcloud-vg'
Adding physical volume '/dev/sdc' to volume group 'nextcloud-vg'
Adding physical volume '/dev/sdd' to volume group 'nextcloud-vg'
Adding physical volume '/dev/sde' to volume group 'nextcloud-vg'
Archiving volume group "nextcloud-vg" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/nextcloud-vg" (seqno 1).
Volume group "nextcloud-vg" successfully created
VGができました。
[vg-nextcloud]の状態を見てみます。
subro@mysql:~$ sudo vgdisplay -v nextcloud-vg
--- Volume group ---
VG Name nextcloud-vg
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 4
Act PV 4
VG Size 19.98 GiB
PE Size 4.00 MiB
Total PE 5116
Alloc PE / Size 0 / 0
Free PE / Size 5116 / 19.98 GiB
VG UUID CYrDvv-G1lD-Pt5F-tVfW-s0Qw-GZwf-hwpnTY
--- Physical volumes ---
PV Name /dev/sdb
PV UUID wcg4zE-nfP3-8fym-BW22-Vz7m-sGj3-C8RNqX
PV Status allocatable
Total PE / Free PE 1279 / 1279
PV Name /dev/sdc
PV UUID yu40i9-AeqG-NqpK-QuQy-LdB6-kPA7-pjasTn
PV Status allocatable
Total PE / Free PE 1279 / 1279
PV Name /dev/sdd
PV UUID LzS6Lu-qHz6-2i09-AfPY-bniS-wc9U-f56xHu
PV Status allocatable
Total PE / Free PE 1279 / 1279
PV Name /dev/sde
PV UUID 0arJ2P-UQmq-tIDg-GPkG-YKUa-48xp-ffRC4i
PV Status allocatable
Total PE / Free PE 1279 / 1279
ディスク1つあたりの PE(Physical Extent = 4MiB)数は 1279個ですので、それぞれの RAID1の大きさも 1279PEとなります。
PVを 2つずつ使って RAID1の LV(Logical Volume)を [lv-mysql] [lv-nextcloud]と作ります。
端数なのか理由までは調べきれませんでしたが、ここでは勘弁して下さい。
subro@mysql:~$ sudo lvcreate --mirrors 1 --extents 1278 --name mysql-lv nextcloud-vg /dev/sdb /dev/sdc
Logical volume "mysql-lv" created.
subro@mysql:~$ sudo lvcreate --mirrors 1 --extents 1278 --name nextcloud-lv nextcloud-vg /dev/sdd /dev/sde
Logical volume "nextcloud-lv" created.
作成した LV(Logical Volume)の状態です。
subro@mysql:~$ sudo lvdisplay /dev/nextcloud-vg
--- Logical volume ---
LV Path /dev/nextcloud-vg/mysql-lv
LV Name mysql-lv
VG Name nextcloud-vg
LV UUID zcb1lN-I11m-KB0Z-Sd64-U72D-Wuvq-24Vw0q
LV Write Access read/write
LV Creation host, time mysql, 2023-04-24 14:56:39 +0900
LV Status available
# open 0
LV Size 4.99 GiB
Current LE 1278
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:5
--- Logical volume ---
LV Path /dev/nextcloud-vg/nextcloud-lv
LV Name nextcloud-lv
VG Name nextcloud-vg
LV UUID dNTevp-HSxt-0E1V-fHBB-ipn4-VnMZ-N2pMY8
LV Write Access read/write
LV Creation host, time mysql, 2023-04-24 14:59:29 +0900
LV Status available
# open 0
LV Size 4.99 GiB
Current LE 1278
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:10
2つの RAID1ができました。
両方とも Linuxの一般的なファイルシステムの EXT4形式でフォーマットしておきます。
subro@mysql:~$ sudo mkfs.ext4 /dev/nextcloud-vg/mysql-lv
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1308672 4k blocks and 327680 inodes
Filesystem UUID: 90f9f9e7-d373-4f85-9df3-fc429b948cc8
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
subro@mysql:~$ sudo mkfs.ext4 /dev/nextcloud-vg/nextcloud-lv
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1308672 4k blocks and 327680 inodes
Filesystem UUID: 73d40822-cd0e-4dc3-9ab6-1f94b2320756
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
フォーマットできました。
マウントポイント[/var/lib/mysql][/nextcloud_files]ディレクトリを作ります。
subro@mysql:~$ sudo mkdir /var/lib/mysql
subro@mysql:~$ sudo mkdir /nextcloud_files
マウントポイントができました。
マウントするためにそれぞれの LVの UUIDを確認します。
subro@mysql:~$ ls -l /dev/mapper
合計 0
crw------- 1 root root 10, 236 4月 24 14:10 control
lrwxrwxrwx 1 root root 7 4月 24 15:11 nextcloud--vg-mysql--lv -> ../dm-5
lrwxrwxrwx 1 root root 7 4月 24 14:56 nextcloud--vg-mysql--lv_rimage_0 -> ../dm-2
lrwxrwxrwx 1 root root 7 4月 24 14:56 nextcloud--vg-mysql--lv_rimage_1 -> ../dm-4
lrwxrwxrwx 1 root root 7 4月 24 14:56 nextcloud--vg-mysql--lv_rmeta_0 -> ../dm-1
lrwxrwxrwx 1 root root 7 4月 24 14:56 nextcloud--vg-mysql--lv_rmeta_1 -> ../dm-3
lrwxrwxrwx 1 root root 8 4月 24 15:11 nextcloud--vg-nextcloud--lv -> ../dm-10
lrwxrwxrwx 1 root root 7 4月 24 14:59 nextcloud--vg-nextcloud--lv_rimage_0 -> ../dm-7
lrwxrwxrwx 1 root root 7 4月 24 14:59 nextcloud--vg-nextcloud--lv_rimage_1 -> ../dm-9
lrwxrwxrwx 1 root root 7 4月 24 14:59 nextcloud--vg-nextcloud--lv_rmeta_0 -> ../dm-6
lrwxrwxrwx 1 root root 7 4月 24 14:59 nextcloud--vg-nextcloud--lv_rmeta_1 -> ../dm-8
lrwxrwxrwx 1 root root 7 4月 24 14:10 ubuntu--vg-ubuntu--lv -> ../dm-0
ピンクの 2つですね。
UUIDはこう。
subro@mysql:~$ sudo blkid -p /dev/mapper/nextcloud--vg-mysql--lv
/dev/mapper/nextcloud--vg-mysql--lv: UUID="90f9f9e7-d373-4f85-9df3-fc429b948cc8" VERSION="1.0" BLOCK_SIZE="4096" TYPE="ext4" USAGE="filesystem"
subro@mysql:~$ sudo blkid -p /dev/mapper/nextcloud--vg-nextcloud--lv
/dev/mapper/nextcloud--vg-nextcloud--lv: UUID="73d40822-cd0e-4dc3-9ab6-1f94b2320756" VERSION="1.0" BLOCK_SIZE="4096" TYPE="ext4" USAGE="filesystem"
OS起動時に自動でマウントするよう、[/etc/fstab]ファイルに以下の通り追記しました。
[/etc/fstab]
UUID=90f9f9e7-d373-4f85-9df3-fc429b948cc8 /var/lib/mysql ext4 defaults 0 1
UUID=73d40822-cd0e-4dc3-9ab6-1f94b2320756 /nextcloud_files ext4 defaults 0 1
OS起動時にちゃんとマウントするか確認するため、OSを再起動しました。
再起動後のファイルシステムの様子。
subro@mysql:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 111.9M 1 loop /snap/lxd/24322
loop1 7:1 0 63.3M 1 loop /snap/core20/1822
loop2 7:2 0 63.3M 1 loop /snap/core20/1852
loop3 7:3 0 49.8M 1 loop /snap/snapd/18357
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 18.2G 0 lvm /
sdb 8:16 0 5G 0 disk
├─nextcloud--vg-mysql--lv_rmeta_0 253:1 0 4M 0 lvm
│ └─nextcloud--vg-mysql--lv 253:5 0 5G 0 lvm /var/lib/mysql
└─nextcloud--vg-mysql--lv_rimage_0 253:2 0 5G 0 lvm
└─nextcloud--vg-mysql--lv 253:5 0 5G 0 lvm /var/lib/mysql
sdc 8:32 0 5G 0 disk
├─nextcloud--vg-mysql--lv_rmeta_1 253:3 0 4M 0 lvm
│ └─nextcloud--vg-mysql--lv 253:5 0 5G 0 lvm /var/lib/mysql
└─nextcloud--vg-mysql--lv_rimage_1 253:4 0 5G 0 lvm
└─nextcloud--vg-mysql--lv 253:5 0 5G 0 lvm /var/lib/mysql
sdd 8:48 0 5G 0 disk
├─nextcloud--vg-nextcloud--lv_rmeta_0 253:6 0 4M 0 lvm
│ └─nextcloud--vg-nextcloud--lv 253:10 0 5G 0 lvm /nextcloud_files
└─nextcloud--vg-nextcloud--lv_rimage_0 253:7 0 5G 0 lvm
└─nextcloud--vg-nextcloud--lv 253:10 0 5G 0 lvm /nextcloud_files
sde 8:64 0 5G 0 disk
├─nextcloud--vg-nextcloud--lv_rmeta_1 253:8 0 4M 0 lvm
│ └─nextcloud--vg-nextcloud--lv 253:10 0 5G 0 lvm /nextcloud_files
└─nextcloud--vg-nextcloud--lv_rimage_1 253:9 0 5G 0 lvm
└─nextcloud--vg-nextcloud--lv 253:10 0 5G 0 lvm /nextcloud_files
sr0 11:0 1 1.8G 0 rom
subro@mysql:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 398320 1528 396792 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 18631360 8070576 9589008 46% /
tmpfs 1991584 0 1991584 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
/dev/sda2 1790136 132860 1548016 8% /boot
/dev/mapper/nextcloud--vg-mysql--lv 5066432 24 4788292 1% /var/lib/mysql
/dev/mapper/nextcloud--vg-nextcloud--lv 5066432 24 4788292 1% /nextcloud_files
tmpfs 398316 4 398312 1% /run/user/1000
マウントできました。
長かった…。
5.NFSサーバー設定
1で作った [/nextcloud_files]ディレクトリは NFSで公開して、[nextcloud]サーバーから書き込みできるようにします。
Ubuntuの NFSサーバー設定については、「Linux同士のファイル共有(NFS)」に書いており、それを参考にしつつも、ここではいくつか追加の設定を行います。
NFSのパッケージをインストールします。
subro@mysql:~$ sudo apt install -y nfs-kernel-server
〜〜〜 省略 〜〜〜
インストールできました。
セキュリティを強化するため、NFS Ver.3を無効にして Ver.4だけを受けるようにし、2024/tcpと知られてしまっているポート番号も変えてしまいます。
[/etc/nfs.conf]ファイルを以下のように変更します。
[/etc/nfs.conf]
#port=0
↓
port=60002 ←コメントアウト(#)を外してこの行を有効にする 60002は適当です
#vers3=n
↓
vers3=n ←コメントアウト(#)を外してこの行を有効にする
OS起動時に公開対象ディレクトリが公開され、かつ [nextcloud]サーバーからだけ使えるようにします。
[/etc/exports]ファイルを以下の様に変更します。
[/etc/exportfs]
/nextcloud_files nextcloud(rw,sync,fsid=0,no_subtree_check,no_root_squash) ←追記
これも OS再起動時に自動で有効になっていないといけませんので、再起動してから確認します。
OS再起動後のNFS公開状態です。
subro@mysql:~$ showmount -e
Export list for mysql:
/nextcloud_files nextcloud
NFS公開の設定ができました。
6.MySQLインストール
MySQLのインストールについては、「MySQLインストール」に書いている通りに作りました。
([subro]ユーザーは作らなくて良いです)
7.MySQLのポート変更
セキュリティ強化のため、[3306/tcp]・[33306/tcp]のデフォルトポートも変えてしまいます。
[/etc/mysql/mysql.conf.d/mysqld.cnf]ファイルを以下の通り変更します。
[/etc/mysql/mysql.conf.d/mysqld.cnf]
一箇所目
#port = 3306
↓
port = 60000 ← コメントアウト(#)を消して番号を変更します 60000は適当
mysqlx_port = 60001 ←追加します 60001は適当
二箇所目
bind-address = 127.0.0.1
bind-address = 192.168.1.110 ←追加
mysqlx-bind-address = 127.0.0.1
mysqlx-bind-address = 192.168.1.110 ←追加
bind-address行が従来の接続方式(プロトコル)の方で、mysqlx行は Xプラグインで使われる新しいプロトコルのものだそうです。
新しい方はプログラミング言語からの使用がしやすくなっていて、JSON型データも扱えるとかなんとかで、MySQL-Shellはこれで繋がってたような。
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@mysql -p 60003
リブート後の待受ポート状態です。
subro@mysql:~$ ss -atul
tid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:59316 0.0.0.0:*
udp UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:819 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:46127 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:56392 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:sunrpc 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:41073 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:34037 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:*
tcp LISTEN 0 151 192.168.1.110:60000 0.0.0.0:*
tcp LISTEN 0 70 192.168.1.110:60001 0.0.0.0:*
tcp LISTEN 0 64 0.0.0.0:60002 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:60003 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:47789 0.0.0.0:*
良さげです。
9.ファイアウォール有効化
ufw(program for managing a netfilter firewall)で、MySQLと NFSへのアクセスを [nextcloud] からのみ可能になるよう締め付けます。
この手順は一部「Ubuntuでもファイアウォール」に書いていますので、良かったら見てやって下さい。
現在の状態を確認します。
subro@mysql:~$ sudo ufw status
状態: 非アクティブ
ファイアウォールのロギングを有効にします。
subro@mysql:~$ sudo ufw logging on
ログ取得を有効にしました
入ってくる方は全閉じの設定です。
デフォルトではこうなっているので、やらなくても良いです。
subro@mysql:~$ sudo ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)
先に sshdの [60003/tcp] を作業用の PCがあるネットワークにだけ許可しておきます。
この実験環境で [192.168.1.0/24]に許可してしまうと、他のサーバーからでも sshでアクセスできてしまいます。
自分の環境に適宜置き換えて下さい。
subro@mysql:~$ sudo ufw allow from 192.168.1.0/24 to any port 60003 proto tcp
ルールをアップデートしました
MySQLの[60000/tcp]・[60001/tcp]と NFSの[60002/tcp] を [nextcloud]サーバーの IPのみに許可します。
subro@mysql:~$ sudo ufw allow from 192.168.1.109 to any port 60000:60002 proto tcp
ルールをアップデートしました
セッティングが済みましたので、ファイアウォールを有効化します。
subro@mysql:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
リブート後も有効になっているか確認するため、一旦リブートします。
subro@mysql:~$ sudo reboot
リブート後に改めてログインしました。
sshコマンドの [-p 60003]オプションを忘れずに。
状態確認です。
subro@mysql:~$ sudo ufw status numbered
状態: アクティブ
To Action From
-- ------ ----
[ 1] 60003/tcp ALLOW IN 192.168.1.0/24
[ 2] 60000:60002/tcp ALLOW IN 192.168.1.109
良さげです。
10.MySQLに NextCloudのDBを作る
インストールマニュアルの「Example installation on Ubuntu 22.04 LTS」の段落にデータベースでの作業が書いてあります。
To start the MySQL command line mode use the following command:
と書いてあるところからです。
MySQLに NextCloud用のユーザーとして [nextcloud] ユーザーを作ります。
これは MySQLのユーザーで、OSのユーザーではありませんのでご注意下さい。
subro@mysql:~$ mysql -u root -p
Enter password: 12345678 ← MySQLの[root]ユーザーのパスワードです。実際に画面には出ません。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.32-0ubuntu0.22.04.2 (Ubuntu)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'nextcloud'@'nextcloud' IDENTIFIED BY 'Abcd1234#'; ← [nextcloud]ユーザーは[nextcloud]サーバーからしか接続できません。パスワードは[Abcd1234#]としました。
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ← [nextcloud]データベースを作りました。[utf8mb4]は絵文字対応だそうです。
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'nextcloud'; ← [nextcloud]データベースに対する全件を[nextcloud]ユーザーに付与します。
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; ← 権限設定変更を即時反映させます。
mysql> quit;
Bye
subro@mysql:~$
できました。
データベース作成はこれで良いようです。
これにて、[mysql]サーバーの構築は終わりです。
「NextCloud ちょっと本気環境 3」では NextCloudのサーバー構築をします。