Что есть RocketChatэто Ваш собственный мессенджер, развернутый и работающий на Вашем собственном железе, по аналогии с openfire, но также может работать в паре с блогом на базе WordPress, может с другими тоже, я не проверял. Сперва знакомлюсь по различным статьям на Ubuntu Xenial дабы понять/вкусить все нюансы установки прежде чем адаптировать данную заметку на Ubuntu 18.04 Server которую использую в повседневности.

Образ ubuntu-16.04.5-server-amd64.iso развернут под Virtualbox основной системы Ubuntu 18.04 Desktop amd64 ноутбука Lenovo E555

  • RAM = 4Gb
  • HDD = 50Gb (фиксированный диск)
  • CPU = 2

Шаг №1: После инсталляции операционной системы применяю свой настроечный скрипт скачиваемый с локального репозитария под управлением Mercurial

ekzorchik@srv-xenial:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-xenial:~$ sudo ./dproject/default

Шаг №2: Установка и настройка MongoDB.

ekzorchik@srv-xenial:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

ekzorchik@srv-xenial:~$ echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse

ekzorchik@srv-xenial:~$ sudo apt-get update && sudo apt-get install -y mongodb-org

ekzorchik@srv-xenial:~$ sudo systemctl start mongod

ekzorchik@srv-xenial:~$ sudo systemctl status mongod | head -n 5

● mongod.service - High-performance, schema-free document-oriented database

Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)

Active: active (running) since Mon 2019-01-14 21:55:00 MSK; 8s ago

Docs: https://docs.mongodb.org/manual

Main PID: 2028 (mongod)

ekzorchik@srv-xenial:~$ sudo systemctl enable mongod

Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /lib/systemd/system/mongod.service.

ekzorchik@srv-xenial:~$ ps aux | grep mongod | head -n1

mongodb 2028 1.3 2.6 277844 53996 ? Ssl 21:54 0:00 /usr/bin/mongod --quiet --config /etc/mongod.conf

Запрещаем анонимный доступ к MongoDB, создаем базу, пользователя и пароль под эту базу:

ekzorchik@srv-xenial:~$ sudo mongo

MongoDB shell version: 3.2.22

connecting to: test

Welcome to the MongoDB shell.

> use admin

switched to db admin

> db.createUser({user:"ekzorchik",pwd:"712mbddr@",roles:[{role:"root",db:"admin"}]})

