Rocketchatのインストール
メンバー同士のメッセージルールとしてrocketchat をGKE 上で運用していたが、2020年6月から価格改定によって1クラスタ当り$0.10/hrsの管理手数料を取られるを取られるようになる。これにより月8,000円上乗せされることになるので別サーバへ移行することにした。正直それほど可用性は必要ないので普通のVPSに移行する。コストパフォーマンスが良さそうなところを色々調べたところNTTPCが運用しているWebArena Indigo が性能に対して費用が安いようなのでこちらにRocketchatをインストールしてみた。なおOSはCentOS8.3を使用。
MongoDB インストール等
MongoDBをインストールするため、yumのレポジトリとしてMongoDBのレジストリ設定をする。
cat << EOF | sudo tee -a /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
MongoDBの他、Node.js等のパッケージをインストールする。
yum install -y curl && curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
yum install -y gcc-c++ make mongodb-org nodejs
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
yum install -y GraphicsMagick
npm install -g inherits n && sudo n 12.14.0
yum install -y nginx
各種パッケージのアップデートとSELINUXのDisable化をする。Kernelもアップデートされるためリブートを実施。
yum -y check-update
yum update
vi /etc/sysconfig/selinux
---
SELINUX=disabled # Disabledに変更
---
reboot
Rocketchat のインストールと設定
Rocketchat をダウンロードしてインストール。
curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
tar -xvzf /tmp/rocket.chat.tgz -C /tmp
cd /tmp/bundle/programs/server && npm install
mv /tmp/bundle /opt/Rocket.Chat
rocketchat ユーザを作成してsystemdの設定ファイルを作成
useradd -M rocketchat && sudo usermod -L rocketchat
chown -R rocketchat:rocketchat /opt/Rocket.Chat
cat << EOF |sudo tee -a /lib/systemd/system/rocketchat.service
[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
[Service]
ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=http://localhost:3000/ PORT=3000
[Install]
WantedBy=multi-user.target
EOF
MongoDB の設定と起動
sed -i "s/^#replication:/replication:\n replSetName: rs01/" /etc/mongod.conf
systemctl enable mongod && sudo systemctl start mongod
mongo --eval "printjson(rs.initiate())"
rocketchat の起動
systemctl enable rocketchat && sudo systemctl start rocketchat
TLS/SSL設定
最近のブラウザはHTTPSでないと警告を発するためHTTPS対応はほぼ必須の状況。ここではNginx をリバースプロキシとして動かし、Let’s Encrypt でサーバ証明書を発行、Nginxに登録することでHTTPS対応とさせた。
Let’s Encryptを使ってサーバ証明書を発行するためcertbot を使う。
yum install wget -y
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
またLet’s Encryptがサイトの存在を確認するためこのタイミングでNginxを起動させる。
systemctl enable nginx && systemctl start nginx
下記コマンドにてサーバ証明書発行を行う。最初は--dri-run
でコマンドラインが間違いないか念の為確認した上で、次に--dri-run
を外して実行する。なお発行するホスト名はLet’s Encryptがサイトを確認する必要があるためこの段階でDNSに登録されている必要がある。下記ではホスト名に「chat.example.com」、メールアドレスに「mailaddr@example.com」を例として使用した。
下記コマンド実行後に2回ほど入力を求められるがその時は「Agree」と「Yes」を選択する。
/usr/local/bin/certbot-auto certonly --dry-run --webroot -w /usr/share/nginx/html -d chat.example.com -m mailaddr@example.com
/usr/local/bin/certbot-auto certonly --webroot -w /usr/share/nginx/html -d chat.example.com -m mailaddr@example.com
リバースプロキシの設定
リバースプロキシの設定をする。設定ファイルに先程作成したサーバ証明書と秘密鍵を指定する。
vi /etc/nginx/conf.d/rproxy.conf
---
# Upstreams
upstream backend {
server 127.0.0.1:3000;
}
# HTTPS Server
server {
listen 443;
server_name chat.example.com;
# You can increase the limit if your need to.
client_max_body_size 200M;
error_log /var/log/nginx/rocketchat.access.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/chat.example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # don’t use SSLv3 ref: POODLE
location / {
proxy_pass http://backend/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}
---
リバースプロキシの設定を追加したのでNginxを再起動する。
systemctl restart nginx
発行された証明書の有効期限は90日なのでcronにて定期的に更新されるようにする。
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew --post-hook \"/usr/sbin/nginx -s reload\" -q" | sudo tee -a /etc/crontab > /dev/null
参考サイト
- Rocket.Chat in CentOS by Rocketchat
- Configuring SSL Reverse Proxy by Rocketchat
- Nginx on CentOS/RHEL 8 by certbot