ConoHa で VPS を借りて Node.js で HTTPS サーバを建てるまでのメモ（おまけ）

# ねらい

本記事は、私が書いた以下の二つの記事の補足（おまけ）です。Qiita 的に新しい情報は無いと思いますが、自分に必要な情報をまとめておきます。

* [ConoHa で VPS を借りて Node.js で HTTPS サーバを建てるまでのメモ（1/2）](https://qiita.com/mkoku/items/ea107a29fd925081ebcf)
* [ConoHa で VPS を借りて Node.js で HTTPS サーバを建てるまでのメモ（2/2）](https://qiita.com/mkoku/items/3537d9cc7d4c029d886b)

本質的ではない、CentOS 7 の諸設定のメモです。もはやタイトルの「ConoHa」も「Node.js」も「HTTPSサーバ」も関係ありません。
また、何か設定を増やすたびに、随時増えていくと思います。


# ウィルス対策

ウィルス対策ソフト [ClamAV](https://www.clamav.net/) をインストールして、自動スキャン＋自動隔離する設定をする。

## ClamAV のインストール

```shell-session
$ su
# yum install epel-release
# yum install clamav clamav-update
```

## パターンファイルの手動更新

```shell-session
# freshclam
```

## 手動スキャン

* 基本形

```shell-session
$ clamscan [オプション] [スキャンするディレクトリ]
```

* ディレクトリの指定を省略するとカレントディレクトリ内をスキャンする
* -r オプションを付けるとディレクトリ内全てのファイルを（サブディレクトリ内も）スキャンする

```shell-session
$ clamscan -r
```

## 自動実行と感染ファイルの隔離

* 隔離先のディレクトリを作成

```shell-session
$ su
# mkdir /var/infected_virus
```

* 1日1回スキャンを実行し、感染ファイルがあったら隔離させる
    * /etc/cron.daily/ 内に clamav というファイルを作る
    * clamav ファイル内に自動実行、ログ、隔離の設定を書く
    * clamav ファイルを実行可能にする

```shell-session
# cd /etc/cron.daily
# echo "/usr/bin/clamscan -r --quiet --log=/var/log/clamav.log --move=/var/infected_virus/" > clamav
# chmod +x clamav
```


# ログ管理

様々なログを全部見るのはたいへんなので、解析ソフト logwatch を入れる。

* /var/log/ 内のログファイルについて前日分を解析
* 朝4時くらいに解析が実行され
* 結果をメールで送ってくれる

## logwatch のインストール

```shell-session
$ su
# yum install logwatch
```

## logwatch の設定

* 設定ファイル
    * いったん設定ファイル logwatch.conf を削除（中身は空っぽだった）
    * デフォルトの設定ファイルをコピーしてきて
    * 解析結果を送る宛先のメールアドレスを書く（例えば nano エディタで）

```shell-session
# rm /etc/logwatch/conf/logwatch.conf
# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
# nano /etc/logwatch/conf/logwatch.conf
```

```config:/etc/logwatch/conf/logwatch.conf
MailTo = root    # 初期設定は root 宛にメール
↓
MailTo = hoge    # これを hoge ユーザ宛に変更
```

## 手動でテスト

```shell-session
$ su
# logwatch --mailto hoge
```

* hoge 宛にメールでログ解析結果が送られてくる



# kdump の停止

カーネルパニックが起きた時にダンプを吐くサービスらしいが、メモリ容量が不足して起動に失敗している。

```shell-session
$ su
# systemctl list-units --type=service
:
● kdump.service               loaded failed failed  Crash recovery kernel arming
:

$ cat /var/log/messages | grep kdump
:
Mar 13 21:38:04 hogehoge kdumpctl: No memory reserved for crash kernel
Mar 13 21:38:04 hogehoge kdumpctl: Starting kdump: [FAILED]
Mar 13 21:38:04 hogehoge systemd: kdump.service: main process exited, code=exited, status=1/FAILURE
Mar 13 21:38:04 hogehoge systemd: Unit kdump.service entered failed state.
Mar 13 21:38:04 hogehoge systemd: kdump.service failed.
:
```

手動でメモリ割り当てを増やせばいいらしいが、個人的に必要ないので、サービス自体を停止する。

```shell-session
$ su
# systemctl disable kdump.service
Removed symlink /etc/systemd/system/multi-user.target.wants/kdump.service.
```


# Webmin の設定

Web ブラウザからシステムの状態を監視したり設定できるグラフィカルなツール [Webmin](http://www.webmin.com/)。なんとなくカッコいいから入れる。

## 必要な Perl モジュールのインストール

```shell-session
$ su
# yum install perl-Net-SSLeay
```

## Webmin のインストール

* 最新のバージョン番号は[ココ](http://download.webmin.com/download/yum/)で確認

```shell-session
# yum install http://download.webmin.com/download/yum/webmin-1.900-1.noarch.rpm
```

## SSL の設定

* Let's Encrypt で取得した証明書などを Webmin の設定ファイルに指定する（例えば nano エディタで）

```shell-session
# nano /etc/webmin/miniserv.conf
```

```config:/etc/webmin/miniserv.conf
keyfile=/etc/letsencrypt/live/hogehoge.com/privkey.pem
certfile=/etc/letsencrypt/live/hogehoge.com/fullchain.pem
```

* Webmin を再始動

```shell-session
# /etc/rc.d/init.d/webmin restart
```



## ポート 10000 を開放

```shell-session
# firewall-cmd --add-port=10000/tcp --zone=public --permanent
# firewall-cmd --reload
```

## アクセス

* ローカル PC のブラウザで、https://hogehoge.com:10000 にアクセス（自分のサーバのURL:10000）
* root のユーザ名とパスワードを入力
* インタフェースは以下のような感じ（使い方はよくわかっていない（汗））

![webmin.png](https://qiita-image-store.s3.amazonaws.com/0/157570/c7ce094a-f893-bf87-bcb8-622bfdc5a086.png)

* 画面左下のアイコンから「昼/夜モードの切り替え (Alt+L)」で夜にしたほうがカッコいい

![webmin_d.png](https://qiita-image-store.s3.amazonaws.com/0/157570/19f10e56-a817-4ed1-3a6b-6d053dcda270.png)


## UI の日本語化

* 左のメニューで Webmin → Change Language and Theme
* Webmin UI language で「Personal choice」のラジオボタンを選択
* 「Japanese(JA_JP.UTF-8)」 を選択
* 最後に「Make Changes」ボタンをクリック


# TeraCLOUD のストレージをマウント

システムのバックアップやローカルとのファイルのやり取りのために、[TeraCLOUD](https://teracloud.jp/ja/) で 15GB の無料オンラインストレージをゲットする。TeraCLOUD は国産オンラインストレージで、WebDAV (Web-based Distributed Authoring and Versioning) に対応している。このストレージを仮想的な領域として CentOS にマウントする。

## TeraCLOUD への登録

* [TeraCloud](https://teracloud.jp/ja/)  のページでアカウントを作る
* 最初は 10GB
* ログインして「マイページ」に行き、ページ中ほどの「紹介ボーナス情報」欄の「紹介コードを入力する」欄に、[こちらのブログ記事](https://blog.halpas.com/archives/6428)にあった紹介コードを入力して「コード適用」ボタンをクリックすることで、15GB 使えるようになった
* ちなみに私の紹介コードは「**FD7MC**」 ← どうぞお使いください

## VPS にマウント

* [davfs2](https://wiki.archlinux.jp/index.php/Davfs2) をインストール

```shell-session
$ su
# yum install davfs2
```

*  TeraCLOUD の領域をマウントするディレクトリを作成（今回の例では /cloud ）

```shell-session
# mkdir /cloud
```

* TeraCLOUD の「マイページ」中ほどの「クライアント接続情報」の「WebDAV接続URL」欄の URL をメモ（コピー）
    * 例えば https://uno.teracloud.jp/dav/
* マウントする
    * mount -t davfs の後に、WebDAV接続URL、リンクさせるディレクトリ

```shell-session
# mount -t davfs https://uno.teracloud.jp/dav/ /cloud
↓
TeraCLOUD のユーザ名とパスワードを聞かれるので、入力する
```

* マウントされていることを確認（これで 15GB（13GB と表示）のストレージ増量）

```shell-session
# df -h
↓
https://uno.teracloud.jp/dav/    26G   13G   13G   50% /cloud
```

* VPS 上のディレクトリ（今回は /cloud ）内に適当なファイルを作れば、TeraCLOUD の「ファイルブラウザー」でも見えることを確認
* 反対に、TeraCLOUD の「ファイルブラウザー」から適当なファイルを追加すれば、VPS 上のディレクトリでも見えることを確認
    * ローカルマシンからは、Web ブラウザ経由でなくても、[WinSCP](https://winscp.net/eng/docs/lang:jp) や [Cyberduck](https://cyberduck.io/) などの WebDAV 対応クライアントでやりとりできる（[Tera CLOUD のページ](https://teracloud.jp/ja/clients.html)を参照）

* ちなみにアンマウントの方法は以下

```shell-session
# umount https://uno.teracloud.jp/dav/
```


## 自動マウントの設定

上記の mount -t davfs コマンドでマウントしても、再起動したらアンマウントされてしまう。fstab (file systems table) に書いておいて起動時にマウントさせる（[Arch Linux のページ](https://wiki.archlinux.jp/index.php/Davfs2)や[こちら](https://askubuntu.com/questions/277873/mount-webdav-fails-on-reboot)を参考にした）。

### fstab の編集

* /etc/fstab の中に以下のように追記する
    * 書く順序は [file system] [dir] [type] [options] [dump] [fsck]
    * defaults オプションは rw,suid,exec,auto,nouser,async を一気に指定する
    * _netdev オプションはネットワークが開始されるまでマウントを待たせる

```shell-session
$ su
# nano /etc/fstab
```

```config:/etc/fstab
https://uno.teracloud.jp/dav/ /cloud davfs defaults,_netdev 0 0
```

* あるいは、一般ユーザで使うことがメインなら、以下のように書いてもよいだろう

```config:/etc/fstab
https://uno.teracloud.jp/dav/ /home/hoge/cloud davfs _netdev,auto,async,rw,exec,user,suid,uid=1000 0 0
```

* ちなみに fstab の内容を reboot なしに即反映させる方法は以下

```shell-session
# mount -a
```

### マウントを簡単にする設定

* ユーザ名とパスワードの入力を省略させる設定
    * /etc/davfs2/secrets ファイルに以下のように書く

```shell-session
$ su
# nano /etc/davfs2/secrets
```

```config:/etc/davfs2/secrets
https://uno.teracloud.jp/dav/ TeraCLOUDのユーザ名 パスワード
```

* パスワードがテキストで入っているこのファイルのパーミッションには気をつける

```shell-session
# chmod 600 /etc/davfs2/secrets
```

* 以上で、reboot しても、TeraCLOUD の領域が、/cloud ディレクトリにマウントされる


# Visual Studio Code のインストール

GUI (GNOME Desktop) を入れてあり、Node.js などでも遊ぶので、コードを書く用途のテキストエディタとして [Visual Studio Code](https://code.visualstudio.com/) も入れておく。

## インストール

[本家のページ](https://code.visualstudio.com/docs/setup/linux)の指示通りに入れる。

* キーとレポジトリを入れる（何も考えずにおまじない）

```shell-session
$ su
# rpm --import https://packages.microsoft.com/keys/microsoft.asc
# sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
```

* Visual Studio Code 本体を入れる

```shell-session
# yum check-update
# yum install code
```

* GNOME の「アプリケーション」メニューの「アクセサリ」または「プログラミング」から Visual Studio Code を起動できる
* あるいは、ターミナルを開いて code コマンドでも起動できる

## 最新版の git を入れる

* VNC (GNOME Desktop) にて Visual Studio Code を起動すると、Git を入れろと言われた
* 普通に yum install git すると、古いバージョンしか入らなかったので、[こちらの手順](https://qiita.com/mao172/items/f8bb0a7c740f9cc931fb)で最新版を入れる

```shell-session
# yum install https://centos7.iuscommunity.org/ius-release.rpm
# yum erase perl-Git    <- 古いバージョンのアンインストール
# yum install git2u-svn
```


# Mondo Rescue でイメージバックアップ

[Mondo Rescue](http://www.mondorescue.org/) によるイメージまるごとバックアップ方法。ConoHa にはイメージバックアップ機能があるので不要だが、あくまで参考まで。

## Mondo Rescue のインストール

* リポジトリのインストール
* Mondo Rescue と lzo 圧縮ツールのインストール

```shell-session
$ su
# cd /etc/yum.repos.d/
# wget http://www.mondorescue.org/ftp/centos/7/x86_64/mondorescue.repo
# yum install mondo lzop
```

## mindi.conf ファイルの編集

仮想メモリが足りなくなってエラーが出るので、mindi.conf ファイルを編集する。

```shell-session
$ su
# nano /etc/mindi/mindi.conf
```

以下の設定を追記する。

```config:/etc/mindi/mindi.conf
EXTRA_SPACE=320152
BOOT_SIZE=100000
```

EXTRA_SPACE は 240000 とする情報が多かったが、私の環境では上記 320152 でようやく成功。


## バックアップ先ディレクトリの準備

バックアップ先となる任意のディレクトリを作る。TeraCLOUD などの WebDAV ストレージでもよいが、ここでは VPS の一般ユーザのディレクトリ内に作る。あとからイメージをダウンロードする前提。

```shell-session
$ mkdir /home/hoge/backup
```

## イメージバックアップ

例えば以下のコマンドで実行。

```shell-session
$ su
# mondoarchive -O -i -N -L -s16g -E /home/hoge/backup -d /home/hoge/backup -p Backup_yyyymmdd -g
```

各オプションの意味は以下。

* -O	バックアップする
* -i	ISO として保存
* -L	lzo 圧縮を使用
* -N	ローカルファイルのみ（ネットワークは除外）
* -s	最大ファイルサイズ（未指定だと約 680MB の CD サイズ）
* -E	バックアップから除外するディレクトリ（バックアップ先そのものは除外）
* -d	バックアップ先ディレクトリ
* -p	バックアップファイル名（このあとに "-1.iso" が自動で追加される）
* -g	GUIモード（任意、経過の見やすさのため）

最後に、できあがった iso ファイルを任意の場所（WebDAV ストレージや、ローカル PC 等）にダウンロードする。


# まとめ

特にまとまりなく、何か設定を増やすたびに、今後も随時書き足していく予定です。


# 参考

* [福田和宏 (2018). 実践！CentOS7 サーバー徹底構築 改訂第二版 CentOS7(1708)対応, ソーテック社.](http://www.sotechsha.co.jp/sp/1196/)
* [中島能和 (2016). ゼロからはじめるLinuxサーバー構築・運用ガイド 動かしながら学ぶWebサーバーの作り方, 翔泳社.](https://www.shoeisha.co.jp/book/detail/9784798146379)
* @caique さん (2018). [[CentOS7]Webminをインストールする, Qiita.](https://qiita.com/caique/items/e066316c76f464ec2a87)
* [ハルパスさん. 速くてシンプルな国産オンラインストレージ「TeraCLOUD」.](https://blog.halpas.com/archives/6428)
* @halpas さん (2018). [さくらのVPSに無料の外部自動バックアップ機能を追加する方法, Qiita](https://qiita.com/halpas/items/2f51d3b9954367f1587e)
* [KENJI IGUCHI さん (2017). VPSをMONDO RESCUEでバックアップ.](https://www.heistak.com/2017/04/18/setting-up-a-mastodon-instance-1/)
* 
@mao172 さん (2018). [CentOS7 に最新VerのGitコマンドをインストールする, Qiita.](https://qiita.com/mao172/items/f8bb0a7c740f9cc931fb)