Sakura VPSサーバにCentOS Stream9を突っ込んでApache(Let's encrypt)、MariaDB、NodeJSあたりをサクッと準備する方法

# ただのインストールメモです。

> Webサーバ立てて、DBとNodeがあれば何か作れるよねって事で、インストールメモです。Let's encrypt周りの部分は、Stream9の少し前のバージョンではSnapdが手動でないと入らなかったりと、同じStream9でも、Web上の情報が色々なので、2022年3月14日時点でのインストールログを残しておきます。
> 仮に**tmu.ac**というホスト名を割り当てるという事で説明します。

## OS初期化設定
Sakuraのコンソールで**OS再インストール**を選び、以下の設定でCentOS Stream9をインストールする。

|                項目                 |          選択          |
| :---------------------------------: | :--------------------: |
|         OSインストール形式          |         標準OS         |
|           インストールOS            | CentOS Stream9 X86_64  |
|   新しい管理ユーザーのパスワード    |         内緒💛          |
|    スタートアップスクリプト利用     |    Setup and update    |
|   初回起動時にパッケージ更新する    |        更新する        |
|  日本語環境 ja_JP.UTF-8 に変更する  | ja_JP.UTF-8 に変更する |
|         ホスト名を設定する          |       tmu.ac        |
|         SSHポートを変更する         |           22           |
|          ログインユーザ名           |         内緒💛        |
| github.com に登録済みの公開鍵を設定 |       内緒💛        |
|           キーボード配列            |       変更しない       |
|      VM内部のファイアウォール       |       有効化する       |
|  ウェブ管理インタフェース Cockpit   |    インストールする    |
|                IPv6                 |       有効化する       |
|         スワップ(swapfile)          |       作成しない       |
| パッケージ管理システム Snappy(snap) |    インストールする    |
|               SELinux               |      有効化しない      |
|      カーネルクラッシュダンプ       |      有効化しない      |
|            タイムゾーン             |       変更しない       |
|       パケットフィルター設定        |       利用しない       |
|       サーバーへのSSHキー登録       |        登録する        |
|               SSHキー               |         内緒💛          |
|    パスワードを利用したログイン     |       無効にする       |


## 各種インストール

### Apache+PHP+PostgreSQL+MariaDB+VIMのインストール
```
sudo dnf install -y httpd mod_ssl httpd-tools httpd-devel httpd-manual php php-cli php-gd php-pdo php-mbstring mariadb mariadb-server vim
```

## Webサーバまわり

### Apaceh起動
```
sudo sh -c "echo \"ServerName hogehoge.com:80\" >> /etc/httpd/conf.d/my.conf"
sudo systemctl enable --now httpd
```

### Firewallでhttpとhttpsを許可
```
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload
```

### Snapdのインストール（Let's Encryptに必要）

```
sudo dnf -y install epel-release
sudo dnf --enablerepo=epel -y install snapd
sudo systemctl enable --now snapd.service snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
```
もしかしたら端末立ち上げなおす必要があるような情報があったので、そうしてみましたが、```source ~/.bachrc```で十分かもしれない。あるいは、そのままでも行けるかもしれない。（未調査）

```
sudo snap install core
sudo snap refresh core
```

### Let's Encryptのインストールと証明書取得

```
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
```

```
sudo certbot --apache
# 本来なら上のコマンドで行けるはずだが、エラーがでるので、昔ながらの方法で。
sudo certbot certonly --webroot -w /var/www/html -d tmu.ac
```

成功すれば証明書のパスが表示される。

```
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/tmu.ac/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/tmu.ac/privkey.pem
This certificate expires on 2022-06-11.
```

このパスをApacheの設定ファイルを突っ込む。

```
sudo sh -c "echo \"
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/tmu.ac/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/tmu.ac/privkey.pem
</VirtualHost>\" >> /etc/httpd/conf.d/my.conf"
```

Apache再起動（この時点で **https&colon;//tmu.ac/** でSSL接続できるはず）

```
sudo systemctl restart httpd
```

ついでに、Cockpictへ証明書のインストール。.cert形式じゃないとダメみたいなのでfullchainとprivkeyくっつけて.certを作り、Cockpitの証明書格納ディレクトリに、そのシンボリックリンクを置く。

```
sudo sh -c "cat /etc/letsencrypt/live/tmu.ac/fullchain.pem /etc/letsencrypt/live/tmu.ac/privkey.pem > /etc/letsencrypt/live/tmu.ac/ssl.cert"
sudo ln -s /etc/letsencrypt/live/tmu.ac/ssl.cert  /etc/cockpit/ws-certs.d/ssl.cert
```

Cockpit再起動（https&colon;//tmu.ac:9090/でCockpitにセキュアに接続できるはず）

```
sudo systemctl restart cockpit.socket
```

### 証明書更新のcrontab組み込み（pemからcert作成も含む）

certbotで定期的に証明書をrenewするようcronに組み込む。certbotは証明書の残り期間を見て、ちょうど良い時のみrenewsするので、比較的こまめにcertbotを動かしていても問題はない。ここでは、毎週月曜日の3時23分に行う事とする。時間は0分は（世界中でその時間に動くcronが多そうという根拠ない理由で）避け、テキトーに選ぶと良いかも。

```
sudo sh -c "echo '
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
23 03 * * 1 sudo certbot renew --deploy-hook \"sudo sh -c \\\"cat /etc/letsencrypt/live/tmu.ac/fullchain.pem /etc/letsencrypt/live/tmu.ac/privkey.pem > /etc/letsencrypt/live/tmu.ac/ssl.cert;sudo systemctl restart httpd\\\"\"' >> /etc/cron.d/0SSLUpdate"
```

### 証明書をroot以外からも見られるよう専用のグループを作っておく

letsencrypt(別に名前はなんでも良い)というグループを作って、自分や他のユーザに割り当てておきましょう。nodeでwssサーバ作るときとかに、証明書へのアクセスが必要になります。

```
groupadd letsencrypt
usermod -aG letsencrypt *username*
sudo chown root:letsencrypt  /etc/letsencrypt/{live,archive}/
sudo chmod g+rx /etc/letsencrypt/{live,archive}/
```
※新しい端末を使わないと設定が反映されませんので、確認したい場合は注意。

## RDBまわり

### MariaDB (MySQL)の初期設定

MariaDBの起動
```
sudo systemctl enable -now mariadb
mysql_secure_installation
```
#### MariaDB　データベース＆ユーザ作成

```
mysql -u root -p
CREATE DATABASE *dbname*;
CREATE user *username*;
GRANT ALL ON dbname.* TO username@localhost IDENTIFIED BY '*password*';
exit
```

ログイン方法

```
mysql -u username -D dbname -p
passwordを入れる
```

## NodeJSまわり

### バージョン管理システムVoltaインストール（失敗）

Volta: https://docs.volta.sh/guide/
Voltaというバージョン管理システムが良さげ。

Voltaをインストール
```
curl https://get.volta.sh | bash
```
ん？
```
  Installing latest version of Volta (1.0.5)
    Checking for existing Volta installation
    Fetching archive for Linux, version 1.0.5
curl: (22) The requested URL returned error: 404

Error: Could not download Volta version '1.0.5'. See https://github.com/volta-cli/volta/releases for a list of available releases
```
うーん、できない。

たぶん、CentOS Stream9のopensslが3.0なのが悪さをしている模様。

上記コマンドを実行するとGitHubからVoltaをダウンロードしてインストールしてくれるのですが、そのダウンロードするファイルが『volta-1.0.5-linux-openssl-1.1.tar.gz』のようにopensslのバージョン別にファイルが用意されています。って事で、opebnssl-3.0.tar.gzはまだない。やむを得ず、時間が解決するのを待つ事にする。

### 結局MVNを使ってnode最新版のインストール

と言う訳で気を取り直して、MVNをインストールしnode最新版をインストール。

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.bashrc
nvm install node
```

めでたしめでたし。