![見出し画像](https://assets.st-note.com/production/uploads/images/106164682/rectangle_large_type_2_d00e8cb988ffca030d32810a31ecd06a.png?width=800)
AlmaLinux(8.8)+NginxでRocketChatを構築する
やりたいこと
小規模自治体では、チャットツールですら予算が通らないこともある。だったらOSSのチャットツールを構築しよう。
Ubuntuではアプリを指定するだけで構築が完了するらしいですが、余計なリソースを食わない軽いディストリビューションで構築をします。自宅で構築して、職場に持ってきやすいようにするという理由もあります。なお、自自治体で構築したときは、CentOSStream8で約6GBだったので、家でHyper-Vで構築し、エクスポート後にUSBメモリに入れて、職場でインポートしました。
このページでは、まずRocketChatを利用ができる環境を構築するまでを記事にしようと思います。
環境
AlmaLinux 8.8
httpサーバ Nginx(https化)
DBサーバ mongoDB
RocketChat 6.2.2
全て同一サーバ内で構築する
RocketChat6.2.2の必要なミドルウェアは以下の通り
Node 14.21.3
NPM 6.14.17
MongoDB 4.4, 5.0, 6.0
Apps-Engine 1.39.1
構築
AlmaLinuxはミラーサイトからダウンロードしておきます。なお、minimal版でインストールします。とりあえずインターネットとssh接続ができる状態にしておきます。
なお、サーバは下記の構成で構築しました。
Hyper-V
CPU 割り当て2コア
メモリ 4096MB
HDD 20GB
yumリポジトリのアップデートを行います。また、構築中はSELinuxを無効化しておきます。(いつか真面目に勉強せねば…)
yum -y update
vi /etc/sysconfig/selinux
//以下に変更
SELINUX=Disabled
mongoDBのyumリポジトリを追加します。mongoDBは5.0にしました。6.0で構築しようとしたところうまくいかなかったので…
vi /etc/yum.repos.d/mongodb-org-5.0.repo
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
そのほか必要なパッケージをダウンロードします。
yum -y install curl tar
curl -sL https://rpm.nodesource.com/setup_14.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 && n 14.21.3
yum install -y nginx
この段階で各ミドルウェアのバージョンを確認します。
[root@localhost ~]# node -v
v14.21.3
[root@localhost ~]# npm -v
6.14.18
[root@localhost ~]# mongod --version
db version v5.0.18
Build Info: {
"version": "5.0.18",
"gitVersion": "796abe56bfdbca6968ff570311bf72d93632825b",
"openSSLVersion": "OpenSSL 1.1.1k FIPS 25 Mar 2021",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel80",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
npmのバージョンが少し高いので、戻します。
npm install -g npm@6.14.17
[root@localhost ~]# npm -v
6.14.17
RocketChat本体をインストールします。インストール後は、ディレクトリを移動させます。
curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
cd /tmp
tar -xvzf ./rocket.chat.tgz -C /tmp
cd /tmp/bundle/programs/server/
npm install
mv /tmp/bundle /opt/Rocket.Chat
rocketchatというユーザを作成し、先ほどインストールしたファイルに割り当てます。
useradd -M rocketchat && usermod -L rocketchat
chown -R rocketchat:rocketchat /opt/Rocket.Chat
さらに、RocketChatをサービスとして作成します。
vi /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
mongoDBの設定を変更します。(1台しかないけどレプリケーション設定)
vi /etc/mongod.conf
//*************************************
#replication のコメントを外し以下に変更
replication:
replSetName: rs01
//*************************************
mongoDBのサービスを有効化とサービスの起動をします。
[root@localhost ~]# systemctl enable mongod
[root@localhost ~]# systemctl start mongod
[root@localhost ~]# mongo --eval "printjson(rs.initiate())"
[root@localhost ~]# systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; preset: disabled)
Active: active (running) since Tue 2023-05-23 20:48:21 JST; 1h 32min ago
Docs: https://docs.mongodb.org/manual
Main PID: 778 (mongod)
Memory: 178.3M
CPU: 20.137s
CGroup: /system.slice/mongod.service
mq778 /usr/bin/mongod -f /etc/mongod.conf
May 23 20:48:21 localhost.localdomain systemd[1]: Started MongoDB Database Server.
RocketChatのサービス登録と起動をします。
[root@localhost ~]# systemctl enable rocketchat
[root@localhost ~]# systemctl start rocketchat
[root@localhost ~]# systemctl status rocketchat
● rocketchat.service - The Rocket.Chat server
Loaded: loaded (/usr/lib/systemd/system/rocketchat.service; enabled; preset: disabled)
Active: active (running) since Tue 2023-05-23 22:58:35 JST; 2s ago
Main PID: 2226 (node)
Tasks: 11 (limit: 23175)
Memory: 108.1M
CPU: 1.411s
CGroup: /system.slice/rocketchat.service
mq2226 /usr/bin/node /opt/Rocket.Chat/main.js
May 23 22:58:35 localhost.localdomain systemd[1]: Started The Rocket.Chat server.
次にNginxの設定を行います。まずはサービスの有効化と、サービスの起動を行います。
[root@localhost ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2023-05-23 23:33:31 JST; 5s ago
Process: 2979 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 2980 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 2981 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 2982 (nginx)
Tasks: 2 (limit: 23175)
Memory: 3.2M
CPU: 19ms
CGroup: /system.slice/nginx.service
tq2982 "nginx: master process /usr/sbin/nginx"
mq2983 "nginx: worker process"
hostsの設定を行います。サーバ名をrocketchat.localにしました。
[root@localhost ~]# vi /etc/hosts
127.0.0.1 rocketchat.local localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
OpenSSLで暗号鍵を作成します。ここでは、鍵をroot直下に放置していますが、適切なディレクトリに移動するなど、厳重に管理をしてください。とりあえず接続したいので、オレオレ証明書です。
[root@localhost ~]# openssl genrsa 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
...............................................+++++
..........+++++
e is 65537 (0x010001)
[root@localhost ~]# openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:rocketchat.local
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ~]# ll
total 12
-rw-------. 1 root root 934 May 24 2023 anaconda-ks.cfg
-rw-r--r-- 1 root root 1013 May 24 09:53 server.csr
-rw-r--r-- 1 root root 1679 May 24 09:50 server.key
[root@localhost ~]# openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt
Signature ok
subject=C = JP, ST = Hyogo, L = Default City, O = Default Company Ltd, CN = rocketchat.local
Getting Private key
[root@localhost ~]# ll
total 16
-rw-------. 1 root root 934 May 24 2023 anaconda-ks.cfg
-rw-r--r-- 1 root root 1233 May 24 09:54 server.crt
-rw-r--r-- 1 root root 1013 May 24 09:53 server.csr
-rw-r--r-- 1 root root 1679 May 24 09:50 server.key
[root@localhost ~]# chmod 400 server.*
[root@localhost ~]# ll
total 16
-rw-------. 1 root root 934 May 24 2023 anaconda-ks.cfg
-r-------- 1 root root 1233 May 24 09:54 server.crt
-r-------- 1 root root 1013 May 24 09:53 server.csr
-r-------- 1 root root 1679 May 24 09:50 server.key
Nginxをリバースプロキシとして使用し、https化を行います。ついでにhttpで接続してきたらhttpsにリダイレクトします。(1台しかないけどロードバランシング)
[root@localhost conf.d]# vi /etc/nginx/conf.d/rproxy.conf
# Upstreams
upstream backend {
server 127.0.0.1:3000;
}
server {
listen 80;
return 301 https://$host$request_uri;
}
# HTTPS Server
server {
listen 443;
server_name rocketchat.local;
# 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 /root/server.crt;
ssl_certificate_key /root/server.key;
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;
}
}
ファイアウォールでhttpとhttpsのポートを開放します。
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=443/tcp --permanent
[root@localhost ~]# firewall-cmd --add-service=http --permanent
[root@localhost ~]# firewall-cmd --add-service=https --permanent
[root@localhost ~]# firewall-cmd --reload
ログのローテート設定を行います。下記の設定は、毎日ログをローテートし、30日間ログを残し、古いログは圧縮する設定です。
[root@localhost ~]# vi /etc/logrotate.d/nginx
/var/log/nginx/*log {
create 0664 nginx root
daily
rotate 30
delaycompress
missingok
notifempty
compress
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
アップロードファイル一時置き場の設定
ファイルアップロード時に/tmp/ufsに一度ファイルが書き出しされます。このディレクトリに10日以上最終更新がないと(=ファイルのアップロードがないと)、消えてしまいます。消えるとアップロードができなくなります。
systemd-tmpfilesサービスによって/var/tmpや/tmpが定期的にクリーンアップされるため、そのような現象となります。
[root@localhost tmp]# ll
drwx------ 2 rocketchat rocketchat 6 May 25 10:26 ufs //これが消える
tmpfiles.dにファイルを作成し、一行記述します。
[root@localhost ~]# vi /etc/tmpfiles.d/rocketchat.conf
//以下を記述
d /tmp/ufs 700 rocketchat rocketchat
実行確認
この段階でブラウザを使い、https://[IP]で接続すると初期設定画面が表示されます。また、http://[IP]で接続するとhttpsにリダイレクトされることを確認します。
![](https://assets.st-note.com/img/1684940316329-CLdhViiOf8.png?width=800)
アプリケーションの設定については、別の記事で書きたいと思います。
参考サイト
この記事が気に入ったらサポートをしてみませんか?