Successfully added user: {

"user" : "ekzorchik",

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

> quit()

Для смены пароля используется команда:

db.updateUser("saadmin", { pwd: "xxxXXXxxx"})

Для запрета анонимного доступа добавляем в файл /etc/mongod.conf параметр:

ekzorchik@srv-xenial:~$ sudo nano /etc/mongod.conf

security:

authorization: enabled

Базу данных для применения параметров потребуется перезапустить при помощи команды:

ekzorchik@srv-xenial:~$ sudo systemctl restart mongod

Повторно подключаемся к MongoDB с использованием авторизации:

ekzorchik@srv-xenial:~$ mongo --port 27017 -u "ekzorchik" -p "712mbddr@" --authenticationDatabase "admin"

MongoDB shell version: 3.2.22

connecting to: 127.0.0.1:27017/test

2019-01-14T22:01:24.866+0300 I STORAGE [main] In File::open(), ::open for '/home/ekzorchik/.mongorc.js' failed with errno:13 Permission denied

The ".mongorc.js" file located in your home folder could not be executed

ekzorchik@srv-xenial:~$ sudo chown -R $USER:$USER /home/$USER

ekzorchik@srv-xenial:~$ mongo --port 27017 -u "ekzorchik" -p "712mbddr@" --authenticationDatabase "admin"

MongoDB shell version: 3.2.22

connecting to: 127.0.0.1:27017/test

Server has startup warnings:

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** We suggest setting it to 'never'

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

> quit()

Теперь при подключении анонимным пользователем, на любые операции мы будем получать ошибку:

Error: Updating user failed: not authorized on admin to execute command

Так как даже с включенной авторизацией анонимный доступ возможен, то рекомендую запретить доступ к базе из недоверенных сетей, оставив доступ только с локального хоста и из VPN-сетей:

# network interfaces

net:

port: 27017

bindIp: 127.0.0.1

Шаг №3: Для работы Rocket.Chat потребуется несколько дополнительных пакетов:

ekzorchik@srv-xenial:~$ sudo apt-get install npm curl graphicsmagick -y

Шаг №4: Скачиваем текущую версию (Rocket.Chat) с официального сайта и распаковываем:

ekzorchik@srv-xenial:~$ curl -L https://releases.rocket.chat/latest/download/ -o rocket.chat.tgz

ekzorchik@srv-xenial:~$ file rocket.chat.tgz

rocket.chat.tgz: gzip compressed data, last modified: Mon Jan 7 16:31:59 2019, from Unix

ekzorchik@srv-xenial:~$ tar zxf rocket.chat.tgz

ekzorchik@srv-xenial:~$ mv bundle/ Rocket.Chat

Шаг №5: Для работы Rocket.Chat потребуется установка Node.js строго определенной версии, а узнать требуемую версию можно в файле .node_version.txt в корне текущего дистрибутива (можно использовать команду):

ekzorchik@srv-xenial:~$ cat ./Rocket.Chat/.node_version.txt

v8.11.4

Шаг №6: Устанавливаем Node.js требуемой версии.

ekzorchik@srv-xenial:~$ sudo npm install -g n

/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n

/usr/local/lib

└── n@2.1.12

ekzorchik@srv-xenial:~$ cd Rocket.Chat/programs/server/

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ sudo n 8.11.4

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ cd ~

Шаг №7: Создаем базу данных и назначаем права доступа:

ekzorchik@srv-xenial:~$ mongo --port 27017 -u "ekzorchik" -p "712mbddr@" --authenticationDatabase "admin"

MongoDB shell version: 3.2.22

connecting to: 127.0.0.1:27017/test

> use rocket-chat

switched to db rocket-chat

> db.test.insert({"test":"test"})

WriteResult({ "nInserted" : 1 })

> db.delete.insert({"test":"test"})

WriteResult({ "nInserted" : 1 })

> db.createUser({user:"ekzorchik",pwd:"712mbddr@",roles:[{role:"root",db:"admin"}]})

Successfully added user: {

"user" : "ekzorchik",

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

> quit()

ekzorchik@srv-xenial:~$

Проверяем подключение:

ekzorchik@srv-xenial:~$ mongo --port 27017 -u "ekzorchik" -p "712mbddr@" --authenticationDatabase "rocket-chat"

MongoDB shell version: 3.2.22

connecting to: 127.0.0.1:27017/test

Server has startup warnings:

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** We suggest setting it to 'never'

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

>

> quit()

ekzorchik@srv-xenial:~$

Шаг №8: Назначаем переменные окружения и проводим тестовый запуск:

ekzorchik@srv-xenial:~$ export ROOT_URL=https://172.33.33.41:3000/

ekzorchik@srv-xenial:~$ export MONGO_URL=mongodb://ekzorchik:712mbddr@@localhost/rocket-chat

ekzorchik@srv-xenial:~$ export PORT=3000

ekzorchik@srv-xenial:~$ cd Rocket.Chat/

ekzorchik@srv-xenial:~/Rocket.Chat$ ls

main.js programs README server star.json

ekzorchik@srv-xenial:~/Rocket.Chat$ node main.js

module.js:549

throw err;

^

Error: Cannot find module 'fibers'

Шаг №9: Исправляю ошибку Шаг №8устанавливаю все необходимые пакеты, перечисленные в файле packages.json, предоставленном Rocket.Chat

ekzorchik@srv-xenial:~/Rocket.Chat$ cd programs/server/

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ sudo npm install

жалуется что у меня не самая последняя версия npm

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ sudo npm i npm@latest -g

/usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js

/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js

+ npm@6.5.0

added 275 packages, removed 362 packages and updated 49 packages in 22.672s

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ sudo npm audit fix

ekzorchik@srv-xenial:~/Rocket.Chat/programs/server$ cd ../../

ekzorchik@srv-xenial:~/Rocket.Chat$ node main.js

/home/ekzorchik/Rocket.Chat/programs/server/node_modules/fibers/future.js:280

throw(ex);

^

MongoParseError: Unescaped at-sign in authority section

мне кажется это жалоба на пароль 712mbddr@

ekzorchik@srv-xenial:~/Rocket.Chat$ mongo --port 27017 -u "ekzorchik" -p "712mbddr@" --authenticationDatabase "rocket-chat"

> use rocket-chat

switched to db rocket-chat

> db.updateUser("ekzorchik",{pwd:"Aa123456"})

> quit()

ekzorchik@srv-xenial:~/Rocket.Chat$ mongo --port 27017 -u "ekzorchik" -p "Aa123456" --authenticationDatabase "rocket-chat"

MongoDB shell version: 3.2.22

connecting to: 127.0.0.1:27017/test

Server has startup warnings:

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten] ** We suggest setting it to 'never'

2019-01-14T22:00:54.512+0300 I CONTROL [initandlisten]

> quit()

ekzorchik@srv-xenial:~/Rocket.Chat$ export MONGO_URL=mongodb://ekzorchik:Aa123456@localhost/rocket-chat

Проверяю, какие переменные обозначены:

ekzorchik@srv-xenial:~/Rocket.Chat$ export

ekzorchik@srv-xenial:~/Rocket.Chat$ node main.js (Запускается)

Updating process.env.MAIL_URL

Starting Email Intercepter...

LocalStore: store created at

LocalStore: store created at

LocalStore: store created at

Setting default file store to GridFS

Warning: connect.session() MemoryStore is not

designed for a production environment, as it will leak

memory, and will not scale past a single process.

ufs: temp directory created at "/tmp/ufs"

Updating process.env.MAIL_URL

Using GridFS for custom sounds storage

Using GridFS for custom emoji storage

Loaded the Apps Framework and loaded a total of 0 Apps!

(node:10537) DeprecationWarning: background(background) is deprecated, use resize({ background }), extend({ background }) or flatten({ background }) instead

(node:10537) DeprecationWarning: embed(position) is deprecated, use resize({ fit: "contain", position }) instead

➔ System ➔ startup

➔ +---------------------------------------------------+

➔ | SERVER RUNNING |

➔ +---------------------------------------------------+

➔ | |

➔ | Rocket.Chat Version: 0.73.2 |

➔ | NodeJS Version: 8.11.4 - x64 |

➔ | Platform: linux |

➔ | Process Port: 3000 |

➔ | Site URL: https://172.33.33.41:3000/ |

➔ | ReplicaSet OpLog: Disabled |

➔ | Commit Hash: 8ff0e3da16 |

➔ | Commit Branch: HEAD |

➔ | |

➔ +---------------------------------------------------+

Сервис Rocket.Chat успешно запущен на Ubuntu 16.04 Server

Пробую через браузер обратиться на URL: https://172.33.33.41:3000, но Google Chrome послал меня в далекое пешее сообщение вида:

«Этот сайт не может обеспечить безопасное соединение

Сайт 172.33.33.41 отправил недействительный ответ.

ERR_SSL_PROTOCOL_ERROR»

Проверяю, а слушается ли порт 3000 в системе через утилиту netstat:

ekzorchik@srv-xenial:~$ sudo netstat -tulpn

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2112/mongod

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1111/sshd

tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 10626/node

tcp6 0 0 :::22 :::* LISTEN 1111/sshd

udp 0 0 0.0.0.0:68 0.0.0.0:* 920/dhclient

Прерываю запущенный Rocket.Chat по сочетанию клавиш Ctrl + C:

^C

ekzorchik@srv-xenial:~/Rocket.Chat$

Так почему же не идет соединение через браузер?

Шаг №10: Видимо нужен какой-то веб сервис (да еще хотя бы с самоподписанным сертификатом), к примеру Apache && Nginx по крайней мере я это видел в заметках выдаваемых мне Google“ом.

ekzorchik@srv-xenial:~$ sudo apt-get install nginx -y

ekzorchik@srv-xenial:~$ sudo mkdir -p /etc/nginx/ssl/

ekzorchik@srv-xenial:~$ cd /etc/nginx/ssl/

ekzorchik@srv-xenial:/etc/nginx/ssl$ sudo openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/rocket-chat.crt -keyout /etc/nginx/ssl/rocket-chat.key

Common Name (e.g. server FQDN or YOUR name) []:172.33.33.41

ekzorchik@srv-xenial:/etc/nginx/ssl$ sudo chmod 400 rocket-chat.key

ekzorchik@srv-xenial:/etc/nginx/ssl$ cd ~

ekzorchik@srv-xenial:~$ sudo nano /etc/nginx/sites-available/rocket-chat

# Upstreams

upstream backend {

server 127.0.0.1:3000;

}

# Redirect Options

server {

listen 80;

server_name 172.33.33.41;

# enforce https

return 301 https://$server_name$request_uri;

}

# HTTPS Server

server {

listen 443;

server_name 172.33.33.41;

error_log /var/log/nginx/rocketchat.access.log;

ssl on;

ssl_certificate /etc/nginx/ssl/rocket-chat.crt;

ssl_certificate_key /etc/nginx/ssl/rocket-chat.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # dont use SSLv3 ref: POODLE

location / {

proxy_pass http://172.33.33.41:3000/;

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-Forward-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forward-Proto http;

proxy_set_header X-Nginx-Proxy true;

proxy_redirect off;

}

}

ekzorchik@srv-xenial:~$ sudo ln -s /etc/nginx/sites-available/rocket-chat /etc/nginx/sites-enabled/rocket-chat

ekzorchik@srv-xenial:~$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

ekzorchik@srv-xenial:~$ sudo systemctl restart nginx

ekzorchik@srv-xenial:~/Rocket.Chat$ export ROOT_URL=https://172.33.33.41

ekzorchik@srv-xenial:~/Rocket.Chat$ export MONGO_URL=mongodb://ekzorchik:Aa123456@localhost/rocket-chat

ekzorchik@srv-xenial:~/Rocket.Chat$ export PORT=3000

ekzorchik@srv-xenial:~/Rocket.Chat$ node main.js

После когда Rocket.Chat запуститься, открываю браузер и в строке адреса указываю https://172.33.33.41 и если вижу, что Rocket.Chat загрузился и готов к процедуре первичной настройки: нажимаю «Дополнительные» — «Перейти на сайт 172.33.33.41 (небезопасно)», вижу мастер установки. Но это все замечательно, а после того как я его пройду, мне что опять вручную запускать строку node main.js.

Шаг №11: Думаю что так дело не пойдет, нужно настроить запуск Rocket.Chat как сервис дабы запускался вместе с системой при старте:

ekzorchik@srv-xenial:~/Rocket.Chat$ cd ~

ekzorchik@srv-xenial:~$ sudo mv Rocket.Chat/ /opt/

ekzorchik@srv-xenial:~$ cd /opt/Rocket.Chat/

ekzorchik@srv-xenial:/opt/Rocket.Chat$ sudo npm install -g forever

/usr/local/bin/forever -> /usr/local/lib/node_modules/forever/bin/forever

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/forever/node_modules/fsevents):

npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ forever@0.15.3

added 242 packages from 153 contributors in 18.95s

ekzorchik@srv-xenial:/opt/Rocket.Chat$ sudo npm install -g forever-service

npm WARN deprecated swig@1.4.2: This package is no longer maintained

/usr/local/bin/forever-service -> /usr/local/lib/node_modules/forever-service/bin/forever-service

/usr/local/bin/get-forever-config -> /usr/local/lib/node_modules/forever-service/bin/get-forever-config

+ forever-service@0.5.11

added 21 packages from 38 contributors in 4.144s

ekzorchik@srv-xenial:/opt/Rocket.Chat$ sudo forever-service install -s main.js -e "ROOT_URL=https://172.33.33.41 MONGO_URL=mongodb://ekzorchik:Aa123456@localhost/rocket-chat PORT=3000" rocketchat

forever-service version 0.5.11

Platform - Ubuntu 16.04.5 LTS

rocketchat provisioned successfully

Commands to interact with service rocketchat

Start - "sudo service rocketchat start"

Stop - "sudo service rocketchat stop"

Status - "sudo service rocketchat status"

Restart - "sudo service rocketchat restart"

ekzorchik@srv-xenial:~$ sudo systemctl enable rocketchat

rocketchat.service is not a native service, redirecting to systemd-sysv-install

Executing /lib/systemd/systemd-sysv-install enable rocketchat

Проверяю, как отработает запуск сервиса Rocket.Chat автоматически после перезагрузки системы.

ekzorchik@srv-xenial:~$ sudo reboot

ekzorchik@srv-xenial:~$ sudo netstat -tulpn | grep LISTEN | egrep :3000\|:443

tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1193/node

tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1119/nginx -g daemo

Хотя хоть и сервис (rocketchat) запущен, порт не слушается, только после того, как я обратился на URL вида https://172.33.33.41 порт стал прослушиваться и команда netstat его показала.

Как видно все действия это единый механизм что из чего вытекает и что за чем следует. Данная инструкция писалась под себя и конечно же не с первого раза. О том, как настроить Rocket.Chat будет отдельная заметка дабы не загромождать текущую. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.