{"id":352377,"date":"2024-05-20T22:07:30","date_gmt":"2024-05-20T22:07:30","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=352377"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T22:07:30","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=352377","title":{"rendered":"<span>Telegram-\u0431\u043e\u0442 \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0434\u0438\u0441\u043a\u043e\u0432 \u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u041a\u0430\u043a \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/45\/f8\/x6\/45f8x6s1hrefp1poxf-oru_vo28.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/45\/f8\/x6\/45f8x6s1hrefp1poxf-oru_vo28.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439, \u044f \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 Selectel, \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 <a href=\"https:\/\/selectel.ru\/services\/dedicated\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_tgbot_170823_content\">\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438<\/a> \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/722082\/\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 API Telegram, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c S.M.A.R.T \u0434\u0438\u0441\u043a\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u043e\u043f\u044b\u0442\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0412 \u0441\u0435\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u043d\u043e \u043c\u0430\u043b\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u044f \u0438\u0437\u0443\u0447\u0430\u044e \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438 \u00ab\u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0442\u044b\u043a\u0430\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438 \u0443\u043c\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0441\u0435\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u00ab\u043c\u0435\u0442\u043e\u0434\u0430 \u0442\u044b\u043a\u0430\u00bb \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<br \/>  <a name=\"habracut\"><\/a><br \/>  <b>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0441 \u0431\u043b\u043e\u043a:<\/b><\/p>\n<p>  \u2192 <a href=\"#1\">\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/a><br \/>  \u2192 <a href=\"#2\">\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/a><br \/>  \u2192 <a href=\"#3\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<p>  <a name=\"1\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p><\/font><br \/>  \u0412\u0430\u0436\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 \u043f\u0440\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0435\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043a \u0431\u0443\u0434\u0443\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"https:\/\/www.figma.com\/file\/jLh0Atx8RMUm8xpMjbId51\/%5BSLC%5D-SMART?type=whiteboard&amp;node-id=0-1&amp;t=G34tCY4IwXVRAUVY-0\">\u0441\u0445\u0435\u043c\u044b<\/a> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/8a\/f-\/em\/8af-emq1mhmguftvkaluibjydwi.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/8a\/f-\/em\/8af-emq1mhmguftvkaluibjydwi.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:  <\/p>\n<ol>\n<li><b>\u0421\u0435\u0440\u0432\u0435\u0440<\/b>: \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f vCPU, 4 \u0413\u0411 \u041e\u0417\u0423 \u0438 10 \u0413\u0411 SSD. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u2014 Ubuntu 22.04.<\/li>\n<li><b>\u0412\u043d\u0443\u0442\u0440\u0438\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b Selectel<\/b>: \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 S.M.A.R.T \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.<\/li>\n<li><b>Telegram<\/b>: \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Telegram API \u0434\u043b\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0438 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/li>\n<li><b>\u0421\u0435\u0442\u044c<\/b>: \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438.<\/li>\n<li><b>\u0418\u043d\u0436\u0435\u043d\u0435\u0440<\/b>: \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u041e\u0421 \u0447\u0435\u0440\u0435\u0437 SSH-\u043a\u043b\u044e\u0447 \u0438 \u043d\u0430 \u0432\u0435\u0431-\u043f\u0430\u043d\u0435\u043b\u044c Portainer.<\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u0421\u0435\u0440\u0432\u0435\u0440<\/h3>\n<p>  \u0421\u0435\u0440\u0432\u0435\u0440 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b \u0435\u0433\u043e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 Selectel. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u041e\u0421 \u0432\u044b\u0431\u0440\u0430\u043b Ubuntu 22.04.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/p8\/bb\/ez\/p8bbezedgrv31ocxntyf8t4y7ca.png\" data-src=\"https:\/\/habrastorage.org\/webt\/p8\/bb\/ez\/p8bbezedgrv31ocxntyf8t4y7ca.png\"\/><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u042d\u0442\u0430\u043f\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 srv-smart<\/b>                         <\/p>\n<div class=\"spoiler_text\"><b>\u0420\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430<\/b>  <\/p>\n<pre><code class=\"plaintext\">> root@server:~# lsblk NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS sda       8:0    0   10G  0 disk \u251c\u2500sda1    8:1    0   10G  0 part \/ \u2514\u2500sda14   8:14   0    8M  0 part sr0      11:0    1  492K  0 rom <\/code><\/pre>\n<p>  <b>\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/b><\/p>\n<p>  IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 172.168.1.1.<\/p>\n<pre><code class=\"plaintext\">> ip a 1: lo: &lt;LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000     link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1\/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1\/128 scope host        valid_lft forever preferred_lft forever 2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000     link\/ether fa:16:3e:a9:a5:8a brd ff:ff:ff:ff:ff:ff     altname enp0s3     altname ens3     inet 172.168.1.1\/24 brd 172.168.1.255 scope global eth0        valid_lft forever preferred_lft forever     inet6 fe80::f816:3eff:fea9:a58a\/64 scope link        valid_lft forever preferred_lft forever <\/code><\/pre>\n<p>  <b>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SSH-\u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/b><\/p>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 SSH-\u043a\u043b\u044e\u0447 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0422\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f SSH \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u0430 \u043f\u043e \u043f\u0430\u0440\u043e\u043b\u044e.<\/p>\n<pre><code class=\"plaintext\">ssh-copy-id&lt;\/i> &lt;i>root@172.168.1.1 <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> sed -i 's\/#PermitRootLogin.*\/PermitRootLogin yes\/g' \/etc\/ssh\/sshd_config > sed -i 's\/PasswordAuthentication.*\/PasswordAuthentication no\/g' \/etc\/ssh\/sshd_config  > systemctl restart sshd <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412\u0441\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/www.ansible.com\/\">Ansible<\/a>.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Ansible \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/p>\n<pre><code class=\"plaintext\">> apt-add-repository ppa:ansible\/ansible > apt update > apt install ansible -y > ansible --version ansible [core 2.15.2]   config file = \/etc\/ansible\/ansible.cfg   configured module search path = ['\/root\/.ansible\/plugins\/modules', '\/usr\/share\/ansible\/plugins\/modules']   ansible python module location = \/usr\/lib\/python3\/dist-packages\/ansible   ansible collection location = \/root\/.ansible\/collections:\/usr\/share\/ansible\/collections   executable location = \/usr\/bin\/ansible   python version = 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] (\/usr\/bin\/python3)   jinja version = 3.0.3   libyaml = True <\/code><\/pre>\n<p>  \u0412 \u0444\u0430\u0439\u043b\u0435 <code>\/etc\/ansible\/hosts<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 srv-smart.<\/p>\n<pre><code class=\"plaintext\">[servers] srv-smart ansible_host=172.168.1.1  [all:vars] ansible_python_interpreter=\/usr\/bin\/python3 <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430.<\/p>\n<pre><code class=\"plaintext\">> ansible srv-smart -m ping  srv-smart | SUCCESS => {     \"changed\": false,     \"ping\": \"pong\" } <\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u044b:<\/p>\n<ul>\n<li><code>\u041f\u043e\u0440\u0442 22<\/code> \u2014 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e SSH,<\/li>\n<li><code>eth0<\/code> \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0430\u043d VLAN \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u044f\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Selectel.<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<ul>\n<li><code>portainer<\/code> \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <a href=\"https:\/\/www.portainer.io\/\">Portainer<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u0432 Docker,<\/li>\n<li><code>mongodb<\/code> \u2014 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/www.mongodb.com\/\">MongoDB<\/a>,<\/li>\n<li><code>service<\/code> \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/nodejs.org\/ru\">Node.js<\/a>. <\/li>\n<\/ul>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a> \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u041e\u0421.<\/p>\n<pre><code class=\"plaintext\">> git clone git@bitbucket.org:khamchenko\/smart-slc.git <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u042d\u0442\u0430\u043f\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Docker<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Docker \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">> curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg > echo \"deb [arch=$(dpkg --print-architecture) signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null > apt update > apt-cache policy docker-ce > apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441.<\/p>\n<pre><code class=\"plaintext\">> systemctl status docker \u25cf docker.service - Docker Application Container Engine      Loaded: loaded (\/lib\/systemd\/system\/docker.service; enabled; vendor preset: enabled)      Active: active (running) since Tue 2023-06-06 15:55:44 UTC; 30s ago TriggeredBy: \u25cf docker.socket        Docs: https:\/\/docs.docker.com    Main PID: 3371 (dockerd)       Tasks: 9      Memory: 27.1M         CPU: 706ms      CGroup: \/system.slice\/docker.service              \u2514\u25003371 \/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock > docker -v Docker version 24.0.5, build ced0996 <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>smart-slc\/docker.infra\/.env<\/code>.<\/p>\n<pre><code class=\"plaintext\">MONGO_USER=&lt;mongo-user> MONGO_PASS_PROD=&lt;mongo-pass-prod> MONGO_PASS_DEV=&lt;mongo-pass-dev> MONGO_DB=&lt;mongo-db>  MONGO_INITDB_ROOT_USERNAME=&lt;mongo-root> MONGO_INITDB_ROOT_PASSWORD=&lt;mongo-root-pass> MONGO_INITDB_DATABASE=&lt;mongo-init-db>  TG_TOKEN=&lt;tg-token-jwt>   JWT_SECRET=&lt;jwt-secret> TELEGRAM_TOKEN_DEV=&lt;tg-token-dev> TELEGRAM_TOKEN_PROD=&lt;tg-token-prod> <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/webpack.js.org\/\">webpack<\/a>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>nodejs-build<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 node.js.<\/p>\n<pre><code class=\"plaintext\">> cd .\/smart-slc\/docker.infra\/nodejs-build > docker compose up -d > bash build-prod.sh <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Ansible-\u043f\u043b\u0435\u0439\u0431\u0443\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435 <code>srv-smart<\/code>.<\/p>\n<pre><code class=\"plaintext\">> ansible-playbook docker.infra\/ansible\/srv-smart\/main\/pb_main.yml   <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">> docker ps CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                                           NAMES adb13e7089d8   mongo:latest                    \"docker-entrypoint.s\u2026\"   33 seconds ago   Up 32 seconds   0.0.0.0:35689->27017\/tcp, :::35689->27017\/tcp                   mongodb b6c3e9e2fdfe   nodejs-nodejs                   \"docker-entrypoint.s\u2026\"   2 minutes ago    Up 2 minutes    0.0.0.0:5001-5002->5001-5002\/tcp, :::5001-5002->5001-5002\/tcp   services 694bb2e80cb5   portainer\/portainer-ce:latest   \"\/portainer\"             18 minutes ago   Up 18 minutes   8000\/tcp, 9000\/tcp, 0.0.0.0:9443->9443\/tcp, :::9443->9443\/tcp   portainer <\/code><\/pre>\n<p>  <\/p>\n<h4>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Portainer<\/h4>\n<p>  <a href=\"https:\/\/www.portainer.io\/\">Portainer.io<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438.<\/p>\n<ul>\n<li><code>\u041f\u043e\u0434\u0441\u0435\u0442\u044c (172.18.0.0\/16)<\/code> \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>network-smart<\/code> \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 <code>mongodb<\/code> \u0438 <code>services<\/code>, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/li>\n<li><code>\u041f\u043e\u0434\u0441\u0435\u0442\u044c (172.17.0.0\/16) bridge<\/code>.<\/li>\n<li><code>\u041f\u043e\u0440\u0442 9443<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 Portainer.<\/li>\n<\/ul>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>docker-compose.yml<\/code>.<\/p>\n<pre><code class=\"plaintext\">version: \"3.8\" services:   portainer:     image: portainer\/portainer-ce:latest     container_name: portainer     hostname: portainer     restart: always     ports:       - 9443:9443     volumes:       - \/var\/run\/docker.sock:\/var\/run\/docker.sock       - {{ path_infra }}\/smart-slc\/portainer\/data:\/data <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0424\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\"><b>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b <\/b><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430 <a href=\"https:\/\/172.168.1.1:9443\">https:\/\/172.168.1.1:9443<\/a> \u0438 \u0437\u0430\u0434\u0430\u0435\u043c <code>username<\/code> \u0438 <code>password<\/code>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/n8\/dz\/pp\/n8dzppr9z7gs4kohjmz4yfvyaee.png\" data-src=\"https:\/\/habrastorage.org\/webt\/n8\/dz\/pp\/n8dzppr9z7gs4kohjmz4yfvyaee.png\"\/><\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/r1\/nk\/wc\/r1nkwcpecu1fx-2skb6dkxxx-0a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/r1\/nk\/wc\/r1nkwcpecu1fx-2skb6dkxxx-0a.png\"\/><\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MongoDB Compass.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zw\/f2\/n5\/zwf2n5zyybi8ljdjlmzkkzpolp8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/zw\/f2\/n5\/zwf2n5zyybi8ljdjlmzkkzpolp8.png\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rj\/yx\/j4\/rjyxj4u3wybod7qsupycxa1vxpu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rj\/yx\/j4\/rjyxj4u3wybod7qsupycxa1vxpu.png\"\/><\/div>\n<p>  \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>docker-compose.yml<\/code>.<\/p>\n<pre><code class=\"plaintext\">version: \"3.8\" services:   portainer:     image: portainer\/portainer-ce:latest     container_name: portainer     hostname: portainer     restart: always     ports:       - 9443:9443     volumes:       - \/var\/run\/docker.sock:\/var\/run\/docker.sock       - {{ path_infra }}\/smart-slc\/portainer\/data:\/data <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 MongoDB<\/h4>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 NoSQL \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/www.mongodb.com\/\">MongoDB<\/a>. \u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 users (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438) \u0438 devices (\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430). \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441\u043e \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/schemes\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>  \u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b:<\/p>\n<ul>\n<li><code>\u041f\u043e\u0440\u0442 35689<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445,<\/li>\n<li>\u0441\u0432\u044f\u0437\u044c \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c <code>services<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c <code>network-smart<\/code>. <\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0424\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>docker-compose.yml<\/code>.<\/p>\n<pre><code class=\"plaintext\">version: \"3.8\" services:   mongodb:     image: mongo:latest     container_name: mongodb     hostname: mongodb     restart: always     env_file: [.env]     ports:       - 35689:27017     volumes:       - {{ path_infra }}\/smart-slc\/mongodb\/data:\/data\/db\/       - {{ path_infra }}\/smart-slc\/mongodb\/init-mongo.js:\/docker-entrypoint-initdb.d\/init-mongo.js     networks:       - network-smart     logging:       options:         max-size: \"200k\"         max-file: \"3\" networks:   network-smart:     external: true <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 <code>Mongodb<\/code>.<\/p>\n<pre><code class=\"plaintext\">> docker exec -it mongodb \/bin\/bash > mongosh Current Mongosh Log ID: 64d7802347ddb6a2ae56c7b0 Connecting to:          mongodb:\/\/127.0.0.1:27017\/?directConnection=true&amp;serverSelectionTimeoutMS=2000&amp;appName=mongosh+1.10.1 Using MongoDB:          6.0.8 Using Mongosh:          1.10.1 <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.mongodb.com\/try\/download\/compass\">MongoDB Compass<\/a>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dr\/ml\/lp\/drmllpqavmthtm9kreegs5vf5e8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dr\/ml\/lp\/drmllpqavmthtm9kreegs5vf5e8.png\"\/><\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Services<\/h4>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0440\u0435\u0434\u0443 <a href=\"https:\/\/nodejs.org\/ru\">node.js<\/a> \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c <a href=\"https:\/\/pm2.keymetrics.io\/\">pm2<\/a>. \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li><code>workers-smart<\/code> \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 MongoDB \u0441 \u0411\u0414 Selectel \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445,<\/li>\n<li><code>srv-smart<\/code> \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 S.M.A.R.T.,<\/li>\n<li><code>tg-smart<\/code> \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Telegram.<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0424\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>docker-compose.yml<\/code>.<\/p>\n<pre><code class=\"plaintext\">version: \"3.8\" services:   mongodb:     image: mongo:latest     container_name: mongodb     hostname: mongodb     restart: always     env_file: [.env]     ports:       - 35689:27017     volumes:       - {{ path_infra }}\/smart-slc\/mongodb\/data:\/data\/db\/       - {{ path_infra }}\/smart-slc\/mongodb\/init-mongo.js:\/docker-entrypoint-initdb.d\/init-mongo.js     networks:       - network-smart     logging:       options:         max-size: \"200k\"         max-file: \"3\" networks:   network-smart:     external: true <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b <code>Dockerfile<\/code> \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<pre><code class=\"plaintext\">FROM node:18.14.0  RUN npm install pm2 -g <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b <code>init-node.sh<\/code> \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">#!\/bin\/bash  docker exec -it services \/bin\/bash -c \"cd \/srv\/tg-smart &amp;&amp; npm install\" docker exec -it services \/bin\/bash -c \"cd \/srv\/srv-smart &amp;&amp; npm install\" docker exec -it services \/bin\/bash -c \"cd \/srv\/workers-smart &amp;&amp; npm install\"  docker exec -it services \/bin\/bash -c \"pm2 start\" docker exec -it services \/bin\/bash -c \"pm2 save\" <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b <code>upd-build.sh<\/code> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<pre><code class=\"plaintext\">docker exec -it services \/bin\/bash -c \"cd \/srv\/tg-smart &amp;&amp; npm install &amp;&amp; pm2 restart srv-smart\" docker exec -it services \/bin\/bash -c \"cd \/srv\/srv-smart &amp;&amp; npm install &amp;&amp; pm2 restart smart-slc\" docker exec -it services \/bin\/bash -c \"cd \/srv\/workers-smart &amp;&amp; npm install &amp;&amp; pm2 restart workers-smart\" <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 pm2 <code>ecosystem.config.js<\/code>.<\/p>\n<pre><code class=\"plaintext\">module.exports = {     apps : [{         name: \"tg-smart\",         script: \"\/srv\/tg-smart\/api.prod.js\"     },{         name: \"srv-smart\",         script: \"\/srv\/srv-smart\/api.prod.js\"     },{         name: \"workers-smart\",         script: \"\/srv\/workers-smart\/api.prod.js\"     }] } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">docker exec -it services bash > root@services:\/# pm2 status  <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bz\/2s\/ry\/bz2sryxixr8346tixm4muppiy44.png\" data-src=\"https:\/\/habrastorage.org\/webt\/bz\/2s\/ry\/bz2sryxixr8346tixm4muppiy44.png\"\/><\/div>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> root@services:\/# pm2 monit  <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/t6\/zd\/hx\/t6zdhxs7glxsghf9irqscxwubw4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/t6\/zd\/hx\/t6zdhxs7glxsghf9irqscxwubw4.png\"\/><\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0421\u0445\u0435\u043c\u0430 \u0441\u0432\u044f\u0437\u0435\u0439:<\/p>\n<ul>\n<li><code>\u041f\u043e\u0440\u0442\u044b 5001-5003<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/li>\n<li>\u0421\u0432\u044f\u0437\u044c <code>tg-smart<\/code> \u0438 <code>srv-smart<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 socket.io \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/li>\n<li>\u0421\u0432\u044f\u0437\u044c <code>mongodb-smart<\/code> \u0438 <code>srv-smart<\/code>.<\/li>\n<li>C\u0432\u044f\u0437\u044c <code>mongodb-smart<\/code> \u0438 <code>tg-smart<\/code>.<\/li>\n<li>C\u0432\u044f\u0437\u044c <code>mongodb-smart<\/code> \u0438 <code>workers-smart<\/code> \u2014 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 S.M.A.R.T.<\/li>\n<li>C\u0432\u044f\u0437\u044c <code>worker-smart<\/code> \u0438 <code>\u0432\u043d\u0443\u0442\u0440\u0438\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Selectel<\/code>.<\/li>\n<li>\u0421\u0432\u044f\u0437\u044c <code>tg-smart<\/code> \u0438 <code>Telegram<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0412\u043d\u0443\u0442\u0440\u0438\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b Selectel<\/h3>\n<p>  \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c Selectel \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b <code>mongodb<\/code> \u0438 <code>services<\/code>. \u0421\u0435\u0440\u0432\u0438\u0441 <code>workers-smart<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <code>MongoDB<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f S.M.A.R.T \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445.<\/p>\n<h3>Telegram<\/h3>\n<p>  \u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Telegram API \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e npm-\u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.npmjs.com\/package\/node-telegram-bot-api\">node-telegram-bot-api<\/a>. \u0412 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>tg-smart<\/code> \u043e\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Telegram.<\/p>\n<h3>\u0421\u0435\u0442\u044c<\/h3>\n<p>  \u041a\u0430\u043a \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u044f\u0437\u0438. \u041e\u043d\u0438 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0442\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 Docker \u0438 \u0441\u0430\u043c\u043e\u0439 \u041e\u0421. \u0414\u043e\u0441\u0442\u0443\u043f \u0438\u0437\u0432\u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 iptables \u0438 ufw.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b iptables<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041d\u0430 <a href=\"https:\/\/github.com\/chaifeng\/ufw-docker\">Github<\/a> \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f UFW \u0438 Docker.<\/p>\n<p>  \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 iptables \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 Docker.<\/p>\n<pre><code class=\"plaintext\">>iptables -L Chain INPUT (policy ACCEPT) target     prot opt source               destination  Chain FORWARD (policy DROP) target     prot opt source               destination DOCKER-USER  all  --  anywhere             anywhere DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED DOCKER     all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED DOCKER     all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere ACCEPT     all  --  anywhere             anywhere  Chain OUTPUT (policy ACCEPT) target     prot opt source               destination  Chain DOCKER (2 references) target     prot opt source               destination ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:9443 ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:5002 ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:5001 ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:27017  Chain DOCKER-ISOLATION-STAGE-1 (1 references) target     prot opt source               destination DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere RETURN     all  --  anywhere             anywhere  Chain DOCKER-ISOLATION-STAGE-2 (2 references) target     prot opt source               destination DROP       all  --  anywhere             anywhere DROP       all  --  anywhere             anywhere RETURN     all  --  anywhere             anywhere  Chain DOCKER-USER (1 references) target     prot opt source               destination RETURN     all  --  anywhere             anywhere <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<pre><code class=\"plaintext\">>ip a 1: lo: &lt;LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000     link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1\/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1\/128 scope host         valid_lft forever preferred_lft forever 2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000     link\/ether fa:16:3e:a9:a5:8a brd ff:ff:ff:ff:ff:ff     altname enp0s3     altname ens3     inet 172.168.1.1\/24 brd 172.168.1.255 scope global eth0        valid_lft forever preferred_lft forever     inet6 fe80::f816:3eff:fea9:a58a\/64 scope link         valid_lft forever preferred_lft forever 3: docker0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default      link\/ether 02:42:06:d0:81:b1 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1\/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever     inet6 fe80::42:6ff:fed0:81b1\/64 scope link         valid_lft forever preferred_lft forever 4: br-6bf419f6296f: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default      link\/ether 02:42:e0:a6:17:ae brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1\/16 brd 172.18.255.255 scope global br-6bf419f6296f        valid_lft forever preferred_lft forever     inet6 fe80::42:e0ff:fea6:17ae\/64 scope link         valid_lft forever preferred_lft forever 5: br-7a47cf77f7b2: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default      link\/ether 02:42:b8:d1:fc:36 brd ff:ff:ff:ff:ff:ff     inet 172.18.0.1\/16 brd 172.19.255.255 scope global br-7a47cf77f7b2        valid_lft forever preferred_lft forever     inet6 fe80::42:b8ff:fed1:fc36\/64 scope link         valid_lft forever preferred_lft forever 25: veth011a094@if24: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-6bf419f6296f state UP group default      link\/ether ba:5e:30:fe:7e:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 2     inet6 fe80::b85e:30ff:fefe:7eb9\/64 scope link         valid_lft forever preferred_lft forever 27: veth664666f@if26: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-7a47cf77f7b2 state UP group default      link\/ether 92:81:05:84:5b:8e brd ff:ff:ff:ff:ff:ff link-netnsid 0     inet6 fe80::9081:5ff:fe84:5b8e\/64 scope link         valid_lft forever preferred_lft forever 29: veth373aaf8@if28: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-6bf419f6296f state UP group default      link\/ether ea:71:35:2a:9f:fb brd ff:ff:ff:ff:ff:ff link-netnsid 1     inet6 fe80::e871:35ff:fe2a:9ffb\/64 scope link         valid_lft forever preferred_lft forever <\/code><\/pre>\n<p>  \u0412 \u0444\u0430\u0439\u043b <code>\/etc\/ufw\/after.rules<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430.<\/p>\n<pre><code class=\"plaintext\">*filter :DOCKER-USER - [0:0] :ufw-user-input - [0:0]  -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A DOCKER-USER -m conntrack --ctstate INVALID -j DROP -A DOCKER-USER -i eth0 -j ufw-user-input -A DOCKER-USER -i eth0 -j DROP COMMIT <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043b\u0443\u0436\u0431\u044b <code>ufw<\/code>, \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0440\u0442\u043e\u0432 <code>22<\/code> \u0438 <code>9443<\/code> \u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <code>ufw<\/code>.<\/p>\n<pre><code class=\"plaintext\">> systemctl restart ufw > ufw allow 22 > ufw allow 9443 > ufw enable <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u043e\u0432.<\/p>\n<pre><code class=\"plaintext\">> nmap -p- 172.168.1.1 Nmap scan report for 172.168.1.1                                                                                        Host is up (0.030s latency).                                                                                            Not shown: 65533 filtered tcp ports (no-response)                                                                       PORT     STATE SERVICE                                                                                                  22\/tcp   open  ssh                                                                                                      9443\/tcp open  tungsten-https <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h3>\u0418\u043d\u0436\u0435\u043d\u0435\u0440<\/h3>\n<p>  \u0420\u043e\u043b\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<ul>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u041e\u0421 \u0447\u0435\u0440\u0435\u0437 SSH-\u043a\u043b\u044e\u0447;<\/li>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 Portainer. <\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/selectel.ru\/services\/cloud\/sharedline\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_tgbot_170823_banne_025_ordr\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/f1\/ue\/2l\/f1ue2l9jfmdsk_wexxo70-hhk9c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/f1\/ue\/2l\/f1ue2l9jfmdsk_wexxo70-hhk9c.png\"\/><\/div>\n<p><\/a><\/p>\n<p>  <a name=\"2\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/h2>\n<p><\/font><br \/>  \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b?<\/h3>\n<p>  <a href=\"https:\/\/koajs.com\/\">koa.js<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/axios\">axios<\/a>, <a href=\"https:\/\/lodash.com\/\">lodash<\/a>, <a href=\"https:\/\/momentjs.com\/\">moment<\/a>, <a href=\"https:\/\/mongoosejs.com\/\">mongoose<\/a>, <a href=\"https:\/\/nodemon.io\/\">nodemon<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/uuid\">uuid<\/a>, <a href=\"https:\/\/babeljs.io\/\">babel<\/a>, <a href=\"https:\/\/webpack.js.org\/\">webpack<\/a>, <a href=\"https:\/\/jwt.io\/\">jwt<\/a>, <a href=\"https:\/\/socket.io\/\">socket.io<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/node-telegram-bot-api\">node-telegram-bot-api<\/a><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/fj\/1t\/0l\/fj1t0l1m8y2qxjyjiokk-abczdc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/fj\/1t\/0l\/fj1t0l1m8y2qxjyjiokk-abczdc.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438.<\/p>\n<h4>webpack<\/h4>\n<p>  \u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/webpack\/api.config.js\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<h4>mongoose<\/h4>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c MongoDB.<\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043e \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/schemes\/\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a MongoDB \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/api\/connectors\/index.js\">mongoConnection<\/a>.<\/p>\n<h4>koa.js<\/h4>\n<p>  \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f Node.js, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u0430\u043a middleware. \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c, \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u043e\u0431\u044a\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<h5>socket.io<\/h5>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 WebSocket. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 <code>tg-smart<\/code> \u0438 <code>srv-smart<\/code>.<\/p>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/p>\n<pre><code class=\"plaintext\">. \u251c\u2500\u2500 .env \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u251c\u2500\u2500 .babelrc \/\/ \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b babel \u251c\u2500\u2500 api \u2502   \u251c\u2500\u2500 api.prod.js \/\/ build \u2502   \u251c\u2500\u2500 app.js \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 koa.js. \u2502   \u251c\u2500\u2500 server.js \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2502   \u251c\u2500\u2500 collection \/\/ \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c mongodb \u2502   \u251c\u2500\u2500 config \/\/ \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u2502   \u251c\u2500\u2500 connectors \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c \u2502   \u251c\u2500\u2500 constants \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u2502   \u251c\u2500\u2500 handlers \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u2502   \u251c\u2500\u2500 helpers \/\/ \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u2502   \u251c\u2500\u2500 services \/\/ \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2502   \u251c\u2500\u2500 socket \/\/ \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f socket.io \u2502   \u2514\u2500\u2500 utils \/\/  \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u251c\u2500\u2500 config \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u251c\u2500\u2500 package.json \/\/ \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u251c\u2500\u2500 schemes \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0445\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 MongoDB \u2514\u2500\u2500 webpack \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b webpack \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 workers-smart<\/h3>\n<p>  \u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u043e\u043f\u0443\u0449\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0435 workers-smart, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 Selectel. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 S.M.A.R.T \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 MongoDB. \u0414\u0435\u0442\u0430\u043b\u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 tg-smart<\/h3>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0432 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 tg-smart \u2014 \u044d\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 socket.io \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u043e\u0434\u0435 \u0444\u0430\u0439\u043b\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0412 \u043a\u043e\u0434\u0435 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/services\/jwt.js\">\u0444\u0430\u0439\u043b\u0430<\/a> \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JWT: \u043e\u0434\u0438\u043d \u2013 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u2013 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a <code>tg-smart<\/code> \u0447\u0435\u0440\u0435\u0437 socket.io. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u0434\u0435 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/services\/jwt.js\">\u0444\u0430\u0439\u043b\u0430<\/a> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 socket.io. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Telegram API <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/telegram\/index.js\">\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f<\/a> \u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/www.npmjs.com\/package\/node-telegram-bot-api\">node-telegram-bot-api<\/a>.<\/p>\n<p>  \u041f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>srv-smart<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/services\/jwt.js\">jwt.verify<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u043e\u043c\u043d\u0430\u0442\u0435 <code>\u201cservice\u201d<\/code> \u0432 socket.io \u0438 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/socket\/subscriptions\/index.js\">\u043e\u0436\u0438\u0434\u0430\u0435\u0442<\/a> \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 Telegram \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/telegram\/handlers\/message.js\">\u043a\u043e\u0434\u0430<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>\u201cmessage\u201d<\/code> \u043e\u0442 Telegram. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <code>srv-smart<\/code> \u0447\u0435\u0440\u0435\u0437 socket.io. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>\u201c\/start\u201d<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>\u201c\/start\u201d<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/tg-smart\/api\/telegram\/handlers\/start.js\">\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0435\u043d\u044e.  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 srv-smart <\/h3>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 S.M.A.R.T.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u043e\u0434\u0435 \u0444\u0430\u0439\u043b\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0412 \u043a\u043e\u0434\u0435 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/api\/socket\/bridge\/subscriptions\/index.js\">\u0444\u0430\u0439\u043b\u0430<\/a> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>\u201cmessage\u201d<\/code> \u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>tg-smart<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 S.M.A.R.T \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0434\u043d\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f, \u0430 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0438\u043c, \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 S.M.A.R.T \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/api\/socket\/bridge\/handlers\/checkSmart.js\">checkSmart<\/a>.<br \/>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/api\/socket\/bridge\/handlers\/checkSmart.js\">checkSmart<\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 S.M.A.R.T \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u0438\u0441\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/bitbucket.org\/khamchenko\/smart-slc\/src\/master\/srv-smart\/api\/socket\/bridge\/handlers\/sendMessage.js\">sendMessage<\/a> \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 <code>tg-smart<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0442 Telegram.  <\/div>\n<\/p><\/div>\n<p>  <a name=\"3\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><\/font><br \/>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u043e\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0438\u0441\u043a\u043e\u0432. \u041c\u043e\u0433\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u043e\u0442\u0432\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443. <\/p>\n<p>  \u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 S.M.A.R.T \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441. \u041d\u043e Selectel \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/722082\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0431\u043e\u0442 \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f IPMI. \u042d\u0442\u043e \u0434\u0430\u0441\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438.<\/p>\n<p>  <font color=\"#EB4247\"><\/p>\n<h2>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h2>\n<p><\/font><br \/>  \u00a0<a href=\"https:\/\/selectel.ru\/blog\/cloud-server\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_tgbot_170823_academy\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/2h\/0r\/sm\/2h0rsml8shcns8mw1p0qrgd6edy.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/2h\/0r\/sm\/2h0rsml8shcns8mw1p0qrgd6edy.png\"\/><\/a>\u00a0<a href=\"https:\/\/selectel.ru\/blog\/cloudops-admin\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_tgbot_170823_academy\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uk\/_h\/f2\/uk_hf2hse85wnobdtlv83eaegb8.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/uk\/_h\/f2\/uk_hf2hse85wnobdtlv83eaegb8.png\"\/><\/a>\u00a0<a href=\"https:\/\/selectel.ru\/blog\/cyberpunk-mods\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_tgbot_170823_academy\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/la\/5s\/as\/la5sashbqte4psg4lpnbuxuz3ws.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/la\/5s\/as\/la5sashbqte4psg4lpnbuxuz3ws.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/755076\/\"> https:\/\/habr.com\/ru\/articles\/755076\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/45\/f8\/x6\/45f8x6s1hrefp1poxf-oru_vo28.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/45\/f8\/x6\/45f8x6s1hrefp1poxf-oru_vo28.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439, \u044f \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 Selectel, \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 <a href=\"https:\/\/selectel.ru\/services\/dedicated\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_tgbot_170823_content\">\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438<\/a> \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/722082\/\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 API Telegram, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c S.M.A.R.T \u0434\u0438\u0441\u043a\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u043e\u043f\u044b\u0442\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0412 \u0441\u0435\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u043d\u043e \u043c\u0430\u043b\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u044f \u0438\u0437\u0443\u0447\u0430\u044e \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438 \u00ab\u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0442\u044b\u043a\u0430\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438 \u0443\u043c\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0441\u0435\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u00ab\u043c\u0435\u0442\u043e\u0434\u0430 \u0442\u044b\u043a\u0430\u00bb \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-352377","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=352377"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352377\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=352377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=352377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=352377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}