{"id":64988,"date":"2024-06-03T19:19:08","date_gmt":"2024-06-03T15:49:08","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/"},"modified":"2024-06-03T19:19:08","modified_gmt":"2024-06-03T15:49:08","slug":"%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/","title":{"rendered":"\u0633\u0631\u0648\u0631 Deloy SocketIO \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker \u0648 Nginx Load Balancer (+SSL)"},"content":{"rendered":"<p><\/p>\n<div data-article-id=\"1875557\" id=\"article-body\">\n<p>\u062f\u0631 \u0622\u062e\u0631\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u0645\u060c \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0633\u0648\u06a9\u062a\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0645 \u06a9\u0647 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0628\u06cc\u0634 \u0627\u0632 10 \u0647\u0632\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.  \u0647\u0645\u0686\u0646\u06cc\u0646 \u0644\u0627\u0632\u0645 \u0628\u0648\u062f \u062f\u0631 \u0635\u0648\u0631\u062a \u0627\u0645\u06a9\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0645\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u0645.  \u067e\u0633 \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc \u0628\u0631\u062e\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u060c \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0633\u0631\u0648\u0631 \u0633\u0648\u06a9\u062a \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker \u0648 Nginx \u062f\u0631 \u06cc\u06a9 \u0633\u0631\u0648\u0631 \u062e\u0635\u0648\u0635\u06cc \u0645\u062c\u0627\u0632\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0645.<\/p>\n<p>\u0627\u06cc\u0646\u0645 \u0645\u0631\u0627\u062d\u0644\u06cc \u06a9\u0647 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u0645:<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >\u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#indexjs\" >index.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Nginx\" >\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#Dockerfile\" >Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#Docker_Compose\" >Docker Compose<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%b1%d9%88%d8%b1-deloy-socketio-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-docker-%d9%88-nginx-load-balancer-ssl\/#%D9%85%D8%A7%D8%B4%DB%8C%D9%86_%D9%85%DB%8C%D8%B2%D8%A8%D8%A7%D9%86_Nginx_Letsencrypt\" >\u0645\u0627\u0634\u06cc\u0646 \u0645\u06cc\u0632\u0628\u0627\u0646 Nginx + Letsencrypt<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u067e\u0631\u0648\u0698\u0647 \u0633\u0631\u0648\u0631 \u0633\u0648\u06a9\u062a \u0631\u0627 \u0633\u0627\u0632\u0645\u0627\u0646\u062f\u0647\u06cc \u0645\u06cc \u06a9\u0646\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/socket-server\n|-- src\/\n    |-- index.js\n    |-- loggers\/\n|-- .env\n|-- .env_one\n|-- .env_two\n|-- .env_three\n|-- .env_four\n|-- Dockerfile\n|-- docker-compose.yaml\n|-- nginx.conf\n|-- package.json\n|-- yarn.lock\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"indexjs\"><\/span>\n<p>  index.js<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createServer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">http<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Redis<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ioredis<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Server<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">socket.io<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createAdapter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@socket.io\/redis-adapter<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">logger<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/logger\/winston_logger.js<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">bodyParser<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">body-parser<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">express<\/span><span class=\"p\">();<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">http<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createServer<\/span><span class=\"p\">(<\/span><span class=\"nx\">app<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">port<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">;<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">serverName<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">SERVER_NAME<\/span><span class=\"p\">;<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">redisHost<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">REDIS_HOST<\/span><span class=\"p\">;<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">redisPort<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">REDIS_PORT<\/span><span class=\"p\">;<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">socketKey<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">SECRET_KEY<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">let<\/span> <span class=\"nx\">numConnectedSockets<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">pubClient<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Redis<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">host<\/span><span class=\"p\">:<\/span> <span class=\"nx\">redisHost<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">port<\/span><span class=\"p\">:<\/span> <span class=\"nx\">redisPort<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">keyPrefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">myapp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">});<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">subClient<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">pubClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">duplicate<\/span><span class=\"p\">();<\/span>\n\n<span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span>\n  <span class=\"s2\">`Redis client connected to <\/span><span class=\"p\">${<\/span><span class=\"nx\">redisHost<\/span><span class=\"p\">}<\/span><span class=\"s2\">:<\/span><span class=\"p\">${<\/span><span class=\"nx\">redisPort<\/span><span class=\"p\">}<\/span><span class=\"s2\"> with status: pub: <\/span><span class=\"p\">${<\/span><span class=\"nx\">pubClient<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">}<\/span><span class=\"s2\"> sub: <\/span><span class=\"p\">${<\/span><span class=\"nx\">subClient<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ listen to redis connection status<\/span>\n<span class=\"nx\">pubClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">connect<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Redis pub client connected!<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"nx\">subClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">connect<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Redis sub client connected!<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ create socket io server with adapter<\/span>\n<span class=\"c1\">\/\/ add your other services here<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">io<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Server<\/span><span class=\"p\">(<\/span><span class=\"nx\">http<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">cors<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">origin<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:3000<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:8020<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"na\">methods<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">GET<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">adapter<\/span><span class=\"p\">:<\/span> <span class=\"nf\">createAdapter<\/span><span class=\"p\">(<\/span><span class=\"nx\">pubClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">subClient<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ express listen to port<\/span>\n<span class=\"nx\">http<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/span><span class=\"p\">(<\/span><span class=\"nx\">port<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Server <\/span><span class=\"p\">${<\/span><span class=\"nx\">serverName<\/span><span class=\"p\">}<\/span><span class=\"s2\"> is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">port<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ socket io connection<\/span>\n<span class=\"nx\">io<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">connection<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">socket<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`User connected: <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> to socket server <\/span><span class=\"p\">${<\/span><span class=\"nx\">serverName<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">emit<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">hi<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">serverName<\/span><span class=\"p\">:<\/span> <span class=\"nx\">serverName<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">msg<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`Hello from socket server <\/span><span class=\"p\">${<\/span><span class=\"nx\">serverName<\/span><span class=\"p\">}<\/span><span class=\"s2\">!`<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"c1\">\/\/ socket io events<\/span>\n  <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">disconnect<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">numConnectedSockets<\/span><span class=\"o\">--<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`User disconnected: <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> from <\/span><span class=\"p\">${<\/span><span class=\"nx\">serverName<\/span><span class=\"p\">}<\/span><span class=\"s2\">!`<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">hello<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">msg<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Receive a hello from <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> with <\/span><span class=\"p\">${<\/span><span class=\"nx\">msg<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`server socket key is <\/span><span class=\"p\">${<\/span><span class=\"nx\">socketKey<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`test socket key vs msg is <\/span><span class=\"p\">${<\/span><span class=\"nx\">socketKey<\/span><span class=\"p\">}<\/span><span class=\"s2\"> vs <\/span><span class=\"p\">${<\/span><span class=\"nx\">msg<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">msg<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">msg<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">socketKey<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> sent the correct key. Welcome!`<\/span><span class=\"p\">);<\/span>\n        <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">emit<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">introduce_yourself<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">serverName<\/span><span class=\"p\">:<\/span> <span class=\"nx\">serverName<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">msg<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`Please introduce yourself!`<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">introduction<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">msg<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Receive a introduction from <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">msg<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">token<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">msg<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">name<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">token<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span>\n          <span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> did not introduce themselves correctly!. Disconnecting...`<\/span>\n        <span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ disconnect user<\/span>\n        <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> introduced as <\/span><span class=\"p\">${<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span><span class=\"s2\"> with token <\/span><span class=\"p\">${<\/span><span class=\"nx\">token<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span>\n      <span class=\"p\">);<\/span>\n\n      <span class=\"c1\">\/\/ validate name and token<\/span>\n      <span class=\"kd\">let<\/span> <span class=\"nx\">isAuthorized<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">name<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">admin<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">token<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">admin<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">isAuthorized<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> is an admin!`<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">token<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">socketKey<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> is an authenticated user!`<\/span><span class=\"p\">);<\/span>\n        <span class=\"nx\">isAuthorized<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">isAuthorized<\/span> <span class=\"o\">===<\/span> <span class=\"kc\">false<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span>\n          <span class=\"s2\">`User <\/span><span class=\"p\">${<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span><span class=\"s2\"> with socket id <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> is not authorized. Disconnecting...`<\/span>\n        <span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ disconnect user<\/span>\n        <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"nx\">numConnectedSockets<\/span><span class=\"o\">++<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">`Can not get the message from <\/span><span class=\"p\">${<\/span><span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\"> while introduction. Disconnecting...`<\/span>\n      <span class=\"p\">);<\/span>\n\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">({<\/span>\n        <span class=\"nx\">msg<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">});<\/span>\n\n      <span class=\"c1\">\/\/ disconnect user<\/span>\n      <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">log_event<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">socket<\/span><span class=\"p\">.<\/span><span class=\"nx\">broadcast<\/span><span class=\"p\">.<\/span><span class=\"nf\">emit<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">broadcast_log_event<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">serverName<\/span><span class=\"p\">:<\/span> <span class=\"nx\">serverName<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">msg<\/span><span class=\"p\">:<\/span> <span class=\"nx\">data<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ error handling<\/span>\n<span class=\"nx\">io<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Error: <\/span><span class=\"p\">${<\/span><span class=\"nx\">error<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">bodyParser<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">());<\/span>\n\n<span class=\"c1\">\/\/ express default route<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/heartbeat<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">sendStatus<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ base url<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">_<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">winstonLogger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`base endpoint called`<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">).<\/span><span class=\"nf\">json<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">msg<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Base endpoint works<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">).<\/span><span class=\"nf\">json<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`Welcome to socket server <\/span><span class=\"p\">${<\/span><span class=\"nx\">serverName<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">socketConnected<\/span><span class=\"p\">:<\/span> <span class=\"nx\">numConnectedSockets<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u06cc\u062f\u060c \u0645\u0627 \u0627\u0632 \u0622\u062f\u0627\u067e\u062a\u0648\u0631 Redis \u0628\u0631\u0627\u06cc \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0633\u0648\u06a9\u062a \u062f\u0631 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u0648 \u0622\u06cc\u0646\u062f\u0647 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u0634\u0648\u0646\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0628\u0631\u0627\u06cc \u0622\u062f\u0627\u067e\u062a\u0648\u0631 Redis \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0627\u0633\u0646\u0627\u062f \u0631\u0633\u0645\u06cc \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u0648\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Nginx\"><\/span>\n<p>  \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc nginx \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u0633\u062a<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># Reference: https:\/\/www.nginx.com\/resources\/wiki\/start\/topics\/examples\/full\/\n\nworker_processes 4;\n\nevents {\n  worker_connections 1024;\n}\n\nhttp {\n  server {\n    listen 80;\n\n    location \/ {\n      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n      proxy_set_header Host $host;\n\n      proxy_pass http:\/\/nodes;\n\n      # enable WebSockets\n      proxy_http_version 1.1;\n      proxy_set_header Upgrade $http_upgrade;\n      proxy_set_header Connection \"upgrade\";\n    }\n  }\n\n  upstream nodes {\n    # enable sticky session with either \"hash\" (uses the complete IP address)\n    hash $remote_addr consistent;\n    # or \"ip_hash\" (uses the first three octets of the client IPv4 address, or the entire IPv6 address)\n    # ip_hash;\n    # or \"sticky\" (needs commercial subscription)\n    # sticky cookie srv_id expires=1h domain=.example.com path=\/;\n\n    server server-one:3000;\n    server server-two:3000;\n    server server-three:3000;\n    server server-four:3000;\n  }\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Dockerfile\"><\/span>\n<p>  Dockerfile<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"c1\"># Use the official Node.js 21 image as the base image<\/span>\n<span class=\"s\">FROM node:21-alpine<\/span>\n\n<span class=\"c1\"># Set the working directory inside the container<\/span>\n<span class=\"s\">WORKDIR \/app<\/span>\n\n<span class=\"c1\"># Copy package.json and package-lock.json to the working directory<\/span>\n<span class=\"s\">COPY package*.json .\/<\/span>\n\n<span class=\"c1\"># Install the app dependencies<\/span>\n<span class=\"s\">RUN yarn install --production=true<\/span>\n\n<span class=\"c1\"># Copy the rest of the app source code to the working directory<\/span>\n<span class=\"s\">COPY . .<\/span>\n\n<span class=\"c1\"># Set the non-root user to run the application<\/span>\n<span class=\"s\">USER node<\/span>\n\n<span class=\"c1\"># Expose the port on which the app will run<\/span>\n<span class=\"s\">EXPOSE <\/span><span class=\"m\">3000<\/span>\n\n<span class=\"c1\"># Start the application<\/span>\n<span class=\"s\">CMD node --env-file=.env src\/index.js<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Docker_Compose\"><\/span>\n<p>  Docker Compose<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx:alpine<\/span>\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/nginx.conf:\/etc\/nginx\/nginx.conf:ro<\/span>\n    <span class=\"na\">links<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">server-one<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">server-two<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">server-three<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">server-four<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3002:80\"<\/span>\n\n  <span class=\"na\">server-one<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3000\"<\/span>\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env_one<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n\n  <span class=\"na\">server-two<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3000\"<\/span>\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env_two<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n\n  <span class=\"na\">server-three<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3000\"<\/span>\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env_three<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n\n  <span class=\"na\">server-four<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3000\"<\/span>\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env_four<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062e\u0648\u0628 \u0627\u0633\u062a\u060c \u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0633\u0631\u0648\u0631 \u06a9\u0646\u06cc\u0645 <code>docker compose<\/code> \u0633\u0627\u062e\u062a \u0648 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0628\u0627 \u062f\u0633\u062a\u0648\u0631 <code>docker compose up -d<\/code> .<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%A7%D8%B4%DB%8C%D9%86_%D9%85%DB%8C%D8%B2%D8%A8%D8%A7%D9%86_Nginx_Letsencrypt\"><\/span>\n<p>  \u0645\u0627\u0634\u06cc\u0646 \u0645\u06cc\u0632\u0628\u0627\u0646 Nginx + Letsencrypt<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u0627\u0632 <code>wss:\/\/mydomain<\/code> \u0628\u0631\u0627\u06cc URL \u0633\u0648\u06a9\u062a \u0648\u0642\u062a\u06cc \u0645\u0634\u062a\u0631\u06cc \u0633\u0648\u06a9\u062a \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u062a\u0635\u0644 \u0634\u0648\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 SSL \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Letsencrypt \u062f\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u06cc\u0632\u0628\u0627\u0646 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u0645.  \u062f\u0631 \u06cc\u06a9 \u067e\u0633\u062a \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u062e\u0648\u0627\u0647\u0645 \u0646\u0648\u0634\u062a.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a SSL\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0631\u0627 \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc nginx \u062f\u0631 \u062f\u0627\u062e\u0644 <code>server {<\/code> \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646.  \u0645\u0639\u0645\u0648\u0644\u0627 \u062f\u0631 <code>\/etc\/nginx\/sites-available\/default<\/code> \u0641\u0627\u06cc\u0644.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>location \/socket.io\/ {\n   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n   proxy_set_header Host $host;\n\n   # the port of the nginx in docker compose\n   proxy_pass http:\/\/localhost:3002;\n\n   # enable WebSockets\n   proxy_http_version 1.1;\n   proxy_set_header Upgrade $http_upgrade;\n   proxy_set_header Connection \"upgrade\";\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0645\u0627\u0645 \u0627\u0633\u062a\u060c \u0633\u067e\u0633 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0633\u0648\u06a9\u062a \u0634\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0645\u062a\u0635\u0644 \u0634\u0648\u062f <code>wss:\/\/mydomain<\/code> \u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 \u0633\u0648\u06a9\u062a.<\/p>\n<p>\u0627\u06af\u0631 \u0627\u0632 \u0641\u0644\u0627\u062a\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f.  \u06cc\u06a9 \u0627\u0641\u0632\u0648\u0646\u0647 \u0645\u0634\u062a\u0631\u06cc \u0633\u0648\u06a9\u062a io \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.  \u0627\u06cc\u0646\u062c\u0627 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646.  \u062f\u0631 \u0632\u06cc\u0631 \u06a9\u062f \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0633\u0648\u06a9\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SSL \u0641\u0639\u0627\u0644 \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kn\">import<\/span> <span class=\"s\">'package:socket_io_client\/socket_io_client.dart'<\/span> <span class=\"k\">as<\/span> <span class=\"n\">io<\/span><span class=\"o\">;<\/span>\n\n<span class=\"c1\">\/\/ create a new socket instance<\/span>\n<span class=\"n\">socket<\/span> <span class=\"o\">=<\/span> <span class=\"n\">io<\/span><span class=\"o\">.<\/span><span class=\"na\">io<\/span><span class=\"p\">(<\/span><span class=\"n\">socketServer<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"s\">'transports'<\/span><span class=\"o\">:<\/span> <span class=\"p\">[<\/span><span class=\"s\">'websocket'<\/span><span class=\"p\">],<\/span>\n  <span class=\"s\">'secure'<\/span><span class=\"o\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"n\">ocket<\/span><span class=\"o\">.<\/span><span class=\"na\">onConnect<\/span><span class=\"p\">((<\/span><span class=\"n\">_<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">debugPrint<\/span><span class=\"p\">(<\/span><span class=\"s\">'get connected to the server <\/span><span class=\"si\">$socketServer<\/span><span class=\"s\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"n\">socket<\/span><span class=\"o\">.<\/span><span class=\"na\">onError<\/span><span class=\"p\">((<\/span><span class=\"n\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">debugPrint<\/span><span class=\"p\">(<\/span><span class=\"s\">'error: <\/span><span class=\"si\">$error<\/span><span class=\"s\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"n\">socket<\/span><span class=\"o\">.<\/span><span class=\"na\">onDisconnect<\/span><span class=\"p\">((<\/span><span class=\"n\">_<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">debugPrint<\/span><span class=\"p\">(<\/span><span class=\"s\">'disconnected from <\/span><span class=\"si\">$socketServer<\/span><span class=\"s\">'<\/span><span class=\"p\">));<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f.  \u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u0622\u062e\u0631\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u0645\u060c \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0633\u0648\u06a9\u062a\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0645 \u06a9\u0647 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0628\u06cc\u0634 \u0627\u0632 10 \u0647\u0632\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0644\u0627\u0632\u0645 \u0628\u0648\u062f \u062f\u0631 \u0635\u0648\u0631\u062a \u0627\u0645\u06a9\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0645\u0646 \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u0645. \u067e\u0633 \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc \u0628\u0631\u062e\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u060c \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0633\u0631\u0648\u0631 \u0633\u0648\u06a9\u062a \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker &hellip;<\/p>\n","protected":false},"author":2,"featured_media":64989,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media.dev.to\/cdn-cgi\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ocbu4jlhmpdwuhgp3y7.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-64988","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/64988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=64988"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/64988\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/64989"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=64988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=64988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=64988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}