{"id":346891,"date":"2023-03-17T09:02:04","date_gmt":"2023-03-17T09:02:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=346891"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=346891","title":{"rendered":"<span>Node.JS: \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044c SSH2 \u043d\u0430 OpenSSH \u0438 \u0441\u043d\u0438\u0437\u0438\u043b\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 eventloop \u0432 15 \u0440\u0430\u0437<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 SSH ?<\/h3>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c shell \u0438 sql \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0441\u00a0PostgreSQL, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430, \u0441\u043d\u044f\u0442\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043f\u043e\u0438\u0441\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u041a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 SSH, \u0430\u00a0\u0441\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c PostgreSQL \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u00a0\u2014 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c, \u0430\u00a0\u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u043e\u0440\u0442\u044b \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 pg_hba.conf, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0432 \u0432\u00a0\u043d\u0438\u0445 IP\u2011\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0434\u0430\u00a0\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u00a0\u0441\u0435\u0442\u0438 \u0432\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u043e, \u0430\u00a0\u0434\u043b\u044f <a href=\"https:\/\/www.postgresql.org\/docs\/current\/ssl-tcp.html\">SSL<\/a> \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 SSH, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c SSH2<\/h3>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/548\/709\/529\/5487095298488a25422e7f09737a8690.png\" alt=\"\u0412\u0435\u0441\u044c ssh-\u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c ssh2\" title=\"\u0412\u0435\u0441\u044c ssh-\u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c ssh2\" width=\"432\" height=\"172\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/548\/709\/529\/5487095298488a25422e7f09737a8690.png\"\/><\/p>\n<div><figcaption>\u0412\u0435\u0441\u044c ssh-\u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c ssh2<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/516384\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/517358\/\">\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438<\/a>.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/github.com\/mscdex\/ssh2\">ssh2<\/a> \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Javascript, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0432 event loop \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 GC \u0438 thread pool.<\/p>\n<p>\u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 event loop \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u043b\u0438 \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/18f\/6f8\/0eb\/18f6f80eb84e16ba6e2c2723b859821b.png\" alt=\"\u041f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\" title=\"\u041f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\" width=\"611\" height=\"343\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/18f\/6f8\/0eb\/18f6f80eb84e16ba6e2c2723b859821b.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0435 ssh-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044f ssh2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 ssh-\u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/www.openssh.com\/\">OpenSSH<\/a>. <\/p>\n<h3>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 OpenSSH<\/h3>\n<p>\u042d\u0442\u043e\u0442 <a href=\"https:\/\/man.openbsd.org\/ssh.1\">ssh-\u043a\u043b\u0438\u0435\u043d\u0442<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c master-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442-\u0444\u0430\u0439\u043b <em>\/tmp\/ssh.sock<\/em> \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 slave-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438:<\/p>\n<p><code>ssh -M -S \/tmp\/ssh.sock -i id_rsa -l username pg_hostname<\/code><\/p>\n<p>\u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 slave, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<p><code>ssh -S \/tmp\/ssh.sock pg_hostname command<\/code><\/p>\n<p>\u0438\u043b\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u043e\u043d\u043d\u0435\u043b\u044f \u0438 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442:<\/p>\n<p><code>ssh -S \/tmp\/ssh.sock -O forward -L \/tmp\/postgresql.sock:127.0.0.1:5432 pg_hostname<\/code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 ssh \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/nodejs.org\/api\/child_process.html#child_processspawncommand-args-options\">child_process.spawn<\/a> , \u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0435\u0433\u043e stdout \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/nodejs.org\/api\/child_process.html#subprocessstdout\">stream.Readable<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/github.com\/MGorkov\/system-ssh\">system\u2011ssh<\/a> \u0441\u00a0\u0442\u0430\u043a\u0438\u043c\u0438\u00a0\u0436\u0435 \u043a\u0430\u043a\u00a0\u0443\u00a0ssh2\u00a0\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438\u00a0\u2014 connect, end, exec, forwardOut \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e forwardOutLocalSocket, \u0438 <a href=\"https:\/\/www.npmjs.com\/package\/system-ssh\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438<\/a> \u0435\u0433\u043e \u0432\u00a0npm \u0440\u0435\u0435\u0441\u0442\u0440\u0435.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043d\u043e\u0432\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf0\/625\/2f3\/cf06252f31ecc05f1bced5aea0933553.png\" alt=\"\u0412\u044b\u043d\u0435\u0441\u043b\u0438 ssh \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" title=\"\u0412\u044b\u043d\u0435\u0441\u043b\u0438 ssh \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" width=\"621\" height=\"227\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cf0\/625\/2f3\/cf06252f31ecc05f1bced5aea0933553.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u043d\u0435\u0441\u043b\u0438 ssh \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044e ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d.<\/p>\n<p>\u041d\u043e\u00a0\u0443 \u043d\u0430\u0441 \u0432\u00a0\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u043e\u043a\u043e\u043b\u043e 2000\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 PostgreSQL \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0433\u0440\u0443\u0437\u043a\u0438 event loop \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u00a0\u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441\u00a0\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0430\u00a0system\u2011ssh \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 1.25\u00a0Mbps, \u0430\u00a0\u0434\u043b\u044f\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u0441\u0442\u0430\u0440\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c inproc\u00a0\u2014 0.75\u00a0Mpbs. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c3\/f2b\/222\/1c3f2b22275a7a89f8fca0636900a1c5.png\" alt=\"\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c ssh-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c\" title=\"\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c ssh-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c\" width=\"596\" height=\"451\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c3\/f2b\/222\/1c3f2b22275a7a89f8fca0636900a1c5.png\"\/><\/p>\n<div><figcaption>\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c ssh-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 spawn \u0432 Node.JS \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/nodejs.org\/api\/child_process.html#optionsstdio:~:text=On%20Unix%2Dlike,issue%207381.\">\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438<\/a> \u0438\u0437-\u0437\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 heap, \u043f\u0440\u0438\u0447\u0435\u043c \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u0442\u0435\u043c \u043e\u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435:<\/p>\n<p><em>On Unix-like operating systems, the\u00a0<\/em><code>child_process.spawn()<\/code><em>\u00a0method performs memory operations synchronously before decoupling the event loop from the child. Applications with a large memory footprint may find frequent\u00a0<\/em><code>child_process.spawn()<\/code><em>\u00a0calls to be a bottleneck. For more information, see\u00a0<\/em><a href=\"https:\/\/bugs.chromium.org\/p\/v8\/issues\/detail?id=7381\"><em>V8 issue 7381<\/em><\/a><em>. <\/em><\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0440\u043a\u0435\u0440-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u044d\u0448\u0438 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a spawn \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435.<\/p>\n<h3>SSH-\u043f\u0440\u043e\u043a\u0441\u0438<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 ssh \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u043f\u043b\u044e\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 PostgreSQL \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd3\/187\/4c4\/cd31874c4b67f93ce73f2e858d5556b5.png\" alt=\"\u0412\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a ssh \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 net.Socket\" title=\"\u0412\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a ssh \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 net.Socket\" width=\"718\" height=\"289\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cd3\/187\/4c4\/cd31874c4b67f93ce73f2e858d5556b5.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a ssh \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 net.Socket<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 stdout \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D0%BA%D0%B5%D1%82_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0_Unix\">Unix domain socket<\/a>, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 socket<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ sshproxy const { Client } = require('system-ssh'); const sshConnection = new Client(); const socketPath = '\/tmp\/host_1\/stream_1.sock';  sshConnection.exec('tail -F postgresql.log', (error, stream) => {     const server = net.createServer({noDelay: true}, (socket) => {         stream.pipe(socket).pipe(stream);     })     server.on('error', (err) => {         if (err.code === 'EADDRINUSE') {             \/\/ \u0441\u043e\u043a\u0435\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443             const clientSocket = new net.Socket();             clientSocket.on('error', (clientError) => {                 if (clientError.code === 'ECONNREFUSED') {                     \/\/ \u0441\u043e\u043a\u0435\u0442 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430                     fs.unlinkSync(socketPath);                     server.listen(socketPath);                 }             });             clientSocket.connect({path: socketPath}, () => {                 \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c, \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043e\u043a\u0435\u0442                 clientSocket.destroy();                 server.close();             });         }     })     server.on('listening', () => {         \/\/ \u0441\u043e\u043a\u0435\u0442 \u0433\u043e\u0442\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043e\u0440\u043a\u0435\u0440\u0430     })     server.listen(socketPath); })  \/\/ worker const clientSocket = new net.Socket(); clientSocket.connect({path: socketPath}, () => {     \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043a \u0441\u043e\u043a\u0435\u0442\u0443     clientSocket.on('data', (data) => {         \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435         \/\/ \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e clientSocket.pipe(dataHandler)     }) })<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043d\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0435.<\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 net.Socket \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB\">named pipe<\/a> (<a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/fifo.7.html\">FIFO<\/a>):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/32a\/5b3\/4e4\/32a5b34e4317a01f4a2b7c54a8efc621.png\" alt=\"\u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 net.Socket \u043d\u0430 FIFO\" title=\"\u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 net.Socket \u043d\u0430 FIFO\" width=\"718\" height=\"289\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/32a\/5b3\/4e4\/32a5b34e4317a01f4a2b7c54a8efc621.png\"\/><\/p>\n<div><figcaption>\u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 net.Socket \u043d\u0430 FIFO<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f FIFO \u043f\u0440\u043e\u0449\u0435, \u0432 sshproxy \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/nodejs.org\/api\/fs.html#class-fswritestream\">\u043f\u0438\u0448\u0443\u0449\u0438\u0439<\/a> \u043f\u043e\u0442\u043e\u043a, \u0430 \u0432 \u0432\u043e\u0440\u043a\u0435\u0440\u0435 &#8212; <a href=\"https:\/\/nodejs.org\/api\/fs.html#class-fsreadstream\">\u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439<\/a><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f FIFO<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ sshproxy const { exec } = require('child_process'); const fs = require('fs'); const { Client } = require('system-ssh'); const sshConnection = new Client();  const fifo = '\/tmp\/host_1\/stream_1.fifo' const cmdFifo = exec(`test -p ${fifo} || mkfifo ${fifo}`, (error, stdout, stderr) => {     fs.open(fifo, 'w', (error, fd) => {         sshConnection.exec('tail -F postgresql.log', {stdio: ['pipe', fd, 'pipe']}, (error, stream) => {             const fifoStream = fs.createWriteStream(fifo, {fd});             stream.pipe(fifoStream);         })     }) })  \/\/ worker let stream = fs.createReadStream(fifo); stream.on('data', (data) => {     \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     \/\/ \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e stream.pipe(dataHandler) })<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0445 \u0432 15 \u0440\u0430\u0437:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/86b\/540\/5ab\/86b5405abde918232e6adb19f55a0805.png\" alt=\"\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u043d\u0438\u0437\u0438\u043b\u0438\u0441\u044c\" title=\"\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u043d\u0438\u0437\u0438\u043b\u0438\u0441\u044c\" width=\"611\" height=\"358\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/86b\/540\/5ab\/86b5405abde918232e6adb19f55a0805.png\"\/><\/p>\n<div><figcaption>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u043d\u0438\u0437\u0438\u043b\u0438\u0441\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0438 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 &#8212; \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fb\/768\/268\/8fb7682681d5f43106d17adc01a3ed1c.png\" alt=\"\u041e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414\" title=\"\u041e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414\" width=\"548\" height=\"223\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fb\/768\/268\/8fb7682681d5f43106d17adc01a3ed1c.png\"\/><\/p>\n<div><figcaption>\u041e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414<\/figcaption><\/div>\n<\/figure>\n<h3>UV_THREADPOOL<\/h3>\n<p>\u0411\u0435\u0437\u00a0\u043b\u043e\u0436\u043a\u0438 \u0434\u0435\u0433\u0442\u044f \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u00a0\u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c, \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0FIFO \u043d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0Node.JS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 <a href=\"https:\/\/nodejs.org\/api\/cli.html#uv_threadpool_sizesize\">uv_threadpool<\/a> , \u0430\u00a0\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0438 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u0435\u043d 4. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 4\u00a0\u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u00a0\u044d\u0442\u043e\u043c \u043f\u0443\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043d\u044f\u0442\u044b, \u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u00a0\u044d\u0442\u043e\u043c\u00a0\u0436\u0435 \u043f\u0443\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 dns.lookup() \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 crypto API, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u00a0\u043d\u0430\u0441 \u0432\u00a0\u0432\u043e\u0440\u043a\u0435\u0440\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e (\u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u00a0\u0441\u0442\u0430\u0440\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0441\u00a0\u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2), \u043f\u0440\u0438\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 FIFO \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0442\u043e, \u0447\u0442\u043e\u00a0\u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 FIFO \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 fs.open(fifo) \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a uv_threadpool \u0434\u043e\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 FIFO \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b\u0445\u043e\u0434\u043e\u043c, \u043a\u0430\u043a\u00a0\u043f\u0438\u0448\u0443\u0442 <a href=\"https:\/\/github.com\/nodejs\/node\/issues\/23220#issuecomment-426345872\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043c\u043e\u0433\u043b\u043e\u00a0\u0431\u044b\u00a0\u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430, \u043d\u043e\u00a0\u043c\u043e\u0434\u0443\u043b\u044c fs \u0432\u00a0Node.JS \u0442\u0430\u043a \u043d\u0435\u00a0\u0443\u043c\u0435\u0435\u0442, \u0430\u00a0\u0442\u043e\u0442 \u0447\u0442\u043e\u00a0\u0443\u043c\u0435\u0435\u0442\u00a0\u2014 net.Socket \u043d\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c\u00a0\u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u0438\u043d sshproxy \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e 20\u201330\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 PostgreSQL \u0438 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/p>\n<\/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\/company\/tensor\/blog\/722616\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/722616\/<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 SSH ?<\/h3>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c shell \u0438 sql \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0441\u00a0PostgreSQL, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430, \u0441\u043d\u044f\u0442\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043f\u043e\u0438\u0441\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u041a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 SSH, \u0430\u00a0\u0441\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c PostgreSQL \u043d\u0435\u00a0\u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u00a0\u2014 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c, \u0430\u00a0\u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u043e\u0440\u0442\u044b \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 pg_hba.conf, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0432 \u0432\u00a0\u043d\u0438\u0445 IP\u2011\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0434\u0430\u00a0\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u00a0\u0441\u0435\u0442\u0438 \u0432\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u043e, \u0430\u00a0\u0434\u043b\u044f <a href=\"https:\/\/www.postgresql.org\/docs\/current\/ssl-tcp.html\">SSL<\/a> \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 SSH, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c SSH2<\/h3>\n<figure class=\"\">\n<div><figcaption>\u0412\u0435\u0441\u044c ssh-\u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c ssh2<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/516384\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/517358\/\">\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438<\/a>.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/github.com\/mscdex\/ssh2\">ssh2<\/a> \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Javascript, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0432 event loop \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 GC \u0438 thread pool.<\/p>\n<p>\u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 event loop \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u043b\u0438 \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0435 ssh-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044f ssh2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 ssh-\u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/www.openssh.com\/\">OpenSSH<\/a>. <\/p>\n<h3>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 OpenSSH<\/h3>\n<p>\u042d\u0442\u043e\u0442 <a href=\"https:\/\/man.openbsd.org\/ssh.1\">ssh-\u043a\u043b\u0438\u0435\u043d\u0442<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c master-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442-\u0444\u0430\u0439\u043b <em>\/tmp\/ssh.sock<\/em> \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 slave-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438:<\/p>\n<p><code>ssh -M -S \/tmp\/ssh.sock -i id_rsa -l username pg_hostname<\/code><\/p>\n<p>\u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 slave, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<p><code>ssh -S \/tmp\/ssh.sock pg_hostname command<\/code><\/p>\n<p>\u0438\u043b\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u043e\u043d\u043d\u0435\u043b\u044f \u0438 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442:<\/p>\n<p><code>ssh -S \/tmp\/ssh.sock -O forward -L \/tmp\/postgresql.sock:127.0.0.1:5432 pg_hostname<\/code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 ssh \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/nodejs.org\/api\/child_process.html#child_processspawncommand-args-options\">child_process.spawn<\/a> , \u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0435\u0433\u043e stdout \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/nodejs.org\/api\/child_process.html#subprocessstdout\">stream.Readable<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/github.com\/MGorkov\/system-ssh\">system\u2011ssh<\/a> \u0441\u00a0\u0442\u0430\u043a\u0438\u043c\u0438\u00a0\u0436\u0435 \u043a\u0430\u043a\u00a0\u0443\u00a0ssh2\u00a0\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438\u00a0\u2014 connect, end, exec, forwardOut \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e forwardOutLocalSocket, \u0438 <a href=\"https:\/\/www.npmjs.com\/package\/system-ssh\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438<\/a> \u0435\u0433\u043e \u0432\u00a0npm \u0440\u0435\u0435\u0441\u0442\u0440\u0435.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043d\u043e\u0432\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u044b\u043d\u0435\u0441\u043b\u0438 ssh \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044e ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d.<\/p>\n<p>\u041d\u043e\u00a0\u0443 \u043d\u0430\u0441 \u0432\u00a0\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u043e\u043a\u043e\u043b\u043e 2000\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 PostgreSQL \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0433\u0440\u0443\u0437\u043a\u0438 event loop \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u00a0\u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441\u00a0\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0430\u00a0system\u2011ssh \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 1.25\u00a0Mbps, \u0430\u00a0\u0434\u043b\u044f\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u0441\u0442\u0430\u0440\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c inproc\u00a0\u2014 0.75\u00a0Mpbs. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c ssh-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 spawn \u0432 Node.JS \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/nodejs.org\/api\/child_process.html#optionsstdio:~:text=On%20Unix%2Dlike,issue%207381.\">\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438<\/a> \u0438\u0437-\u0437\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 heap, \u043f\u0440\u0438\u0447\u0435\u043c \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u0442\u0435\u043c \u043e\u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435:<\/p>\n<p><em>On Unix-like operating systems, the\u00a0<\/em><code>child_process.spawn()<\/code><em>\u00a0method performs memory operations synchronously before decoupling the event loop from the child. Applications with a large memory footprint may find frequent\u00a0<\/em><code>child_process.spawn()<\/code><em>\u00a0calls to be a bottleneck. For more information, see\u00a0<\/em><a href=\"https:\/\/bugs.chromium.org\/p\/v8\/issues\/detail?id=7381\"><em>V8 issue 7381<\/em><\/a><em>. <\/em><\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0440\u043a\u0435\u0440-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u044d\u0448\u0438 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a spawn \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435.<\/p>\n<h3>SSH-\u043f\u0440\u043e\u043a\u0441\u0438<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 ssh \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u043f\u043b\u044e\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e ssh-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 PostgreSQL \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u044b\u043d\u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a ssh \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 net.Socket<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 stdout \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D0%BA%D0%B5%D1%82_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0_Unix\">Unix domain socket<\/a>, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 socket<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ sshproxy const { Client } = require('system-ssh'); const sshConnection = new Client(); const socketPath = '\/tmp\/host_1\/stream_1.sock';  sshConnection.exec('tail -F postgresql.log', (error, stream) => {     const server = net.createServer({noDelay: true}, (socket) => {         stream.pipe(socket).pipe(stream);     })     server.on('error', (err) => {         if (err.code === 'EADDRINUSE') {             \/\/ \u0441\u043e\u043a\u0435\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443             const clientSocket = new net.Socket();             clientSocket.on('error', (clientError) => {                 if (clientError.code === 'ECONNREFUSED') {                     \/\/ \u0441\u043e\u043a\u0435\u0442 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430                     fs.unlinkSync(socketPath);                     server.listen(socketPath);                 }             });             clientSocket.connect({path: socketPath}, () => {                 \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c, \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043e\u043a\u0435\u0442                 clientSocket.destroy();                 server.close();             });         }     })     server.on('listening', () => {         \/\/ \u0441\u043e\u043a\u0435\u0442 \u0433\u043e\u0442\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043e\u0440\u043a\u0435\u0440\u0430     })     server.listen(socketPath); })  \/\/ worker const clientSocket = new net.Socket(); clientSocket.connect({path: socketPath}, () => {     \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043a \u0441\u043e\u043a\u0435\u0442\u0443     clientSocket.on('data', (data) => {         \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435         \/\/ \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e clientSocket.pipe(dataHandler)     }) })<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043d\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0435.<\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 net.Socket \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB\">named pipe<\/a> (<a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/fifo.7.html\">FIFO<\/a>):<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 net.Socket \u043d\u0430 FIFO<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f FIFO \u043f\u0440\u043e\u0449\u0435, \u0432 sshproxy \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/nodejs.org\/api\/fs.html#class-fswritestream\">\u043f\u0438\u0448\u0443\u0449\u0438\u0439<\/a> \u043f\u043e\u0442\u043e\u043a, \u0430 \u0432 \u0432\u043e\u0440\u043a\u0435\u0440\u0435 &#8212; <a href=\"https:\/\/nodejs.org\/api\/fs.html#class-fsreadstream\">\u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439<\/a><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f FIFO<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ sshproxy const { exec } = require('child_process'); const fs = require('fs'); const { Client } = require('system-ssh'); const sshConnection = new Client();  const fifo = '\/tmp\/host_1\/stream_1.fifo' const cmdFifo = exec(`test -p ${fifo} || mkfifo ${fifo}`, (error, stdout, stderr) => {     fs.open(fifo, 'w', (error, fd) => {         sshConnection.exec('tail -F postgresql.log', {stdio: ['pipe', fd, 'pipe']}, (error, stream) => {             const fifoStream = fs.createWriteStream(fifo, {fd});             stream.pipe(fifoStream);         })     }) })  \/\/ worker let stream = fs.createReadStream(fifo); stream.on('data', (data) => {     \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     \/\/ \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e stream.pipe(dataHandler) })<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0445 \u0432 15 \u0440\u0430\u0437:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u043d\u0438\u0437\u0438\u043b\u0438\u0441\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0438 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 &#8212; \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414<\/figcaption><\/div>\n<\/figure>\n<h3>UV_THREADPOOL<\/h3>\n<p>\u0411\u0435\u0437\u00a0\u043b\u043e\u0436\u043a\u0438 \u0434\u0435\u0433\u0442\u044f \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u00a0\u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c, \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0FIFO \u043d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0Node.JS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 <a href=\"https:\/\/nodejs.org\/api\/cli.html#uv_threadpool_sizesize\">uv_threadpool<\/a> , \u0430\u00a0\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0438 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u0435\u043d 4. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 4\u00a0\u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u00a0\u044d\u0442\u043e\u043c \u043f\u0443\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043d\u044f\u0442\u044b, \u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u00a0\u044d\u0442\u043e\u043c\u00a0\u0436\u0435 \u043f\u0443\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 dns.lookup() \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 crypto API, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u00a0\u043d\u0430\u0441 \u0432\u00a0\u0432\u043e\u0440\u043a\u0435\u0440\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e (\u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u00a0\u0441\u0442\u0430\u0440\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0441\u00a0\u043c\u043e\u0434\u0443\u043b\u0435\u043c ssh2), \u043f\u0440\u0438\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 FIFO \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0442\u043e, \u0447\u0442\u043e\u00a0\u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 FIFO \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 fs.open(fifo) \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a uv_threadpool \u0434\u043e\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 FIFO \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b\u0445\u043e\u0434\u043e\u043c, \u043a\u0430\u043a\u00a0\u043f\u0438\u0448\u0443\u0442 <a href=\"https:\/\/github.com\/nodejs\/node\/issues\/23220#issuecomment-426345872\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043c\u043e\u0433\u043b\u043e\u00a0\u0431\u044b\u00a0\u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430, \u043d\u043e\u00a0\u043c\u043e\u0434\u0443\u043b\u044c fs \u0432\u00a0Node.JS \u0442\u0430\u043a \u043d\u0435\u00a0\u0443\u043c\u0435\u0435\u0442, \u0430\u00a0\u0442\u043e\u0442 \u0447\u0442\u043e\u00a0\u0443\u043c\u0435\u0435\u0442\u00a0\u2014 net.Socket \u043d\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c\u00a0\u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u0438\u043d sshproxy \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e 20\u201330\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 PostgreSQL \u0438 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/p>\n<\/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\/company\/tensor\/blog\/722616\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/722616\/<\/a><br \/><\/br><\/br><\/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-346891","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346891","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=346891"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346891\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=346891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=346891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=346891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}