見出し画像

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にリダイレクトされることを確認します。

アプリケーションの設定については、別の記事で書きたいと思います。

参考サイト


この記事が気に入ったらサポートをしてみませんか?