Что есть 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 | ➔ | | ➔ +---------------------------------------------------+
Пробую через браузер обратиться на 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.