<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Jem Space]]></title><description><![CDATA[Web - Electronic - DIY - Art]]></description><link>https://jem-space.ru/</link><image><url>https://jem-space.ru/favicon.png</url><title>Jem Space</title><link>https://jem-space.ru/</link></image><generator>Ghost 4.27</generator><lastBuildDate>Fri, 07 Nov 2025 10:23:27 GMT</lastBuildDate><atom:link href="https://jem-space.ru/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Как перенести MongoDB на другой сервер с помощью репликации]]></title><description><![CDATA[<h1></h1><p>&#x41D;&#x430; &#x43C;&#x43E;&#x435;&#x43C; VPS &#x437;&#x430; 5 &#x431;&#x430;&#x43A;&#x441;&#x43E;&#x432; &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x438; MongoDB &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x43E;</p>]]></description><link>https://jem-space.ru/mongo-db-replication/</link><guid isPermaLink="false">690c7d0ba00f10000130cbc5</guid><category><![CDATA[mongo]]></category><category><![CDATA[mongobd]]></category><category><![CDATA[telegram]]></category><category><![CDATA[database]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Fri, 07 Nov 2025 10:14:25 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/11/326996b98ced2e00f7744ba30fca0e69.jpeg" medium="image"/><content:encoded><![CDATA[<h1></h1><img src="https://jem-space.ru/content/images/2025/11/326996b98ced2e00f7744ba30fca0e69.jpeg" alt="&#x41A;&#x430;&#x43A; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x435;&#x441;&#x442;&#x438; MongoDB &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;"><p>&#x41D;&#x430; &#x43C;&#x43E;&#x435;&#x43C; VPS &#x437;&#x430; 5 &#x431;&#x430;&#x43A;&#x441;&#x43E;&#x432; &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x438; MongoDB &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x43E;&#x440;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; (&#x438; &#x43E;&#x442;&#x432;&#x430;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439;). &#x425;&#x43E;&#x442;&#x435;&#x43B;&#x43E;&#x441;&#x44C; &#x43D;&#x430;&#x443;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x44C; &#x431;&#x434; &#x441; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x431;&#x435;&#x437; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; (&#x445;&#x43E;&#x442;&#x44F; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x43A;&#x440;&#x438;&#x442;&#x438;&#x447;&#x43D;&#x43E;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x432;&#x441;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x443;&#x436;&#x435; &#x443;&#x43F;&#x430;&#x43B;&#x438; &#x445;&#x430;-&#x445;&#x430;, &#x434;&#x430;&#x436;&#x435; &#x447;&#x435;&#x440;&#x435;&#x437; Compass &#x43D;&#x435; &#x43C;&#x43E;&#x433;&#x443; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F;). &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443;, &#x43A;&#x430;&#x43A; <strong>&#x43F;&#x435;&#x440;&#x435;&#x43D;&#x435;&#x441;&#x442;&#x438; MongoDB &#x441; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;</strong>.</p><hr><h2 id="%F0%9F%94%A7-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8E">&#x1F527; &#x417;&#x430;&#x447;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44E;</h2><p>&#x420;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44F; MongoDB &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x43E;&#x432;, &#x433;&#x434;&#x435;:</p><ul><li><strong>PRIMARY</strong> &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438;,</li><li><strong>SECONDARY</strong> &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x43B;&#x438; &#x431;&#x44D;&#x43A;&#x430;&#x43F;&#x430;.</li></ul><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x430;&#x43A; &#x43D;&#x43E;&#x432;&#x430;&#x44F; &#x43D;&#x43E;&#x434;&#x430; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F;, &#x43C;&#x44B; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; &#x43D;&#x435;&#x451;.</p><hr><h2 id="%E2%9A%99%EF%B8%8F-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2">&#x2699;&#xFE0F; &#x41F;&#x43E;&#x434;&#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x43E;&#x432;</h2><h3 id="%D0%BD%D0%B0-%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5">&#x41D;&#x430; &#x441;&#x442;&#x430;&#x440;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;:</h3><ul><li>&#x423;&#x436;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x430; MongoDB (&#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x434;&#x440;&#x435;&#x432;&#x43D;&#x44F;&#x44F; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; 4.2). &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x442;&#x430;&#x43A; <code>mongod --version</code></li><li>&#x415;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; <code>admin</code> &#x441; &#x43F;&#x440;&#x430;&#x432;&#x430;&#x43C;&#x438; root (&#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x442;&#x430;&#x43A;, &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x432;&#x448;&#x438;&#x442;&#x44C; &#x43A; mongo shell &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;):</li></ul><pre><code class="language-js">use admin
db.createUser({
  user: &quot;admin&quot;,
  pwd: &quot;StrongPass123&quot;,
  roles: [&quot;root&quot;]
})
</code></pre><h3 id="%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B2%D0%BE%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5">&#x41D;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;:</h3><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D; Docker, &#x442;. &#x43A; &#x43F;&#x43B;&#x430;&#x43D;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; Mongo &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435;.</p><hr><h2 id="%F0%9F%9A%80-1-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%91%D0%BC-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0-%D1%81%D0%B5%D1%82-%D0%BD%D0%B0-%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5">&#x1F680; 1. &#x421;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x43C; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;-&#x441;&#x435;&#x442; &#x43D;&#x430; &#x441;&#x442;&#x430;&#x440;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;</h2><p>&#x41E;&#x442;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x435;&#x43C; Mongo shell:</p><pre><code class="language-bash">mongo -u admin -p StrongPass123 --authenticationDatabase admin
</code></pre><p>&#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;-&#x441;&#x435;&#x442;:</p><pre><code class="language-js">rs.initiate({
  _id: &quot;rs0&quot;,
  members: [
    { _id: 0, host: &quot;old.ip.address:27017&quot; } // IP &#x441;&#x442;&#x430;&#x440;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;
  ]
})
</code></pre><p>&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;:</p><pre><code class="language-js">rs.status()
</code></pre><p>&#x414;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441; <code>PRIMARY</code>.</p><hr><h2 id="%F0%9F%94%90-2-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-%D0%BA%D0%BB%D1%8E%D1%87-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8">&#x1F510; 2. &#x41D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x44E;&#x447; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;</h2><p>MongoDB &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; <strong>keyFile</strong> &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x443;&#x437;&#x43B;&#x430;&#x43C;&#x438; &#x441; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x451;&#x43D;&#x43D;&#x43E;&#x439; &#x430;&#x432;&#x442;&#x43E;&#x440;&#x438;&#x437;&#x430;&#x446;&#x438;&#x435;&#x439;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x432;&#x430;&#x43C; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x43A;&#x440;&#x443;&#x433; ip, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x432;&#x430;&#x448;&#x435;&#x439; &#x431;&#x430;&#x437;&#x435; &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;. &#x415;&#x441;&#x442;&#x44C; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x430;&#x432;&#x442;&#x43E;&#x440;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E;, &#x43D;&#x43E; &#x442;&#x43E;&#x433;&#x434;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x435;&#x440;&#x43E;&#x44F;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x447;&#x442;&#x43E; &#x432;&#x430;&#x448;&#x443; &#x431;&#x434; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x434;&#x440;&#x43E;&#x43F;&#x43D;&#x443;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x431;&#x43E;&#x442;&#x44B;.</p><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x43C; &#x43A;&#x43B;&#x44E;&#x447; &#x43D;&#x430; &#x441;&#x442;&#x430;&#x440;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;:</p><pre><code class="language-bash">openssl rand -base64 756 &gt; mongodb-keyfile
sudo mv mongodb-keyfile /etc/mongodb-keyfile
sudo chmod 400 /etc/mongodb-keyfile
sudo chown mongodb:mongodb /etc/mongodb-keyfile
</code></pre><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x432;&#x430;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x430;&#x432;&#x430; (400) &#x438; &#x432;&#x43B;&#x430;&#x434;&#x435;&#x43B;&#x44C;&#x446;&#x430; mongodb (&#x447;&#x442;&#x43E; &#x438; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43D;&#x43E; &#x432;&#x44B;&#x448;&#x435;).</p><p>&#x412; <code>/etc/mongod.conf</code> &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C;:</p><pre><code class="language-yaml">replication:
  replSetName: rs0
security:
  keyFile: /etc/mongodb-keyfile
  authorization: enabled
</code></pre><p>replSetName - &#x438;&#x43C;&#x44F; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x438;<br>keyFile - &#x43F;&#x443;&#x442;&#x44C; &#x43A; &#x43A;&#x43B;&#x44E;&#x447;&#x443;.</p><p>&#x41F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C; MongoDB:</p><pre><code class="language-bash">sudo systemctl restart mongod
</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438; &#x441;&#x442;&#x430;&#x440;&#x442;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; <code>bad file</code> &#x438;&#x43B;&#x438; <code>yaml-cpp: unknown escape character</code>, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;, <strong>&#x444;&#x430;&#x439;&#x43B; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x43E;&#x441;&#x44B; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x438;&#x43B;&#x438; &#x43A;&#x430;&#x432;&#x44B;&#x447;&#x43A;&#x438;</strong> &#x2014; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x443;&#x431;&#x435;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x43A;&#x43B;&#x44E;&#x447; &#x432; &#x43E;&#x434;&#x43D;&#x443; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x438; &#x431;&#x435;&#x437; &#x43F;&#x440;&#x43E;&#x431;&#x435;&#x43B;&#x43E;&#x432; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x435;. &#x418;&#x43D;&#x43E;&#x433;&#x434;&#x430; mongo &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x447;&#x435;&#x441;&#x442;&#x44C; &#x432;&#x430;&#x448; &#x444;&#x430;&#x439;&#x43B; &#x43A;&#x430;&#x43A; yml, &#x43C;&#x43D;&#x435; &#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x43B;&#x43E; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43F;&#x443;&#x442;&#x44C; &#x434;&#x43E; &#x444;&#x430;&#x439;&#x43B;&#x430; &#x432; &#x43A;&#x430;&#x432;&#x44B;&#x447;&#x43A;&#x430;&#x445;.</p><hr><h2 id="%F0%9F%90%B3-3-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D0%BC-mongodb-%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B2%D0%BE%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%B2-docker">&#x1F433; 3. &#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C; MongoDB &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x432; Docker</h2><p>&#x41D;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x43C; <code>mongodb-keyfile</code> &#x441; &#x442;&#x435;&#x43C; &#x436;&#x435; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x43C;&#x44B;&#x43C;:</p><pre><code class="language-bash">echo &quot;&#x442;&#x43E;&#x442;_&#x436;&#x435;_&#x43A;&#x43B;&#x44E;&#x447;&quot; &gt; mongodb-keyfile
chmod 400 mongodb-keyfile
</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x43C; docker-compose.yml:</p><pre><code class="language-yaml">version: &quot;3.8&quot;

services:
  mongo:
    image: mongo:4.2
    container_name: mongo
    restart: unless-stopped
    volumes:
      - ./data:/data/db
      - ./mongodb-keyfile:/etc/mongodb-keyfile
    command: &gt;
      mongod
      --replSet rs0
      --keyFile /etc/mongodb-keyfile
      --bind_ip_all
    ports:
      - &quot;27017:27017&quot;
</code></pre><p>&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C;:</p><pre><code class="language-bash">docker compose up -d
</code></pre><hr><h2 id="%F0%9F%94%97-4-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BA%D0%B0%D0%BA-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D1%83">&#x1F517; 4. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x43A;&#x430;&#x43A; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x443;</h2><p>&#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43A; <strong>PRIMARY</strong> (&#x43D;&#x430; &#x441;&#x442;&#x430;&#x440;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;) &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43D;&#x43E;&#x434;&#x443;:</p><pre><code class="language-bash">mongo -u admin -p StrongPass123 --authenticationDatabase admin
</code></pre><pre><code class="language-js">rs.add({ host: &quot;new.ip.address:27017&quot; })
</code></pre><p>&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;:</p><pre><code class="language-js">rs.status()
</code></pre><p>&#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x435; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;&#x430; &#x434;&#x43B;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x439; &#x43D;&#x43E;&#x434;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; state <code>STARTUP2</code>. &#x427;&#x435;&#x440;&#x435;&#x437; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x43D;&#x43E;&#x432;&#x430;&#x44F; &#x43D;&#x43E;&#x434;&#x430; &#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; <code>SECONDARY</code> &#x2014; &#x44D;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;, &#x447;&#x442;&#x43E; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x430;.</p><hr><h2 id="%F0%9F%95%B5%EF%B8%8F-5-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC-%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8E">&#x1F575;&#xFE0F; 5. &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E;</h2><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441; <code>SECONDARY</code> &#x431;&#x435;&#x437; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A;, &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x443;&#x436;&#x435; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x441;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x44B;.</p><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x431;&#x435;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;:</p><pre><code class="language-js">rs.printSecondaryReplicationInfo()
</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x441;&#x451; &#x43E;&#x43A; &#x2014; &#x431;&#x430;&#x437;&#x430; &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x430;&#x43A;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x430;.</p><hr><h2 id="%F0%9F%94%81-6-%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D0%BC-primary">&#x1F501; 6. &#x41F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; PRIMARY</h2><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E; &#xAB;&#x43F;&#x435;&#x440;&#x435;&#x435;&#x445;&#x430;&#x442;&#x44C;&#xBB;:</p><p>&#x41E;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; (&#x438;&#x43B;&#x438; &#x43F;&#x43E;&#x434;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>MONGODB_URI</code> &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x439; &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x44B;&#x439; IP).</p><p>&#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x441;&#x442;&#x430;&#x440;&#x43E;&#x43C;&#x443; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x443;:</p><pre><code class="language-js">rs.stepDown()
</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43D;&#x43E;&#x432;&#x430;&#x44F; &#x43D;&#x43E;&#x434;&#x430; &#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; <code>PRIMARY</code>.<br><br>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438; &#x432; &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;&#x430;&#x445; &#x43D;&#x430; &#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x430;&#x448;&#x430; &#x441;&#x442;&#x430;&#x440;&#x430;&#x44F; &#x43D;&#x43E;&#x434;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; <code>PRIMARY</code> (&#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x44D;&#x43A;&#x441;&#x43F;&#x435;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;&#x435; &#x441; &#x43D;&#x43E;&#x434;&#x430;&#x43C;&#x438;)</p><pre><code class="language-bash">rs.stepDown(60)
</code></pre><hr><h2 id="%F0%9F%A7%B1-7-%D1%83%D0%B4%D0%B0%D0%BB%D1%8F%D0%B5%D0%BC-%D1%81%D1%82%D0%B0%D1%80%D1%8B%D0%B9-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B8%D0%B7-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B8">&#x1F9F1; 7. &#x423;&#x434;&#x430;&#x43B;&#x44F;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x438;&#x437; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x438;</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x447;&#x442;&#x43E; &#x432;&#x441;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;, &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x437;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; mongo shell &#x432; &#x434;&#x43E;&#x43A;&#x435;&#x440;&#x435;: </p><pre><code class="language-bash">docker exec -it containerName mongo -u admin -p StrongPass123 --authenticationDatabase admin</code></pre><p>&#x418; &#x443;&#x434;&#x430;&#x43B;&#x44F;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x440;&#x443;&#x44E; &#x43D;&#x43E;&#x434;&#x443;</p><pre><code class="language-js">rs.remove(&quot;old.ip.address:27017&quot;)
</code></pre><hr><h2 id="%E2%9A%A0%EF%B8%8F-%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE">&#x26A0;&#xFE0F; &#x412;&#x430;&#x436;&#x43D;&#x43E;</h2><p>&#x422; &#x43A; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x411;&#x414; &#x441;&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x430; &#x43A;&#x430;&#x43A; replice-set, &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x43D;&#x435;&#x439; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x441; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C; (replicaSet=rs0):</p><pre><code class="language-bash">admin:StrongPasss123@ip.address:27017/db_name?authSource=admin&amp;authMechanism=DEFAULT&amp;replicaSet=rs0</code></pre><h2 id="%E2%9A%A0%EF%B8%8F-%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5-%D0%BA%D0%B0%D0%BC%D0%BD%D0%B8">&#x26A0;&#xFE0F; &#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x43A;&#x430;&#x43C;&#x43D;&#x438;</h2><p>&#x412;&#x43E;&#x442; &#x43D;&#x430; &#x447;&#x451;&#x43C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x43F;&#x43E;&#x442;&#x43A;&#x43D;&#x443;&#x442;&#x44C;&#x441;&#x44F; (&#x438; &#x43D;&#x430; &#x447;&#x451;&#x43C; &#x43C;&#x44B; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x441;&#x43F;&#x43E;&#x442;&#x43A;&#x43D;&#x443;&#x43B;&#x438;&#x441;&#x44C; &#x1F605;):</p><p><strong>&#x41E;&#x448;&#x438;&#x431;&#x43A;&#x438; &#x441; keyFile</strong></p><p>&#x424;&#x430;&#x439;&#x43B; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x43E;&#x434;&#x438;&#x43D;&#x430;&#x43A;&#x43E;&#x432; &#x43D;&#x430; &#x432;&#x441;&#x435;&#x445; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;&#x445;.<br>&#x41F;&#x440;&#x430;&#x432;&#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; <code>400</code>.<br>&#x411;&#x435;&#x437; &#x43A;&#x430;&#x432;&#x44B;&#x447;&#x435;&#x43A;, &#x431;&#x435;&#x437; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x43E;&#x441;&#x43E;&#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A;.</p><p><strong>&#x41D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; host</strong><br>&#x41F;&#x440;&#x438; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;-&#x441;&#x435;&#x442;&#x430; Mongo &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x43E;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x435; &#x438;&#x43C;&#x44F; <code>ubuntu-s-1vcpu...</code>.<br>&#x41D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C;:</p><pre><code class="language-js">cfg = rs.conf()
cfg.members[0].host = &quot;old.ip.address:27017&quot;
rs.reconfig(cfg, { force: true })
</code></pre><p><strong>&#x41E;&#x448;&#x438;&#x431;&#x43A;&#x430; <code>Unauthorized</code> &#x43F;&#x440;&#x438; rs.initiate()</strong><br>&#x417;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x442;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43B; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x443;&#x436;&#x435; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x430; &#x430;&#x432;&#x442;&#x43E;&#x440;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;, &#x43D;&#x43E; &#x43D;&#x435; &#x437;&#x430;&#x43B;&#x43E;&#x433;&#x438;&#x43D;&#x438;&#x43B;&#x441;&#x44F; &#x43A;&#x430;&#x43A; <code>admin</code> (&#x43D;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x43B; --authenticationDatabase admin).</p><p><strong>Firewall &#x438; &#x43F;&#x43E;&#x440;&#x442;&#x44B;</strong><br>&#x41E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x430;&#x434;&#x43E; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44C; &#x43F;&#x43E;&#x440;&#x442; <code>27017</code> &#x43C;&#x435;&#x436;&#x434;&#x443; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;&#x43C;&#x438;.</p><hr><p>&#x1F4A1; <em>&#x411;&#x43E;&#x43D;&#x443;&#x441;:</em> &#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x442;&#x440;&#x435;&#x442;&#x44C;&#x44E; &#x43D;&#x43E;&#x434;&#x443;-&#xAB;&#x430;&#x440;&#x431;&#x438;&#x442;&#x435;&#x440;&#xBB;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43D;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x43E;&#x443;&#x441;&#x442;&#x43E;&#x439;&#x447;&#x438;&#x432;&#x43E;&#x441;&#x442;&#x44C;:</p><pre><code class="language-js">rs.addArb(&quot;192.168.1.100:27017&quot;)
</code></pre><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x432;&#x441;&#x435;. &#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x43E;&#x439; Telegram-&#x43A;&#x430;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x442;&#x43A;&#x443; &#x438; &#x43D;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E;!<br>&#x412;&#x441;&#x435;&#x43C; &#x434;&#x43E;&#x431;&#x440;&#x430;! :)</p>]]></content:encoded></item><item><title><![CDATA[Настраиваем Nginx для сайта]]></title><description><![CDATA[<h1 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D0%BC-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2-80-443-%D0%BD%D0%B0-%D0%BD%D0%B0%D1%88%D0%B5-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-ssl-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D1%8B">&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x43C; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x44B; &#x441; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; 80, 443 &#x43D;&#x430; &#x43D;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; + SSL-&#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;</h1>]]></description><link>https://jem-space.ru/nastraivaiem-nginx-dlia-saita/</link><guid isPermaLink="false">68f27f81a00f10000130cb56</guid><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Fri, 17 Oct 2025 18:01:15 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/10/nginx.jpeg" medium="image"/><content:encoded><![CDATA[<h1 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D0%BC-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2-80-443-%D0%BD%D0%B0-%D0%BD%D0%B0%D1%88%D0%B5-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-ssl-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D1%8B">&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x43C; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x44B; &#x441; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; 80, 443 &#x43D;&#x430; &#x43D;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; + SSL-&#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B;</h1><img src="https://jem-space.ru/content/images/2025/10/nginx.jpeg" alt="&#x41D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x435;&#x43C; Nginx &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430;"><p>&#x421;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x43E;, &#x445;&#x43E;&#x441;&#x442;&#x44F;&#x442; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x43E;&#x432;, &#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43F;&#x43E; url &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43D;&#x430; &#x43F;&#x43E;&#x440;&#x442; 80. &#x421;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x443;&#x44E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x443; Nginx &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; HTTP-&#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;&#x430; &#x441; &#x43F;&#x43E;&#x440;&#x442;&#x430; 80 &#x438; HTTPS &#x441; &#x43F;&#x43E;&#x440;&#x442;&#x430; 443 &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x431;&#x435;&#x441;&#x43F;&#x43B;&#x430;&#x442;&#x43D;&#x44B;&#x445; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; Let&apos;s Encrypt. &#x42D;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441; HTTP &#x43D;&#x430; HTTPS, &#x438;&#x43D;&#x442;&#x435;&#x433;&#x440;&#x430;&#x446;&#x438;&#x44E; Certbot &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; &#x438; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E; &#x438;&#x445; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;, &#x447;&#x442;&#x43E; &#x43A;&#x440;&#x438;&#x442;&#x438;&#x447;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x432;&#x435;&#x431;-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439;.&#x200B;&#x200B;</p><h2 id="%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2-%D0%B2-nginx">&#x411;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; &#x432; Nginx</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; &#x43D;&#x43E;&#x432;&#x43E;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B; &#x438; nginx, &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x435; /etc/nginx/sites-available/ &#x435;&#x441;&#x442;&#x44C; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432; &#x444;&#x430;&#x439;&#x43B;&#x435; default. &#x421;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x440;&#x44F;&#x434;&#x43E;&#x43C; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x441; &#x43B;&#x443;&#x431;&#x44B;&#x43C; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; you-site.ru.conf). &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x444;&#x430;&#x439;&#x43B;&#x435; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x434;&#x432;&#x430; &#x431;&#x43B;&#x43E;&#x43A;&#x430; server: &#x43E;&#x434;&#x438;&#x43D; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x440;&#x442;&#x430; 80, &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x434;&#x43B;&#x44F; 443. &#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x440;&#x442;&#x430; 80 &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; HTTPS, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x441;&#x435; &#x43D;&#x435;&#x437;&#x430;&#x449;&#x438;&#x449;&#x451;&#x43D;&#x43D;&#x44B;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434;&#x438;&#x43B;&#x438; &#x43D;&#x430; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x44B;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;.&#x200B;</p><h2 id="%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D1%80%D1%82%D0%B0-80-http">&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x440;&#x442;&#x430; 80 (HTTP)</h2><pre><code class="language-nginx">server {     
    listen 80;
    listen [::]:80;     
    server_name example.com www.example.com; 
}</code></pre><p>&#x42D;&#x442;&#x430; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x430; return 301 &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x44B;&#x439; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;, &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x44F; &#x43F;&#x443;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x43D;&#x43E;&#x435; &#x438;&#x43C;&#x44F;. &#x423;&#x43A;&#x430;&#x436;&#x438;&#x442;&#x435; &#x432;&#x430;&#x448; &#x434;&#x43E;&#x43C;&#x435;&#x43D; &#x432; server_name &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x447;&#x43D;&#x43E;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438;.</p><p>&#x412;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x44F; &#x434;&#x43B;&#x44F; server &#x441;&#x43E;&#x437;&#x434;&#x430;&#x441;&#x442;&#x441;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; certbot&apos;&#x43E;&#x43C;&#x200B;. &#x41F;&#x43E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x43E; &#x43D;&#x435;&#x435; &#x447;&#x443;&#x442;&#x44C; &#x43F;&#x43E;&#x437;&#x436;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438;.</p><h2 id="%D0%B2%D1%8B%D0%BF%D1%83%D1%81%D0%BA-ssl-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2-%D1%81-certbot">&#x412;&#x44B;&#x43F;&#x443;&#x441;&#x43A; SSL-&#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; &#x441; Certbot</h2><p>Certbot &#x2014; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x43E;&#x442; EFF, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; Let&apos;s Encrypt &#x447;&#x435;&#x440;&#x435;&#x437; ACME-&#x43F;&#x440;&#x43E;&#x442;&#x43E;&#x43A;&#x43E;&#x43B;. &#x41E;&#x43D; &#x432;&#x435;&#x440;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x443;&#x435;&#x442; &#x434;&#x43E;&#x43C;&#x435;&#x43D; &#x43F;&#x43E; HTTP (&#x43F;&#x43E;&#x440;&#x442; 80) &#x438; &#x438;&#x43D;&#x442;&#x435;&#x433;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x441; Nginx, &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44F; ssl-&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x44B; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44E;.&#x200B;</p><h2 id="%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-certbot">&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; Certbot</h2><p>&#x41D;&#x430; Ubuntu/Debian &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C;:</p><p><code>sudo apt update &amp;&amp; sudo apt install certbot python3-certbot-nginx</code></p><p>&#x417;&#x430;&#x442;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;:</p><p><code>sudo certbot --nginx -d example.com -d www.example.com</code></p><p>Certbot &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x442; email &#x434;&#x43B;&#x44F; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x439;, &#x441;&#x43E;&#x433;&#x43B;&#x430;&#x441;&#x438;&#x442;&#x441;&#x44F; &#x441; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F;&#x43C;&#x438; &#x438; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x438;&#x442; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442; (&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x43E;&#x43F;&#x446;&#x438;&#x44E; 2 &#x434;&#x43B;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;). &#x41E;&#x43D; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x441;&#x442; &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x432; /etc/letsencrypt/live/example.com/ &#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442; &#x432;&#x430;&#x448; .conf-&#x444;&#x430;&#x439;&#x43B;. &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x443;&#x436;&#x43D;&#x43E;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x431;&#x43B;&#x43E;&#x43A; location &#x434;&#x43B;&#x44F; .well-known/acme-challenge &#x432; HTTP-&#x431;&#x43B;&#x43E;&#x43A; &#x434;&#x43B;&#x44F; &#x432;&#x435;&#x440;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;:&#x200B;</p><pre><code class="language-nginx">location /.well-known/acme-challenge {
    root /var/www/letsencrypt;
    allow all; 
}</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x439;&#x442;&#x435; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x44E; <code>letsencrypt</code> e&#x441;&#x43B;&#x438; &#x435;&#x435; &#x43D;&#x435;&#x442;: <code>sudo mkdir -p /var/www/letsencrypt</code>.&#x200B;</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x430;&#x43A; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x432;&#x44B;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x44B;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442; &#x441; 80 &#x43F;&#x43E;&#x440;&#x442;&#x430; &#x43D;&#x430; 443 (&#x441; http &#x43D;&#x430; https)</p><pre><code class="language-nginx">server {     
    listen 80;
    listen [::]:80;     
    server_name example.com www.example.com;
  
    # redirect
    return 301 https://$server_name$request_uri;
}</code></pre><h2 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE%D1%80%D1%82%D0%B0-443-https">&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x43F;&#x43E;&#x440;&#x442;&#x430; 443 (HTTPS)</h2><p>&#x414;&#x43B;&#x44F; HTTPS &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; ssl-&#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x432; &#x431;&#x43B;&#x43E;&#x43A; server. &#x418;&#x445; &#x441;&#x43A;&#x43E;&#x440;&#x435;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x441;&#x442; &#x441;&#x430;&#x43C; certbot (&#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x441;&#x430;&#x43C;&#x438;). &#x423;&#x43A;&#x430;&#x436;&#x435;&#x43C; &#x43F;&#x443;&#x442;&#x438; &#x43A; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x443; &#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x443;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x442;&#x43E;&#x43A;&#x43E;&#x43B;&#x44B; &#x438; &#x448;&#x438;&#x444;&#x440;&#x44B; &#x434;&#x43B;&#x44F; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;.&#x200B;</p><pre><code class="language-nginx">server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # &#x41F;&#x443;&#x442;&#x438; &#x43A; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x430;&#x43C; (&#x431;&#x443;&#x434;&#x443;&#x442; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x44B; Certbot)
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # &#x420;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x435;&#x43C;&#x44B;&#x435; SSL-&#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    location / {
        # &#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440;: &#x43F;&#x440;&#x43E;&#x43A;&#x441;&#x438; &#x43D;&#x430; backend (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x43E;&#x440;&#x442; 8080)
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; http2 &#x443;&#x43B;&#x443;&#x447;&#x448;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x430; proxy_pass &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x435;&#x43D;, &#x435;&#x441;&#x43B;&#x438; &#x441;&#x430;&#x439;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x43C; &#x43F;&#x43E;&#x440;&#x442;&#x443; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43D;&#x430; 8080). &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44C;&#x442;&#x435; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439; <code>sudo nginx -t</code> &#x438; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x438;&#x442;&#x435;: <code>sudo systemctl reload nginx</code>.&#x200B;</p><h2 id="%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2">&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432;</h2><p>&#x421;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x438;&#x441;&#x442;&#x435;&#x43A;&#x430;&#x44E;&#x442; &#x447;&#x435;&#x440;&#x435;&#x437; 90 &#x434;&#x43D;&#x435;&#x439;, &#x43D;&#x43E; Certbot &#x43D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x435;&#x442; &#x430;&#x432;&#x442;&#x43E;&#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x447;&#x435;&#x440;&#x435;&#x437; systemd-timer. &#x422;&#x430;&#x439;&#x43C;&#x435;&#x440; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x434;&#x432;&#x430;&#x436;&#x434;&#x44B; &#x432; &#x434;&#x435;&#x43D;&#x44C; &#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x435;&#x442;, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x435;&#x43D;&#x435;&#x435; 30 &#x434;&#x43D;&#x435;&#x439;.&#x200B;</p><h2 id="%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%B8-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F">&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;</h2><p>&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44C;&#x442;&#x435; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;: <code>sudo systemctl status certbot.timer</code>. &#x414;&#x43B;&#x44F; &#x442;&#x435;&#x441;&#x442;&#x430;: <code>sudo certbot renew --dry-run</code>. &#x415;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x439;&#x43C;&#x435;&#x440; &#x43D;&#x435; &#x430;&#x43A;&#x442;&#x438;&#x432;&#x435;&#x43D;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;: <code>sudo systemctl enable certbot.timer &amp;&amp; sudo systemctl start certbot.timer</code>. Certbot &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; post-hook &#x434;&#x43B;&#x44F; reload Nginx: <code>--post-hook &quot;systemctl reload nginx&quot;</code>, &#x447;&#x442;&#x43E; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442; downtime. &#x410;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x432; crontab (<code>sudo crontab -e</code>):&#x200B;</p><p><code>0 */12 * * * /usr/bin/certbot renew --quiet --nginx</code></p><p>&#x42D;&#x442;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x435; 12 &#x447;&#x430;&#x441;&#x43E;&#x432;.&#x200B;</p><h2 id="%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B">&#x422;&#x435;&#x441;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x438; &#x441;&#x43E;&#x432;&#x435;&#x442;&#x44B;</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x442;&#x435;&#x441;&#x442;&#x438;&#x440;&#x443;&#x439;&#x442;&#x435; &#x441;&#x430;&#x439;&#x442;: <a href="https://example.com/" rel="nofollow noopener">https://example.com</a> &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x437;&#x435;&#x43B;&#x451;&#x43D;&#x44B;&#x439; &#x437;&#x430;&#x43C;&#x43E;&#x43A; &#x431;&#x435;&#x437; &#x43F;&#x440;&#x435;&#x434;&#x443;&#x43F;&#x440;&#x435;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x439;. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x432;&#x440;&#x43E;&#x434;&#x435; SSL Labs &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; (ssllabs.com/ssltest). &#x415;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x43A;&#x441;&#x438;&#x440;&#x443;&#x435;&#x442;&#x435; &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x43F;&#x43E;&#x440;&#x442; (&#x43A;&#x430;&#x43A; 8080), &#x443;&#x431;&#x435;&#x434;&#x438;&#x442;&#x435;&#x441;&#x44C;, &#x447;&#x442;&#x43E; backend &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; X-Forwarded-Proto &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x442;&#x43D;&#x43E;&#x439; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; HTTPS. &#x414;&#x43B;&#x44F; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x445; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x43E;&#x432; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x44F;&#x439;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x441; --nginx -d domain2.com. &#x418;&#x437;&#x431;&#x435;&#x433;&#x430;&#x439;&#x442;&#x435; &#x441;&#x43B;&#x430;&#x431;&#x44B;&#x445; &#x448;&#x438;&#x444;&#x440;&#x43E;&#x432; &#x438; &#x440;&#x435;&#x433;&#x443;&#x43B;&#x44F;&#x440;&#x43D;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x439;&#x442;&#x435; Nginx &#x434;&#x43B;&#x44F; &#x43F;&#x430;&#x442;&#x447;&#x435;&#x439; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;.&#x200B;</p><p>&#x42D;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x441;&#x430;&#x439;&#x442; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x437;&#x430;&#x449;&#x438;&#x449;&#x451;&#x43D;&#x43D;&#x44B;&#x43C; &#x438; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x44B;&#x43C; &#x43A; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x43A;&#x448;&#x435;&#x43D;&#x443;.</p><p>&#x42F; &#x43E;&#x441;&#x432;&#x435;&#x436;&#x430;&#x43B; &#x44D;&#x442;&#x438; &#x437;&#x43D;&#x430;&#x43D;&#x438;&#x44F;, &#x43F;&#x43E;&#x43A;&#x430; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x438;&#x43B; &#x43A; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x43A;&#x448;&#x435;&#x43D;&#x443; &#x441;&#x432;&#x43E;&#x439; &#x431;&#x43B;&#x43E;&#x433; &#x441; &#x43A;&#x43E;&#x440;&#x43E;&#x442;&#x43A;&#x438;&#x43C;&#x438; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x43C;&#x438; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435; https://tldread.ru.</p>]]></content:encoded></item><item><title><![CDATA[Список понятий для составления хорошего промпта для veo3]]></title><description><![CDATA[<p>&#x421;&#x43B;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x438;&#x434;&#x443;&#x43C;&#x430;&#x442;&#x44C; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x43C;&#x43F;&#x442; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x435;&#x448;&#x44C; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x438;</p>]]></description><link>https://jem-space.ru/veo3-prompt-parts/</link><guid isPermaLink="false">68e3a311a00f10000130cb39</guid><category><![CDATA[veo3]]></category><category><![CDATA[ai]]></category><category><![CDATA[prompt]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Mon, 06 Oct 2025 11:35:34 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/10/veo3-img.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/10/veo3-img.jpg" alt="&#x421;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x43C;&#x43F;&#x442;&#x430; &#x434;&#x43B;&#x44F; veo3"><p>&#x421;&#x43B;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x438;&#x434;&#x443;&#x43C;&#x430;&#x442;&#x44C; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x43C;&#x43F;&#x442; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x435;&#x448;&#x44C; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x441;&#x44A;&#x435;&#x43C;&#x43A;&#x438; &#x438; &#x435;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438;. &#x42F; &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x43B; chatgpt &#x43C;&#x43D;&#x435; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x441;&#x43B;&#x43E;&#x432;&#x43E;&#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x438; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x440;&#x43E;&#x43C;&#x43F;&#x442;&#x430;.</p><h2 id="%F0%9F%8E%A5-1-%D1%82%D0%B8%D0%BF%D1%8B-%D0%BA%D0%B0%D0%B4%D1%80%D0%BE%D0%B2-camera-shots">&#x1F3A5; 1. &#x422;&#x438;&#x43F;&#x44B; &#x43A;&#x430;&#x434;&#x440;&#x43E;&#x432; (Camera Shots)</h2><!--kg-card-begin: html--><table data-start="338" data-end="1715" class="w-fit min-w-(--thread-content-width)"><thead data-start="338" data-end="381"><tr data-start="338" data-end="381"><th data-start="338" data-end="351" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="351" data-end="369" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="369" data-end="381" data-col-size="md">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="427" data-end="1715"><tr data-start="427" data-end="508"><td data-start="427" data-end="457" data-col-size="sm"><strong data-start="429" data-end="456">Extreme wide shot (EWS)</strong></td><td data-start="457" data-end="470" data-col-size="sm">&#x41E;&#x431;&#x449;&#x438;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="470" data-end="508" data-col-size="md">&#x41F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x435;&#x441;&#x44C; &#x43F;&#x435;&#x439;&#x437;&#x430;&#x436;, &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x435;.</td></tr><tr data-start="509" data-end="596"><td data-start="509" data-end="530" data-col-size="sm"><strong data-start="511" data-end="529">Wide shot (WS)</strong></td><td data-start="530" data-end="545" data-col-size="sm">&#x428;&#x438;&#x440;&#x43E;&#x43A;&#x438;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="545" data-end="596" data-col-size="md">&#x412;&#x438;&#x434;&#x43D;&#x430; &#x444;&#x438;&#x433;&#x443;&#x440;&#x430; &#x446;&#x435;&#x43B;&#x438;&#x43A;&#x43E;&#x43C; &#x438;&#x43B;&#x438; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x443;&#x447;&#x430;&#x441;&#x442;&#x43E;&#x43A; &#x441;&#x446;&#x435;&#x43D;&#x44B;.</td></tr><tr data-start="597" data-end="675"><td data-start="597" data-end="620" data-col-size="sm"><strong data-start="599" data-end="619">Medium shot (MS)</strong></td><td data-start="620" data-end="635" data-col-size="sm">&#x421;&#x440;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="635" data-end="675" data-col-size="md">&#x41E;&#x442; &#x43F;&#x43E;&#x44F;&#x441;&#x430; &#x438; &#x432;&#x44B;&#x448;&#x435;, &#x430;&#x43A;&#x446;&#x435;&#x43D;&#x442; &#x43D;&#x430; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x438;.</td></tr><tr data-start="676" data-end="745"><td data-start="676" data-end="696" data-col-size="sm"><strong data-start="678" data-end="695">Close-up (CU)</strong></td><td data-start="696" data-end="711" data-col-size="sm">&#x41A;&#x440;&#x443;&#x43F;&#x43D;&#x44B;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="711" data-end="745" data-col-size="md">&#x422;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43B;&#x438;&#x446;&#x43E; &#x438;&#x43B;&#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43A;&#x440;&#x443;&#x43F;&#x43D;&#x43E;.</td></tr><tr data-start="746" data-end="837"><td data-start="746" data-end="775" data-col-size="sm"><strong data-start="748" data-end="774">Extreme close-up (ECU)</strong></td><td data-start="775" data-end="795" data-col-size="sm">&#x421;&#x432;&#x435;&#x440;&#x445;&#x43A;&#x440;&#x443;&#x43F;&#x43D;&#x44B;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="795" data-end="837" data-col-size="md">&#x414;&#x435;&#x442;&#x430;&#x43B;&#x44C; (&#x433;&#x43B;&#x430;&#x437;, &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x430;, &#x43B;&#x43E;&#x433;&#x43E;&#x442;&#x438;&#x43F; &#x438; &#x442;.&#x43F;.).</td></tr><tr data-start="838" data-end="945"><td data-start="838" data-end="873" data-col-size="sm"><strong data-start="840" data-end="872">Over-the-shoulder shot (OTS)</strong></td><td data-start="873" data-end="883" data-col-size="sm">&#x421; &#x43F;&#x43B;&#x435;&#x447;&#x430;</td><td data-start="883" data-end="945" data-col-size="md">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x437;&#x430; &#x441;&#x43F;&#x438;&#x43D;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x441;&#x43E;&#x43D;&#x430;&#x436;&#x430;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43D;&#x430; &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;.</td></tr><tr data-start="946" data-end="1034"><td data-start="946" data-end="977" data-col-size="sm"><strong data-start="948" data-end="976">Point of view (POV) shot</strong></td><td data-start="977" data-end="995" data-col-size="sm">&#x41E;&#x442; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x433;&#x43E; &#x43B;&#x438;&#x446;&#x430;</td><td data-start="995" data-end="1034" data-col-size="md">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x43A;&#x430;&#x43A; &#x431;&#x443;&#x434;&#x442;&#x43E; &#x433;&#x43B;&#x430;&#x437;&#x430;&#x43C;&#x438; &#x43F;&#x435;&#x440;&#x441;&#x43E;&#x43D;&#x430;&#x436;&#x430;.</td></tr><tr data-start="1035" data-end="1107"><td data-start="1035" data-end="1073" data-col-size="sm"><strong data-start="1037" data-end="1072">Top-down shot / Bird&#x2019;s-eye view</strong></td><td data-start="1073" data-end="1082" data-col-size="sm">&#x421;&#x432;&#x435;&#x440;&#x445;&#x443;</td><td data-start="1082" data-end="1107" data-col-size="md">&#x421;&#x446;&#x435;&#x43D;&#x430; &#x432;&#x438;&#x434;&#x43D;&#x430; &#x441; &#x432;&#x44B;&#x441;&#x43E;&#x442;&#x44B;.</td></tr><tr data-start="1108" data-end="1170"><td data-start="1108" data-end="1129" data-col-size="sm"><strong data-start="1110" data-end="1128">Low-angle shot</strong></td><td data-start="1129" data-end="1143" data-col-size="sm">&#x421;&#x43D;&#x438;&#x437;&#x443; &#x432;&#x432;&#x435;&#x440;&#x445;</td><td data-start="1143" data-end="1170" data-col-size="md">&#x414;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x201C;&#x43C;&#x43E;&#x449;&#x43D;&#x435;&#x435;&#x201D;.</td></tr><tr data-start="1171" data-end="1242"><td data-start="1171" data-end="1193" data-col-size="sm"><strong data-start="1173" data-end="1192">High-angle shot</strong></td><td data-start="1193" data-end="1207" data-col-size="sm">&#x421;&#x432;&#x435;&#x440;&#x445;&#x443; &#x432;&#x43D;&#x438;&#x437;</td><td data-start="1207" data-end="1242" data-col-size="md">&#x414;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x201C;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x435;&#x201D;, &#x441;&#x43B;&#x430;&#x431;&#x435;&#x435;.</td></tr><tr data-start="1243" data-end="1323"><td data-start="1243" data-end="1275" data-col-size="sm"><strong data-start="1245" data-end="1274">Dutch angle / Tilted shot</strong></td><td data-start="1275" data-end="1287" data-col-size="sm">&#x41F;&#x43E;&#x434; &#x443;&#x433;&#x43B;&#x43E;&#x43C;</td><td data-start="1287" data-end="1323" data-col-size="md">&#x414;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x43D;&#x44B;&#x439;, &#x201C;&#x43D;&#x435;&#x441;&#x442;&#x430;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439;&#x201D; &#x43A;&#x430;&#x434;&#x440;.</td></tr><tr data-start="1324" data-end="1429"><td data-start="1324" data-end="1357" data-col-size="sm"><strong data-start="1326" data-end="1356">Tracking shot / Dolly shot</strong></td><td data-start="1357" data-end="1387" data-col-size="sm">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x434;&#x432;&#x438;&#x436;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x430; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x43C;</td><td data-start="1387" data-end="1429" data-col-size="md">&#x421;&#x43B;&#x435;&#x434;&#x438;&#x442; &#x437;&#x430; &#x434;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435;&#x43C; (&#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A;, &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x430;).</td></tr><tr data-start="1430" data-end="1489"><td data-start="1430" data-end="1448" data-col-size="sm"><strong data-start="1432" data-end="1447">Static shot</strong></td><td data-start="1448" data-end="1465" data-col-size="sm">&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x43A;&#x430;&#x434;&#x440;</td><td data-start="1465" data-end="1489" data-col-size="md">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x43D;&#x435; &#x434;&#x432;&#x438;&#x433;&#x430;&#x435;&#x442;&#x441;&#x44F;.</td></tr><tr data-start="1490" data-end="1568"><td data-start="1490" data-end="1518" data-col-size="sm"><strong data-start="1492" data-end="1517">Pan shot (left/right)</strong></td><td data-start="1518" data-end="1529" data-col-size="sm">&#x41F;&#x430;&#x43D;&#x43E;&#x440;&#x430;&#x43C;&#x430;</td><td data-start="1529" data-end="1568" data-col-size="md">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x43F;&#x43E;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43B;&#x435;&#x432;&#x43E;/&#x432;&#x43F;&#x440;&#x430;&#x432;&#x43E;.</td></tr><tr data-start="1569" data-end="1638"><td data-start="1569" data-end="1595" data-col-size="sm"><strong data-start="1571" data-end="1594">Tilt shot (up/down)</strong></td><td data-start="1595" data-end="1604" data-col-size="sm">&#x41D;&#x430;&#x43A;&#x43B;&#x43E;&#x43D;</td><td data-start="1604" data-end="1638" data-col-size="md">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x43D;&#x430;&#x43A;&#x43B;&#x43E;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x432;&#x435;&#x440;&#x445;/&#x432;&#x43D;&#x438;&#x437;.</td></tr><tr data-start="1639" data-end="1715"><td data-start="1639" data-end="1657" data-col-size="sm"><strong data-start="1641" data-end="1656">Zoom in/out</strong></td><td data-start="1657" data-end="1681" data-col-size="sm">&#x41F;&#x440;&#x438;&#x431;&#x43B;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435;/&#x43E;&#x442;&#x434;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x435;</td><td data-start="1681" data-end="1715" data-col-size="md">&#x41E;&#x43F;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x430;.</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="%F0%9F%9A%B6-2-%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D1%8B-camera-movement">&#x1F6B6; 2. &#x414;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x44B; (Camera Movement)</h2><!--kg-card-begin: html--><table data-start="1765" data-end="2561" class="w-fit min-w-(--thread-content-width)"><thead data-start="1765" data-end="1808"><tr data-start="1765" data-end="1808"><th data-start="1765" data-end="1778" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="1778" data-end="1796" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="1796" data-end="1808" data-col-size="sm">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="1854" data-end="2561"><tr data-start="1854" data-end="1942"><td data-start="1854" data-end="1883" data-col-size="sm"><strong data-start="1856" data-end="1882">Smooth camera movement</strong></td><td data-start="1883" data-end="1909" data-col-size="sm">&#x41F;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x435; &#x434;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x44B;</td><td data-start="1909" data-end="1942" data-col-size="sm">&#x411;&#x435;&#x437; &#x440;&#x44B;&#x432;&#x43A;&#x43E;&#x432;, &#x43A;&#x438;&#x43D;&#x435;&#x43C;&#x430;&#x442;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x43D;&#x43E;.</td></tr><tr data-start="1943" data-end="2016"><td data-start="1943" data-end="1965" data-col-size="sm"><strong data-start="1945" data-end="1964">Handheld camera</strong></td><td data-start="1965" data-end="1973" data-col-size="sm">&#x421; &#x440;&#x443;&#x43A;</td><td data-start="1973" data-end="2016" data-col-size="sm">&#x42D;&#x444;&#x444;&#x435;&#x43A;&#x442; &quot;&#x436;&#x438;&#x432;&#x43E;&#x439;&quot;, &#x441;&#x43B;&#x435;&#x433;&#x43A;&#x430; &#x434;&#x440;&#x43E;&#x436;&#x430;&#x449;&#x435;&#x439; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x44B;.</td></tr><tr data-start="2017" data-end="2099"><td data-start="2017" data-end="2038" data-col-size="sm"><strong data-start="2019" data-end="2037">Steadycam shot</strong></td><td data-start="2038" data-end="2065" data-col-size="sm">&#x421;&#x442;&#x430;&#x431;&#x438;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x430;</td><td data-start="2065" data-end="2099" data-col-size="sm">&#x41A;&#x438;&#x43D;&#x435;&#x43C;&#x430;&#x442;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x43F;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x441;&#x442;&#x44C;.</td></tr><tr data-start="2100" data-end="2161"><td data-start="2100" data-end="2117" data-col-size="sm"><strong data-start="2102" data-end="2116">Drone shot</strong></td><td data-start="2117" data-end="2127" data-col-size="sm">&#x421; &#x434;&#x440;&#x43E;&#x43D;&#x430;</td><td data-start="2127" data-end="2161" data-col-size="sm">&#x412;&#x44B;&#x441;&#x43E;&#x43A;&#x438;&#x439; &#x440;&#x430;&#x43A;&#x443;&#x440;&#x441;, &#x43F;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x439; &#x43F;&#x43E;&#x43B;&#x451;&#x442;.</td></tr><tr data-start="2162" data-end="2261"><td data-start="2162" data-end="2184" data-col-size="sm"><strong data-start="2164" data-end="2183">Orbiting camera</strong></td><td data-start="2184" data-end="2218" data-col-size="sm">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43E;&#x43A;&#x440;&#x443;&#x433; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;</td><td data-start="2218" data-end="2261" data-col-size="sm">&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x440;&#x435;&#x434;&#x43C;&#x435;&#x442;&#x430;.</td></tr><tr data-start="2262" data-end="2380"><td data-start="2262" data-end="2307" data-col-size="sm"><strong data-start="2264" data-end="2306">Tracking from behind / in front / side</strong></td><td data-start="2307" data-end="2342" data-col-size="sm">&#x421;&#x43B;&#x435;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x437;&#x430;&#x434;&#x438; / &#x441;&#x43F;&#x435;&#x440;&#x435;&#x434;&#x438; / &#x441;&#x431;&#x43E;&#x43A;&#x443;</td><td data-start="2342" data-end="2380" data-col-size="sm">&#x414;&#x43B;&#x44F; &#x434;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x435;&#x440;&#x441;&#x43E;&#x43D;&#x430;&#x436;&#x430; &#x438;&#x43B;&#x438; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x44B;.</td></tr><tr data-start="2381" data-end="2482"><td data-start="2381" data-end="2406" data-col-size="sm"><strong data-start="2383" data-end="2405">Push-in / Pull-out</strong></td><td data-start="2406" data-end="2449" data-col-size="sm">&#x41C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x431;&#x43B;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435; / &#x43E;&#x442;&#x434;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x44B;</td><td data-start="2449" data-end="2482" data-col-size="sm">&#x42D;&#x444;&#x444;&#x435;&#x43A;&#x442; &#x432;&#x43E;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x43B;&#x438; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x430;.</td></tr><tr data-start="2483" data-end="2561"><td data-start="2483" data-end="2500" data-col-size="sm"><strong data-start="2485" data-end="2499">Rack focus</strong></td><td data-start="2500" data-end="2517" data-col-size="sm">&#x41F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x430;</td><td data-start="2517" data-end="2561" data-col-size="sm">&#x41C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x444;&#x43E;&#x43A;&#x443;&#x441; &#x441; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E; &#x43D;&#x430; &#x437;&#x430;&#x434;&#x43D;&#x438;&#x439; &#x43F;&#x43B;&#x430;&#x43D;.</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="%F0%9F%92%A1-3-%D0%BE%D1%81%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-lighting">&#x1F4A1; 3. &#x41E;&#x441;&#x432;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x435; (Lighting)</h2><!--kg-card-begin: html--><table data-start="2598" data-end="3587" class="w-fit min-w-(--thread-content-width)"><thead data-start="2598" data-end="2641"><tr data-start="2598" data-end="2641"><th data-start="2598" data-end="2611" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="2611" data-end="2629" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="2629" data-end="2641" data-col-size="sm">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="2687" data-end="3587"><tr data-start="2687" data-end="2757"><td data-start="2687" data-end="2707" data-col-size="sm"><strong data-start="2689" data-end="2706">Soft lighting</strong></td><td data-start="2707" data-end="2721" data-col-size="sm">&#x41C;&#x44F;&#x433;&#x43A;&#x438;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="2721" data-end="2757" data-col-size="sm">&#x411;&#x435;&#x437; &#x436;&#x451;&#x441;&#x442;&#x43A;&#x438;&#x445; &#x442;&#x435;&#x43D;&#x435;&#x439;, &#x435;&#x441;&#x442;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439;.</td></tr><tr data-start="2758" data-end="2833"><td data-start="2758" data-end="2778" data-col-size="sm"><strong data-start="2760" data-end="2777">Hard lighting</strong></td><td data-start="2778" data-end="2793" data-col-size="sm">&#x416;&#x451;&#x441;&#x442;&#x43A;&#x438;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="2793" data-end="2833" data-col-size="sm">&#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x442;&#x435;&#x43D;&#x438;, &#x430;&#x43A;&#x446;&#x435;&#x43D;&#x442; &#x43D;&#x430; &#x444;&#x430;&#x43A;&#x442;&#x443;&#x440;&#x435;.</td></tr><tr data-start="2834" data-end="2897"><td data-start="2834" data-end="2854" data-col-size="sm"><strong data-start="2836" data-end="2853">Natural light</strong></td><td data-start="2854" data-end="2874" data-col-size="sm">&#x415;&#x441;&#x442;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="2874" data-end="2897" data-col-size="sm">&#x421;&#x43E;&#x43B;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439;, &#x434;&#x43D;&#x435;&#x432;&#x43D;&#x43E;&#x439;.</td></tr><tr data-start="2898" data-end="2974"><td data-start="2898" data-end="2920" data-col-size="sm"><strong data-start="2900" data-end="2919">Studio lighting</strong></td><td data-start="2920" data-end="2942" data-col-size="sm">&#x421;&#x442;&#x443;&#x434;&#x438;&#x439;&#x43D;&#x43E;&#x435; &#x43E;&#x441;&#x432;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x435;</td><td data-start="2942" data-end="2974" data-col-size="sm">&#x420;&#x430;&#x432;&#x43D;&#x43E;&#x43C;&#x435;&#x440;&#x43D;&#x43E;&#x435;, &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x435;.</td></tr><tr data-start="2975" data-end="3054"><td data-start="2975" data-end="3000" data-col-size="sm"><strong data-start="2977" data-end="2999">Cinematic lighting</strong></td><td data-start="3000" data-end="3027" data-col-size="sm">&#x41A;&#x438;&#x43D;&#x435;&#x43C;&#x430;&#x442;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="3027" data-end="3054" data-col-size="sm">&#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;, &#x431;&#x43B;&#x438;&#x43A;&#x438;, &#x43E;&#x431;&#x44A;&#x451;&#x43C;.</td></tr><tr data-start="3055" data-end="3135"><td data-start="3055" data-end="3083" data-col-size="sm"><strong data-start="3057" data-end="3082">Backlight / Rim light</strong></td><td data-start="3083" data-end="3100" data-col-size="sm">&#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x432;&#x43E;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="3100" data-end="3135" data-col-size="sm">&#x41F;&#x43E;&#x434;&#x441;&#x432;&#x435;&#x442;&#x43A;&#x430; &#x441;&#x437;&#x430;&#x434;&#x438;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x442; &#x43E;&#x440;&#x435;&#x43E;&#x43B;.</td></tr><tr data-start="3136" data-end="3204"><td data-start="3136" data-end="3156" data-col-size="sm"><strong data-start="3138" data-end="3155">Side lighting</strong></td><td data-start="3156" data-end="3171" data-col-size="sm">&#x411;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="3171" data-end="3204" data-col-size="sm">&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x433;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x443; &#x438; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x443;&#x440;&#x443;.</td></tr><tr data-start="3205" data-end="3283"><td data-start="3205" data-end="3228" data-col-size="sm"><strong data-start="3207" data-end="3227">Low-key lighting</strong></td><td data-start="3228" data-end="3255" data-col-size="sm">&#x422;&#x451;&#x43C;&#x43D;&#x44B;&#x439;, &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;&#x43D;&#x44B;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="3255" data-end="3283" data-col-size="sm">&#x414;&#x440;&#x430;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x44B;&#x439;, &#x437;&#x430;&#x433;&#x430;&#x434;&#x43E;&#x447;&#x43D;&#x44B;&#x439;.</td></tr><tr data-start="3284" data-end="3369"><td data-start="3284" data-end="3308" data-col-size="sm"><strong data-start="3286" data-end="3307">High-key lighting</strong></td><td data-start="3308" data-end="3336" data-col-size="sm">&#x421;&#x432;&#x435;&#x442;&#x43B;&#x44B;&#x439;, &#x440;&#x430;&#x432;&#x43D;&#x43E;&#x43C;&#x435;&#x440;&#x43D;&#x44B;&#x439; &#x441;&#x432;&#x435;&#x442;</td><td data-start="3336" data-end="3369" data-col-size="sm">&#x420;&#x435;&#x43A;&#x43B;&#x430;&#x43C;&#x43D;&#x44B;&#x439;, &#x201C;&#x433;&#x43B;&#x44F;&#x43D;&#x446;&#x435;&#x432;&#x44B;&#x439;&#x201D; &#x441;&#x442;&#x438;&#x43B;&#x44C;.</td></tr><tr data-start="3370" data-end="3444"><td data-start="3370" data-end="3397" data-col-size="sm"><strong data-start="3372" data-end="3396">Golden hour lighting</strong></td><td data-start="3397" data-end="3411" data-col-size="sm">&#x421;&#x432;&#x435;&#x442; &#x437;&#x430;&#x43A;&#x430;&#x442;&#x430;</td><td data-start="3411" data-end="3444" data-col-size="sm">&#x422;&#x451;&#x43F;&#x43B;&#x44B;&#x439; &#x43C;&#x44F;&#x433;&#x43A;&#x438;&#x439; &#x43E;&#x440;&#x430;&#x43D;&#x436;&#x435;&#x432;&#x44B;&#x439; &#x441;&#x432;&#x435;&#x442;.</td></tr><tr data-start="3445" data-end="3512"><td data-start="3445" data-end="3470" data-col-size="sm"><strong data-start="3447" data-end="3469">Blue hour lighting</strong></td><td data-start="3470" data-end="3485" data-col-size="sm">&#x421;&#x432;&#x435;&#x442; &#x441;&#x443;&#x43C;&#x435;&#x440;&#x435;&#x43A;</td><td data-start="3485" data-end="3512" data-col-size="sm">&#x425;&#x43E;&#x43B;&#x43E;&#x434;&#x43D;&#x44B;&#x439; &#x441;&#x438;&#x43D;&#x438;&#x439; &#x43E;&#x442;&#x442;&#x435;&#x43D;&#x43E;&#x43A;.</td></tr><tr data-start="3513" data-end="3587"><td data-start="3513" data-end="3533" data-col-size="sm"><strong data-start="3515" data-end="3532">Neon lighting</strong></td><td data-start="3533" data-end="3554" data-col-size="sm">&#x41D;&#x435;&#x43E;&#x43D;&#x43E;&#x432;&#x43E;&#x435; &#x43E;&#x441;&#x432;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x435;</td><td data-start="3554" data-end="3587" data-col-size="sm">&#x421;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x439;, cyberpunk &#x441;&#x442;&#x438;&#x43B;&#x44C;.</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="%F0%9F%8C%88-4-%D0%B0%D1%82%D0%BC%D0%BE%D1%81%D1%84%D0%B5%D1%80%D0%B0-%D0%B8-%D1%86%D0%B2%D0%B5%D1%82-mood-color-tone">&#x1F308; 4. &#x410;&#x442;&#x43C;&#x43E;&#x441;&#x444;&#x435;&#x440;&#x430; &#x438; &#x446;&#x432;&#x435;&#x442; (Mood / Color Tone)</h2><!--kg-card-begin: html--><table data-start="3640" data-end="4390" class="w-fit min-w-(--thread-content-width)"><thead data-start="3640" data-end="3683"><tr data-start="3640" data-end="3683"><th data-start="3640" data-end="3653" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="3653" data-end="3671" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="3671" data-end="3683" data-col-size="sm">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="3729" data-end="4390"><tr data-start="3729" data-end="3788"><td data-start="3729" data-end="3745" data-col-size="sm"><strong data-start="3731" data-end="3744">Warm tone</strong></td><td data-start="3745" data-end="3760" data-col-size="sm">&#x422;&#x451;&#x43F;&#x43B;&#x44B;&#x435; &#x446;&#x432;&#x435;&#x442;&#x430;</td><td data-start="3760" data-end="3788" data-col-size="sm">&#x416;&#x451;&#x43B;&#x442;&#x43E;-&#x43E;&#x440;&#x430;&#x43D;&#x436;&#x435;&#x432;&#x44B;&#x435; &#x43E;&#x442;&#x442;&#x435;&#x43D;&#x43A;&#x438;.</td></tr><tr data-start="3789" data-end="3854"><td data-start="3789" data-end="3805" data-col-size="sm"><strong data-start="3791" data-end="3804">Cool tone</strong></td><td data-start="3805" data-end="3822" data-col-size="sm">&#x425;&#x43E;&#x43B;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x446;&#x432;&#x435;&#x442;&#x430;</td><td data-start="3822" data-end="3854" data-col-size="sm">&#x421;&#x438;&#x43D;&#x438;&#x435;, &#x441;&#x435;&#x440;&#x44B;&#x435;, &#x43C;&#x435;&#x442;&#x430;&#x43B;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435;.</td></tr><tr data-start="3855" data-end="3922"><td data-start="3855" data-end="3874" data-col-size="sm"><strong data-start="3857" data-end="3873">Muted colors</strong></td><td data-start="3874" data-end="3895" data-col-size="sm">&#x41F;&#x440;&#x438;&#x433;&#x43B;&#x443;&#x448;&#x451;&#x43D;&#x43D;&#x44B;&#x435; &#x446;&#x432;&#x435;&#x442;&#x430;</td><td data-start="3895" data-end="3922" data-col-size="sm">&#x41F;&#x430;&#x441;&#x442;&#x435;&#x43B;&#x44C;, &#x431;&#x435;&#x437; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;&#x430;.</td></tr><tr data-start="3923" data-end="3984"><td data-start="3923" data-end="3942" data-col-size="sm"><strong data-start="3925" data-end="3941">Vivid colors</strong></td><td data-start="3942" data-end="3956" data-col-size="sm">&#x42F;&#x440;&#x43A;&#x438;&#x435; &#x446;&#x432;&#x435;&#x442;&#x430;</td><td data-start="3956" data-end="3984" data-col-size="sm">&#x41D;&#x430;&#x441;&#x44B;&#x442;&#x435;&#x43D;&#x43D;&#x44B;&#x435;, &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;&#x43D;&#x44B;&#x435;.</td></tr><tr data-start="3985" data-end="4035"><td data-start="3985" data-end="4002" data-col-size="sm"><strong data-start="3987" data-end="4001">Monochrome</strong></td><td data-start="4002" data-end="4013" data-col-size="sm">&#x41C;&#x43E;&#x43D;&#x43E;&#x445;&#x440;&#x43E;&#x43C;</td><td data-start="4013" data-end="4035" data-col-size="sm">&#x41E;&#x434;&#x438;&#x43D; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x432;&#x43E;&#x439; &#x442;&#x43E;&#x43D;.</td></tr><tr data-start="4036" data-end="4127"><td data-start="4036" data-end="4066" data-col-size="sm"><strong data-start="4038" data-end="4065">Cinematic color grading</strong></td><td data-start="4066" data-end="4103" data-col-size="sm">&#x41A;&#x438;&#x43D;&#x435;&#x43C;&#x430;&#x442;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x446;&#x438;&#x44F;</td><td data-start="4103" data-end="4127" data-col-size="sm">&#x411;&#x430;&#x43B;&#x430;&#x43D;&#x441; &#x441;&#x432;&#x435;&#x442;&#x430; &#x438; &#x442;&#x435;&#x43D;&#x438;.</td></tr><tr data-start="4128" data-end="4185"><td data-start="4128" data-end="4150" data-col-size="sm"><strong data-start="4130" data-end="4149">Black and white</strong></td><td data-start="4150" data-end="4170" data-col-size="sm">&#x427;&#x451;&#x440;&#x43D;&#x43E;-&#x431;&#x435;&#x43B;&#x43E;&#x435; &#x432;&#x438;&#x434;&#x435;&#x43E;</td><td data-start="4170" data-end="4185" data-col-size="sm">&#x410;&#x440;&#x442;-&#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;.</td></tr><tr data-start="4186" data-end="4261"><td data-start="4186" data-end="4217" data-col-size="sm"><strong data-start="4188" data-end="4216">Foggy / Misty atmosphere</strong></td><td data-start="4217" data-end="4238" data-col-size="sm">&#x422;&#x443;&#x43C;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x430;&#x442;&#x43C;&#x43E;&#x441;&#x444;&#x435;&#x440;&#x430;</td><td data-start="4238" data-end="4261" data-col-size="sm">&#x41C;&#x44F;&#x433;&#x43A;&#x430;&#x44F;, &#x437;&#x430;&#x433;&#x430;&#x434;&#x43E;&#x447;&#x43D;&#x430;&#x44F;.</td></tr><tr data-start="4262" data-end="4329"><td data-start="4262" data-end="4280" data-col-size="sm"><strong data-start="4264" data-end="4279">Dreamy look</strong></td><td data-start="4280" data-end="4298" data-col-size="sm">&#x421;&#x43A;&#x430;&#x437;&#x43E;&#x447;&#x43D;&#x44B;&#x439; &#x441;&#x442;&#x438;&#x43B;&#x44C;</td><td data-start="4298" data-end="4329" data-col-size="sm">&#x420;&#x430;&#x437;&#x43C;&#x44B;&#x442;&#x44B;&#x435; &#x43A;&#x440;&#x430;&#x44F;, &#x43C;&#x44F;&#x433;&#x43A;&#x438;&#x439; &#x441;&#x432;&#x435;&#x442;.</td></tr><tr data-start="4330" data-end="4390"><td data-start="4330" data-end="4350" data-col-size="sm"><strong data-start="4332" data-end="4349">Dramatic look</strong></td><td data-start="4350" data-end="4370" data-col-size="sm">&#x414;&#x440;&#x430;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x441;&#x442;&#x438;&#x43B;&#x44C;</td><td data-start="4370" data-end="4390" data-col-size="sm">&#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x430;&#x441;&#x442;&#x44B;, &#x442;&#x435;&#x43D;&#x438;.</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="%F0%9F%A7%B1-5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F-%D0%B8-%D0%BF%D0%B5%D1%80%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%B0">&#x1F9F1; 5. &#x41A;&#x43E;&#x43C;&#x43F;&#x43E;&#x437;&#x438;&#x446;&#x438;&#x44F; &#x438; &#x43F;&#x435;&#x440;&#x441;&#x43F;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x430;</h2><!--kg-card-begin: html--><table data-start="4431" data-end="5080" class="w-fit min-w-(--thread-content-width)"><thead data-start="4431" data-end="4474"><tr data-start="4431" data-end="4474"><th data-start="4431" data-end="4444" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="4444" data-end="4462" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="4462" data-end="4474" data-col-size="sm">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="4520" data-end="5080"><tr data-start="4520" data-end="4598"><td data-start="4520" data-end="4553" data-col-size="sm"><strong data-start="4522" data-end="4552">Rule of thirds composition</strong></td><td data-start="4553" data-end="4570" data-col-size="sm">&#x41F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x43E; &#x442;&#x440;&#x435;&#x442;&#x435;&#x439;</td><td data-start="4570" data-end="4598" data-col-size="sm">&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x441;&#x43C;&#x435;&#x449;&#x451;&#x43D; &#x43E;&#x442; &#x446;&#x435;&#x43D;&#x442;&#x440;&#x430;.</td></tr><tr data-start="4599" data-end="4680"><td data-start="4599" data-end="4626" data-col-size="sm"><strong data-start="4601" data-end="4625">Centered composition</strong></td><td data-start="4626" data-end="4654" data-col-size="sm">&#x426;&#x435;&#x43D;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x437;&#x438;&#x446;&#x438;&#x44F;</td><td data-start="4654" data-end="4680" data-col-size="sm">&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x432; &#x446;&#x435;&#x43D;&#x442;&#x440;&#x435; &#x43A;&#x430;&#x434;&#x440;&#x430;.</td></tr><tr data-start="4681" data-end="4763"><td data-start="4681" data-end="4711" data-col-size="sm"><strong data-start="4683" data-end="4710">Symmetrical composition</strong></td><td data-start="4711" data-end="4737" data-col-size="sm">&#x421;&#x438;&#x43C;&#x43C;&#x435;&#x442;&#x440;&#x438;&#x447;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x437;&#x438;&#x446;&#x438;&#x44F;</td><td data-start="4737" data-end="4763" data-col-size="sm">&#x411;&#x430;&#x43B;&#x430;&#x43D;&#x441; &#x441;&#x43B;&#x435;&#x432;&#x430; &#x438; &#x441;&#x43F;&#x440;&#x430;&#x432;&#x430;.</td></tr><tr data-start="4764" data-end="4840"><td data-start="4764" data-end="4785" data-col-size="sm"><strong data-start="4766" data-end="4784">Depth of field</strong></td><td data-start="4785" data-end="4804" data-col-size="sm">&#x413;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x430; &#x440;&#x435;&#x437;&#x43A;&#x43E;&#x441;&#x442;&#x438;</td><td data-start="4804" data-end="4840" data-col-size="sm">&#x420;&#x430;&#x437;&#x43C;&#x44B;&#x442;&#x44B;&#x439; &#x444;&#x43E;&#x43D;, &#x430;&#x43A;&#x446;&#x435;&#x43D;&#x442; &#x43D;&#x430; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x435;.</td></tr><tr data-start="4841" data-end="4911"><td data-start="4841" data-end="4867" data-col-size="sm"><strong data-start="4843" data-end="4866">Wide depth of field</strong></td><td data-start="4867" data-end="4894" data-col-size="sm">&#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x433;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x430; &#x440;&#x435;&#x437;&#x43A;&#x43E;&#x441;&#x442;&#x438;</td><td data-start="4894" data-end="4911" data-col-size="sm">&#x412;&#x441;&#x451; &#x432; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x435;.</td></tr><tr data-start="4912" data-end="4993"><td data-start="4912" data-end="4941" data-col-size="sm"><strong data-start="4914" data-end="4940">Shallow depth of field</strong></td><td data-start="4941" data-end="4966" data-col-size="sm">&#x41C;&#x430;&#x43B;&#x430;&#x44F; &#x433;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x430; &#x440;&#x435;&#x437;&#x43A;&#x43E;&#x441;&#x442;&#x438;</td><td data-start="4966" data-end="4993" data-col-size="sm">&#x422;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x432; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x435;.</td></tr><tr data-start="4994" data-end="5080"><td data-start="4994" data-end="5033" data-col-size="sm"><strong data-start="4996" data-end="5032">Foreground / Background elements</strong></td><td data-start="5033" data-end="5058" data-col-size="sm">&#x41F;&#x435;&#x440;&#x435;&#x434;&#x43D;&#x438;&#x439; / &#x437;&#x430;&#x434;&#x43D;&#x438;&#x439; &#x43F;&#x43B;&#x430;&#x43D;</td><td data-start="5058" data-end="5080" data-col-size="sm">&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x433;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x443;.</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="%F0%9F%A7%8D-6-%D1%82%D0%B8%D0%BF%D1%8B-%D1%81%D1%86%D0%B5%D0%BD-%D0%B8-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9">&#x1F9CD; 6. &#x422;&#x438;&#x43F;&#x44B; &#x441;&#x446;&#x435;&#x43D; &#x438; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x439;</h2><!--kg-card-begin: html--><table data-start="5117" data-end="5732" class="w-fit min-w-(--thread-content-width)"><thead data-start="5117" data-end="5160"><tr data-start="5117" data-end="5160"><th data-start="5117" data-end="5130" data-col-size="sm">&#x410;&#x43D;&#x433;&#x43B;&#x438;&#x439;&#x441;&#x43A;&#x438;&#x439;</th><th data-start="5130" data-end="5148" data-col-size="sm">&#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;</th><th data-start="5148" data-end="5160" data-col-size="sm">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;</th></tr></thead><tbody data-start="5206" data-end="5732"><tr data-start="5206" data-end="5281"><td data-start="5206" data-end="5229" data-col-size="sm"><strong data-start="5208" data-end="5228">Product showcase</strong></td><td data-start="5229" data-end="5253" data-col-size="sm">&#x414;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x430;</td><td data-start="5253" data-end="5281" data-col-size="sm">&#x41F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x43B;&#x44F; &#x43C;&#x430;&#x440;&#x43A;&#x435;&#x442;&#x438;&#x43D;&#x433;&#x430;.</td></tr><tr data-start="5282" data-end="5347"><td data-start="5282" data-end="5300" data-col-size="sm"><strong data-start="5284" data-end="5299">Slow motion</strong></td><td data-start="5300" data-end="5321" data-col-size="sm">&#x417;&#x430;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x44A;&#x451;&#x43C;&#x43A;&#x430;</td><td data-start="5321" data-end="5347" data-col-size="sm">&#x42D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x43D;&#x430;&#x44F; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;.</td></tr><tr data-start="5348" data-end="5410"><td data-start="5348" data-end="5365" data-col-size="sm"><strong data-start="5350" data-end="5364">Time-lapse</strong></td><td data-start="5365" data-end="5385" data-col-size="sm">&#x423;&#x441;&#x43A;&#x43E;&#x440;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x44A;&#x451;&#x43C;&#x43A;&#x430;</td><td data-start="5385" data-end="5410" data-col-size="sm">&#x418;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438;.</td></tr><tr data-start="5411" data-end="5490"><td data-start="5411" data-end="5433" data-col-size="sm"><strong data-start="5413" data-end="5432">Lifestyle scene</strong></td><td data-start="5433" data-end="5452" data-col-size="sm">&#x412; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x436;&#x438;&#x437;&#x43D;&#x438;</td><td data-start="5452" data-end="5490" data-col-size="sm">&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x430; &#x432; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x438;.</td></tr><tr data-start="5491" data-end="5559"><td data-start="5491" data-end="5515" data-col-size="sm"><strong data-start="5493" data-end="5514">Studio background</strong></td><td data-start="5515" data-end="5531" data-col-size="sm">&#x421;&#x442;&#x443;&#x434;&#x438;&#x439;&#x43D;&#x44B;&#x439; &#x444;&#x43E;&#x43D;</td><td data-start="5531" data-end="5559" data-col-size="sm">&#x427;&#x438;&#x441;&#x442;&#x44B;&#x439;, &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x438;&#x441;&#x442;&#x438;&#x447;&#x43D;&#x44B;&#x439;.</td></tr><tr data-start="5560" data-end="5632"><td data-start="5560" data-end="5588" data-col-size="sm"><strong data-start="5562" data-end="5587">Animated text overlay</strong></td><td data-start="5588" data-end="5610" data-col-size="sm">&#x410;&#x43D;&#x438;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x442;&#x435;&#x43A;&#x441;&#x442;</td><td data-start="5610" data-end="5632" data-col-size="sm">&#x420;&#x435;&#x43A;&#x43B;&#x430;&#x43C;&#x43D;&#x44B;&#x435; &#x43D;&#x430;&#x434;&#x43F;&#x438;&#x441;&#x438;.</td></tr><tr data-start="5633" data-end="5732"><td data-start="5633" data-end="5670" data-col-size="sm"><strong data-start="5635" data-end="5669">Camera orbit around the object</strong></td><td data-start="5670" data-end="5704" data-col-size="sm">&#x41A;&#x430;&#x43C;&#x435;&#x440;&#x430; &#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43E;&#x43A;&#x440;&#x443;&#x433; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;</td><td data-start="5704" data-end="5732" data-col-size="sm">&#x414;&#x43B;&#x44F; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430;.</td></tr></tbody></table><!--kg-card-end: html--><p>&#x412;&#x43E;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43F;&#x440;&#x43E;&#x43C;&#x43F;&#x442;&#x430;:</p><blockquote><em>&#x201C;A product showcase of a modern smartwatch on a clean white background, smooth orbiting camera, soft studio lighting, shallow depth of field, cinematic color grading, minimal text overlay, 8 seconds video.&#x201D;</em><br><em>(&#x414;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43C;&#x430;&#x440;&#x442;-&#x447;&#x430;&#x441;&#x430; &#x43D;&#x430; &#x431;&#x435;&#x43B;&#x43E;&#x43C; &#x444;&#x43E;&#x43D;&#x435;, &#x43F;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x435; &#x432;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x44B;, &#x43C;&#x44F;&#x433;&#x43A;&#x438;&#x439; &#x441;&#x442;&#x443;&#x434;&#x438;&#x439;&#x43D;&#x44B;&#x439; &#x441;&#x432;&#x435;&#x442;, &#x43C;&#x430;&#x43B;&#x430;&#x44F; &#x433;&#x43B;&#x443;&#x431;&#x438;&#x43D;&#x430; &#x440;&#x435;&#x437;&#x43A;&#x43E;&#x441;&#x442;&#x438;, &#x43A;&#x438;&#x43D;&#x435;&#x43C;&#x430;&#x442;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x446;&#x438;&#x44F;, &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x442;&#x435;&#x43A;&#x441;&#x442;, 8 &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;.)</em></blockquote>]]></content:encoded></item><item><title><![CDATA[10 причин пойти на Frontend Conf 2025]]></title><description><![CDATA[Frontend Conf 2025 — крупнейшая конференция для фронтенд-разработчиков. Мы собрали 10 причин, почему стоит посетить событие.]]></description><link>https://jem-space.ru/reasons-for-frontend-conf-2025/</link><guid isPermaLink="false">68dbad3ca00f10000130ca70</guid><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Tue, 30 Sep 2025 10:43:46 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/09/frontconf.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/09/frontconf.jpg" alt="10 &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D; &#x43F;&#x43E;&#x439;&#x442;&#x438; &#x43D;&#x430; Frontend Conf 2025"><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;! 20 &#x438; 21 &#x43E;&#x43A;&#x442;&#x44F;&#x431;&#x440;&#x44F; &#x432; &#x41C;&#x43E;&#x441;&#x43A;&#x432;&#x435;, &#x432; &#x41A;&#x43B;&#x430;&#x441;&#x442;&#x435;&#x440;&#x435; &quot;&#x41B;&#x43E;&#x43C;&#x43E;&#x43D;&#x43E;&#x441;&#x43E;&#x432;&quot; &#x43F;&#x440;&#x43E;&#x439;&#x434;&#x435;&#x442; &#x43E;&#x434;&#x43D;&#x430; &#x438;&#x437; &#x442;&#x43E;&#x43F;&#x43E;&#x432;&#x44B;&#x445; &#x43A;&#x43E;&#x43D;&#x444;&#x435;&#x440;&#x435;&#x43D;&#x446;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x444;&#x440;&#x43E;&#x43D;&#x442;&#x43E;&#x432; &#x2013; <a href="http://frontendconf.ru/moscow/2025?utm_source=publish&amp;utm_medium=cpa&amp;utm_content=amb&amp;utm_campaign=front_end_dev">Frontend Conf 2025</a> &#x1F680;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x433;&#x43E;&#x434;&#x443; &#x44F; &#x441;&#x430;&#x43C; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x43F;&#x43E;&#x435;&#x445;&#x430;&#x442;&#x44C; &#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x443;&#x448;&#x430;&#x442;&#x44C; &#x438; &#x432;&#x43E;&#x442; &#x43C;&#x43E;&#x438; 10 &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D; &#x43F;&#x43E;&#x441;&#x435;&#x442;&#x438;&#x442;&#x44C; <a href="http://frontendconf.ru/moscow/2025?utm_source=publish&amp;utm_medium=cpa&amp;utm_content=amb&amp;utm_campaign=front_end_dev">Frontend Conf 2025</a>. &#x41F;&#x43E;&#x435;&#x445;&#x430;&#x43B;&#x438;! (&#x41A;&#x441;&#x442;&#x430;&#x442;&#x438;, &#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x43F;&#x440;&#x43E;&#x43C;&#x43E;&#x43A;&#x43E;&#x434; &#x43D;&#x430; 5% &#x1F60A;)</p><h2 id="1-%D0%BF%D0%BE%D0%B3%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%82%D1%80%D0%B5%D0%BD%D0%B4%D1%8B">1. &#x41F;&#x43E;&#x433;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x442;&#x440;&#x435;&#x43D;&#x434;&#x44B;</h2><p>&#x41E;&#x440;&#x433;&#x430;&#x43D;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x44B; &#x43A;&#x43E;&#x43D;&#x444;&#x435;&#x440;&#x435;&#x43D;&#x446;&#x438;&#x438; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x43B;&#x438; &#x43F;&#x43E;&#x432;&#x435;&#x441;&#x442;&#x43A;&#x443; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x431;&#x43E;&#x43B;&#x435;&#x435; 300 &#x44D;&#x43A;&#x441;&#x43F;&#x435;&#x440;&#x442;&#x43E;&#x432;. &#x422;&#x435;&#x43C;&#x44B; &#x2014; &#x43D;&#x435; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x44B;&#x435; &#x434;&#x43E;&#x433;&#x430;&#x434;&#x43A;&#x438;, &#x430; &#x43E;&#x442;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x435;&#x439; &#x438;&#x43D;&#x434;&#x443;&#x441;&#x442;&#x440;&#x438;&#x438;. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x443;&#x441;&#x442;&#x430;&#x440;&#x435;&#x432;&#x448;&#x438;&#x445; &#x438; &#x437;&#x430;&#x435;&#x437;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43A;&#x43E;&#x447;&#x443;&#x44E;&#x442; &#x438;&#x437; &#x43E;&#x434;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x44B; &#x432; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x443;&#x448;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x435;&#x43D;&#x438;&#x435; AI, PWA, &#x43C;&#x438;&#x43A;&#x440;&#x43E;&#x444;&#x440;&#x43E;&#x43D;&#x442;&#x43E;&#x432; &#x438; &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x442;&#x442;&#x435;&#x440;&#x43D;&#x43E;&#x432;. &#x412;&#x441;&#x435; &#x434;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x44B; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x44B; &#x43D;&#x430; &#x431;&#x43E;&#x43B;&#x438; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&#x43D;&#x438;&#x439;, &#x433;&#x434;&#x435; &#x441;&#x43F;&#x438;&#x43A;&#x435;&#x440;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x43F;&#x440;&#x43E; &#x441;&#x432;&#x43E;&#x439; &#x43E;&#x43F;&#x44B;&#x442;, &#x43F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x43A;&#x430;&#x43C;&#x43D;&#x438; &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x440;&#x43E;&#x43C;&#x438;&#x441;&#x441;&#x44B; &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x43D;&#x438; &#x43F;&#x43E;&#x448;&#x43B;&#x438; &#x43F;&#x440;&#x438; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x435;&#x43D;&#x438;&#x438; &#x442;&#x43E;&#x433;&#x43E; &#x438;&#x43B;&#x438; &#x438;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F;. &#x41F;&#x43B;&#x44E;&#x441;&#x43E;&#x43C;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x441;&#x440;&#x435;&#x437; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x439; &#x43D;&#x430; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;, &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x44C; &#x442;&#x440;&#x435;&#x43D;&#x434; &#x438; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x44E; &#x434;&#x43E;&#x440;&#x43E;&#x436;&#x43D;&#x443;&#x44E; &#x43A;&#x430;&#x440;&#x442;&#x443; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44F; &#x432; &#x43F;&#x43B;&#x430;&#x43D;&#x435; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x439;.</p><hr><h2 id="2-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0-%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE-%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8">2. &#x41F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x430; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x435;&#x43E;&#x440;&#x438;&#x438;</h2><p>&#x41F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43A;&#x435;&#x439;&#x441;&#x430;&#x445; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x439;. &#x421;&#x43F;&#x438;&#x43A;&#x435;&#x440;&#x44B; &#x434;&#x435;&#x43B;&#x44F;&#x442;&#x441;&#x44F; &#x43E;&#x43F;&#x44B;&#x442;&#x43E;&#x43C;: &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x440;&#x435;&#x448;&#x430;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B;, &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x441;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43B;&#x43E;, &#x430; &#x447;&#x442;&#x43E; &#x43D;&#x435;&#x442;. &#x42D;&#x442;&#x43E; &#x44D;&#x43A;&#x43E;&#x43D;&#x43E;&#x43C;&#x438;&#x442; &#x432;&#x430;&#x448;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x441;&#x440;&#x430;&#x437;&#x443; &#x434;&#x435;&#x441;&#x44F;&#x442;&#x43A;&#x43E;&#x432; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443;&#x436;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435;, &#x43B;&#x438;&#x431;&#x43E; &#x434;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x434; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x434;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x441;&#x432;&#x43E;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x437;&#x43D;&#x430;&#x44F; &#x435;&#x433;&#x43E; &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43A;&#x438;. &#x41A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x434;&#x43E;&#x43A;&#x43B;&#x430;&#x434; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43A;&#x43B;&#x430;&#x434;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x44B; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x430; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;&#x445;.</p><hr><h2 id="3-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%BA%D0%B0%D0%BA-%D0%B4%D0%B2%D0%B8%D0%B6%D1%83%D1%89%D0%B0%D1%8F-%D1%81%D0%B8%D0%BB%D0%B0-%D1%80%D0%BE%D1%81%D1%82%D0%B0">3. &#x410;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x430; &#x43A;&#x430;&#x43A; &#x434;&#x432;&#x438;&#x436;&#x443;&#x449;&#x430;&#x44F; &#x441;&#x438;&#x43B;&#x430; &#x440;&#x43E;&#x441;&#x442;&#x430;</h2><p>&#x412; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x435; &#x2014; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434; &#x43E;&#x442; &#x43C;&#x43E;&#x43D;&#x43E;&#x43B;&#x438;&#x442;&#x43E;&#x432; &#x43A; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430;&#x43C; &#x438; &#x43C;&#x438;&#x43A;&#x440;&#x43E;&#x444;&#x440;&#x43E;&#x43D;&#x442;&#x430;&#x43C; (&#x434;&#x430;, &#x44D;&#x442;&#x43E; &#x442;&#x440;&#x435;&#x43D;&#x434; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; 5 &#x43B;&#x435;&#x442;, &#x442;&#x443;&#x442; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E;). &#x41D;&#x430; &#x434;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x430;&#x445; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x433;&#x438;&#x431;&#x43A;&#x443;&#x44E; &#x438; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x443;. &#x41E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; DDD, Module Federation, &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x44B; &#x43A; &#x438;&#x43D;&#x442;&#x435;&#x433;&#x440;&#x430;&#x446;&#x438;&#x438; &#x438; &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x438;&#x432;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x443;&#x43B;&#x44C;&#x442;&#x443;&#x440;&#x443; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x445; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A; &#x438; &#x43F;&#x430;&#x442;&#x442;&#x435;&#x440;&#x43D;&#x43E;&#x432; &#x432; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x435;, &#x432;&#x435;&#x434;&#x44C; &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x430; &#x2014; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43A;&#x43E;&#x434;. &#x41F;&#x43B;&#x44E;&#x441;&#x43E;&#x43C; &#x443;&#x447;&#x430;&#x441;&#x442;&#x43D;&#x438;&#x43A;&#x438; &#x441;&#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x44B; &#x431;&#x435;&#x437; &#x445;&#x430;&#x43E;&#x441;&#x430; &#x438; &#x43A;&#x430;&#x43A; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x44B;&#x43C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x44D;&#x442;&#x430;&#x43F;&#x430;&#x445; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;. </p><hr><h2 id="4-%D0%B8%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%B8%D0%BD%D1%82%D0%B5%D0%BB%D0%BB%D0%B5%D0%BA%D1%82-%D0%B2-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5-%D1%84%D1%80%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D0%B4%D0%B0">4. &#x418;&#x441;&#x43A;&#x443;&#x441;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x43B;&#x43B;&#x435;&#x43A;&#x442; &#x432; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x444;&#x440;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x434;&#x430;</h2><p>&#x418;&#x418; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x430;&#x451;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x201C;&#x438;&#x433;&#x440;&#x443;&#x448;&#x43A;&#x43E;&#x439;&#x201D; &#x438; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x440;&#x430;&#x431;&#x43E;&#x447;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430;. &#x41C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x438;&#x43C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x43D;&#x438;&#x43A;&#x43E;&#x43C; &#x43F;&#x440;&#x438; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435; &#x438; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x435;&#x439;&#x441;&#x430;&#x445;, &#x430; &#x435;&#x433;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43D;&#x430;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x448;&#x438;&#x440;&#x435;. &#x41D;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x435;&#x440;&#x435;&#x43D;&#x446;&#x438;&#x438; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443;&#x442;, &#x43A;&#x430;&#x43A; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; LLM &#x438; AI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B; &#x432; &#x43F;&#x430;&#x439;&#x43F;&#x43B;&#x430;&#x439;&#x43D;&#x435; &#x444;&#x440;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x434;&#x430;. &#x418;&#x418; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x44F; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x432; &#x441;&#x435;&#x431;&#x44F; &#x442;&#x435;&#x43C;&#x44B; &#x43F;&#x43E; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x440;&#x438;&#x441;&#x43A;&#x430;&#x43C; &#x438; &#x437;&#x430;&#x449;&#x438;&#x442;&#x435; &#x43E;&#x442; &#x443;&#x44F;&#x437;&#x432;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x435;&#x439;. &#x422;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x438; &#x2014; &#x43E;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43A;&#x43E;&#x434;&#x430; &#x434;&#x43E; &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x430; UX: &#x432;&#x44B; &#x43F;&#x43E;&#x439;&#x43C;&#x451;&#x442;&#x435;, &#x43A;&#x430;&#x43A; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x438;&#x442;&#x44C; AI &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D; &#x43F;&#x440;&#x438;&#x43D;&#x43E;&#x441;&#x438;&#x43B; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;, &#x430; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B;.</p><hr><h2 id="5-pwa-%D0%B8-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82">5. PWA &#x438; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x43F;&#x44B;&#x442;</h2><p>&#x41E;&#x441;&#x43E;&#x431;&#x43E;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x443;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x435;&#x441;&#x441;&#x438;&#x432;&#x43D;&#x44B;&#x43C; &#x432;&#x435;&#x431;-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x43C;. &#x41C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&#x43D;&#x438;&#x438; &#x438;&#x437; &#x437;&#x430; &#x441;&#x430;&#x43D;&#x43A;&#x446;&#x438;&#x439; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x438; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x438; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B; &#x432; &#x432;&#x435;&#x431; &#x438; &#x442;&#x443;&#x442; &#x437;&#x430; &#x43F;&#x430;&#x440;&#x443; &#x43B;&#x435;&#x442; &#x43D;&#x430;&#x43A;&#x43E;&#x43F;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x43F;&#x44B;&#x442;&#x430; &#x438; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x43F;&#x43E;&#x441;&#x43B;&#x443;&#x448;&#x430;&#x442;&#x44C;. &#x412;&#x44B; &#x443;&#x437;&#x43D;&#x430;&#x435;&#x442;&#x435;, &#x43A;&#x430;&#x43A; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;, offline-&#x440;&#x435;&#x436;&#x438;&#x43C;&#x44B; &#x438; lazy-loading, &#x431;&#x443;&#x434;&#x443;&#x442; &#x43A;&#x435;&#x439;&#x441;&#x44B; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x435;&#x43D;&#x438;&#x44F; PWA &#x432; &#x431;&#x430;&#x43D;&#x43A;&#x430;&#x445; &#x438; &#x43A;&#x440;&#x443;&#x43F;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x430;&#x445;. &#x42D;&#x442;&#x43E; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x439; &#x448;&#x430;&#x43D;&#x441; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x435;&#x431;-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x441; UX &#x443;&#x440;&#x43E;&#x432;&#x43D;&#x44F; &#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x445;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43A;&#x430;&#x43A; &#x443;&#x441;&#x43A;&#x43E;&#x440;&#x438;&#x442;&#x44C; &#x440;&#x435;&#x43B;&#x438;&#x437;&#x44B; &#x438; &#x43E;&#x431;&#x43E;&#x439;&#x442;&#x438; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; App Store.</p><hr><h2 id="6-%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B-%D0%B8-%D1%80%D0%BE%D1%81%D1%82-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2">6. &#x41A;&#x443;&#x43B;&#x44C;&#x442;&#x443;&#x440;&#x430;, &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x44B; &#x438; &#x440;&#x43E;&#x441;&#x442; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;</h2><p>Frontend Conf &#x2014; &#x43D;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x440;&#x43E; &#x43A;&#x43E;&#x434;, &#x43D;&#x43E; &#x438; &#x43F;&#x440;&#x43E; &#x43B;&#x44E;&#x434;&#x435;&#x439;. &#x412; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x442;&#x440;&#x435;&#x43A;&#x438; &#x43F;&#x440;&#x43E; &#x43A;&#x430;&#x440;&#x44C;&#x435;&#x440;&#x443;, &#x441;&#x43E;&#x444;&#x442;-&#x441;&#x43A;&#x438;&#x43B;&#x43B;&#x44B; &#x438; &#x43B;&#x438;&#x434;&#x435;&#x440;&#x441;&#x442;&#x432;&#x43E;, &#x440;&#x430;&#x437;&#x431;&#x438;&#x440;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43A;&#x435;&#x439;&#x441;&#x44B; &#x440;&#x43E;&#x441;&#x442;&#x430; &#x43E;&#x442; &#x43C;&#x438;&#x434;&#x43B;&#x430; &#x434;&#x43E; &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x430;, &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x433;&#x438;&#x43B;&#x44C;&#x434;&#x438;&#x438; &#x438; &#x440;&#x430;&#x437;&#x432;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x443;&#x43B;&#x44C;&#x442;&#x443;&#x440;&#x443; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;.<br>&#x42D;&#x442;&#x43E; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x43D;&#x430;&#x432;&#x44B;&#x43A;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x44B; &#x434;&#x43B;&#x44F; &#x442;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x438; &#x43A;&#x430;&#x440;&#x44C;&#x435;&#x440;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x43E;&#x441;&#x442;&#x430;.</p><hr><h2 id="7-%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C-%D1%8D%D0%BA%D1%81%D0%BF%D0%B5%D1%80%D1%82%D0%B0%D0%BC-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B">7. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x437;&#x430;&#x434;&#x430;&#x442;&#x44C; &#x44D;&#x43A;&#x441;&#x43F;&#x435;&#x440;&#x442;&#x430;&#x43C; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x44B;</h2><p>&#x41E;&#x43E;&#x43E;&#x43E;, &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x44F; &#x43B;&#x44E;&#x431;&#x438;&#x43C;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C;. &#x414;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x44B; &#x2014; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x43E;: &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x441;&#x442;&#x443;&#x43F;&#x43B;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43E;&#x431;&#x449;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x438;&#x43B;&#x438; &#x436;&#x435; &#x432;&#x437;&#x44F;&#x442;&#x44C; &#x43C;&#x438;&#x43A;&#x440;&#x43E;&#x444;&#x43E;&#x43D; &#x43D;&#x430; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x438; Q&amp;A. &#x423; &#x43C;&#x435;&#x43D;&#x44F; &#x43A;&#x430;&#x43A; &#x443; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x445;&#x43E;&#x447;&#x435;&#x442; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x438;&#x434;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;, &#x43D;&#x43E; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x43A;, &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x432; &#x43A;&#x430;&#x440;&#x43C;&#x430;&#x43D;&#x435; &#x434;&#x435;&#x441;&#x44F;&#x442;&#x43E;&#x43A; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x438; &#x44D;&#x442;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435;&#x435; &#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x433;&#x434;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x445; &#x437;&#x430;&#x434;&#x430;&#x442;&#x44C;.<br>&#x412;&#x44B; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x442;&#x44C; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438;, &#x437;&#x430;&#x434;&#x430;&#x442;&#x44C; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x43F;&#x43E; &#x441;&#x432;&#x43E;&#x435;&#x43C;&#x443; &#x43A;&#x435;&#x439;&#x441;&#x443;, &#x432;&#x435;&#x434;&#x44C; &#x436;&#x438;&#x432;&#x43E;&#x439; &#x434;&#x438;&#x430;&#x43B;&#x43E;&#x433; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x434;&#x430;&#x451;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x446;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x447;&#x435;&#x43C; &#x441;&#x430;&#x43C;&#x430; &#x43F;&#x440;&#x435;&#x437;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x44F;. &#x421;&#x430;&#x43C;&#x438; &#x441;&#x43F;&#x438;&#x43A;&#x435;&#x440;&#x44B; &#x43E;&#x445;&#x43E;&#x442;&#x43D;&#x43E; &#x434;&#x435;&#x43B;&#x44F;&#x442;&#x441;&#x44F; &#x43E;&#x43F;&#x44B;&#x442;&#x43E;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43D;&#x435; &#x43F;&#x43E;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442; &#x432; &#x441;&#x43B;&#x430;&#x439;&#x434;&#x44B;. &#x42D;&#x442;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x440;&#x435;&#x448;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x447;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; &#x437;&#x430; &#x43C;&#x438;&#x43D;&#x443;&#x442;&#x44B;.</p><hr><h2 id="8-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC-%D0%B8-%D1%81%D0%BF%D0%BE%D0%BD%D1%81%D0%BE%D1%80%D0%B0%D0%BC">8. &#x414;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C; &#x438; &#x441;&#x43F;&#x43E;&#x43D;&#x441;&#x43E;&#x440;&#x430;&#x43C;</h2><p>&#x41D;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x435;&#x440;&#x435;&#x43D;&#x446;&#x438;&#x438; &#x431;&#x443;&#x434;&#x443;&#x442; &#x441;&#x442;&#x435;&#x43D;&#x434;&#x44B; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&#x43D;&#x438;&#x439; &#x441; &#x434;&#x435;&#x43C;&#x43E; &#x438; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C;&#x438;.<br>&#x412;&#x44B; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x442;&#x435;&#x441;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x44B;&#x435; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B; &#x438; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438;.<br>&#x427;&#x430;&#x441;&#x442;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x435;&#x449;&#x451; &#x43D;&#x435; &#x432;&#x44B;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43E; &#x432; &#x43F;&#x430;&#x431;&#x43B;&#x438;&#x43A;.<br>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x430;&#x43A;&#x442;&#x44B; &#x438; &#x434;&#x43E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43E; &#x43F;&#x438;&#x43B;&#x43E;&#x442;&#x430;&#x445;.<br>&#x42D;&#x442;&#x43E; &#x448;&#x430;&#x43D;&#x441; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;&#x43C; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x435;&#x435; &#x43A;&#x43E;&#x43D;&#x43A;&#x443;&#x440;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</p><hr><h2 id="9-%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BF%D1%80%D0%BE%D1%8F%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B5%D0%B1%D1%8F-%D0%B8-%D0%BF%D0%BE%D0%BD%D0%B5%D1%82%D0%B2%D0%BE%D1%80%D0%BA%D0%B0%D1%82%D1%8C">9. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x44F;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x431;&#x44F; &#x438; &#x43F;&#x43E;&#x43D;&#x435;&#x442;&#x432;&#x43E;&#x440;&#x43A;&#x430;&#x442;&#x44C;</h2><p>Frontend Conf &#x2014; &#x43F;&#x43B;&#x43E;&#x449;&#x430;&#x434;&#x43A;&#x430;, &#x433;&#x434;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x441;&#x442;&#x443;&#x43F;&#x438;&#x442;&#x44C; &#x438;&#x43B;&#x438; &#x437;&#x430;&#x44F;&#x432;&#x438;&#x442;&#x44C; &#x43E; &#x441;&#x435;&#x431;&#x435;.<br>&#x414;&#x430;&#x436;&#x435; &#x43A;&#x430;&#x43A; &#x441;&#x43B;&#x443;&#x448;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x432;&#x44B; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x435;&#x441;&#x44C; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x441;&#x442;&#x432;&#x430; &#x2013; &#x432; &#x43F;&#x435;&#x440;&#x435;&#x440;&#x44B;&#x432;&#x435; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x434;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x430;&#x43C;&#x438; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x43A;&#x430;&#x448;&#x43B;&#x44F;&#x442;&#x44C; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x43A;&#x438;, &#x43E;&#x431;&#x441;&#x443;&#x434;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x44B; &#x438; &#x441;&#x43F;&#x438;&#x43A;&#x435;&#x440;&#x43E;&#x432; &#x441; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x433;&#x430;&#x43C;&#x438;. &#x41F;&#x43B;&#x44E;&#x441; &#x43D;&#x435;&#x442;&#x432;&#x43E;&#x440;&#x43A;&#x438;&#x43D;&#x433; &#x43F;&#x43E;&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x442;&#x435;&#x43C;, &#x43A;&#x442;&#x43E; &#x442;&#x43E;&#x43F;&#x438;&#x442; &#x437;&#x430; &#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x431;&#x440;&#x435;&#x43D;&#x434; &#x438;&#x43B;&#x438; &#x438;&#x449;&#x435;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x44B;.</p><hr><h2 id="10-%D0%B8%D0%BD%D0%B2%D0%B5%D1%81%D1%82%D0%B8%D1%86%D0%B8%D1%8F-%D0%B2-%D1%81%D0%B5%D0%B1%D1%8F">10. &#x418;&#x43D;&#x432;&#x435;&#x441;&#x442;&#x438;&#x446;&#x438;&#x44F; &#x432; &#x441;&#x435;&#x431;&#x44F;</h2><p>&#x41F;&#x43E;&#x435;&#x437;&#x434;&#x43A;&#x430; &#x43D;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x435;&#x440;&#x435;&#x43D;&#x446;&#x438;&#x44E; &#x2014; &#x44D;&#x442;&#x43E; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43E;&#x43A;&#x443;&#x43F;&#x430;&#x435;&#x442;&#x441;&#x44F;. &#x414;&#x430;&#x436;&#x435; 1&#x2013;2 &#x438;&#x434;&#x435;&#x438;, &#x432;&#x43D;&#x435;&#x434;&#x440;&#x451;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;, &#x43E;&#x43F;&#x440;&#x430;&#x432;&#x434;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x443;&#x447;&#x430;&#x441;&#x442;&#x438;&#x435; (&#x434;&#x430; &#x438; &#x442;&#x432;&#x43E;&#x439; &#x43C;&#x435;&#x43D;&#x435;&#x434;&#x436;&#x435;&#x440; &#x432;&#x438;&#x434;&#x438;&#x442;, &#x447;&#x442;&#x43E; &#x442;&#x44B; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43F;&#x438;&#x432;&#x43E; &#x43F;&#x43E;&#x43F;&#x438;&#x442;&#x44C; &#x441;&#x43A;&#x430;&#x442;&#x430;&#x43B;&#x441;&#x44F; &#x43D;&#x430; &#x43A;&#x43E;&#x43D;&#x444;&#x443;).<br>&#x412;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x437;&#x43D;&#x430;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x441;&#x430;&#x43C;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x432; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A; &#x438; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x43E;&#x432; &#x438; &#x43D;&#x435; &#x432;&#x441;&#x435; &#x43E;&#x43D;&#x438; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; (&#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x43E;&#x442; &#x436;&#x435; medium). &#x41A; &#x442;&#x43E;&#x43C;&#x443; &#x436;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x435;&#x434;&#x438;&#x43D;&#x43E;&#x43C;&#x44B;&#x448;&#x43B;&#x435;&#x43D;&#x43D;&#x438;&#x43A;&#x43E;&#x432; &#x43C;&#x43E;&#x442;&#x438;&#x432;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x44B;&#x435; &#x441;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x438;&#x44F;, &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x435;&#x442;-&#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442; &#x441;&#x442;&#x430;&#x440;&#x442;&#x430;&#x43D;&#x435;&#x442;&#x435; &#x441; AI, &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x43B;&#x43E;&#x433; &#x437;&#x430;&#x432;&#x435;&#x434;&#x435;&#x442;&#x435;. Frontend Conf &#x2014; &#x44D;&#x442;&#x43E; &#x437;&#x430;&#x440;&#x44F;&#x434; &#x44D;&#x43D;&#x435;&#x440;&#x433;&#x438;&#x438; &#x438; &#x43F;&#x43B;&#x430;&#x43D; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x439; &#x43D;&#x430; &#x433;&#x43E;&#x434; &#x432;&#x43F;&#x435;&#x440;&#x451;&#x434;.</p><hr><p><a href="http://frontendconf.ru/moscow/2025?utm_source=publish&amp;utm_medium=cpa&amp;utm_content=amb&amp;utm_campaign=front_end_dev">Frontend Conf 2025</a> &#x2014; &#x44D;&#x442;&#x43E; &#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x433;&#x434;&#x435; &#x432;&#x441;&#x442;&#x440;&#x435;&#x447;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x442;&#x440;&#x435;&#x43D;&#x434;&#x44B;, &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x430; &#x438; &#x43F;&#x440;&#x43E;&#x444;&#x435;&#x441;&#x441;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x44B;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x440;&#x430;&#x441;&#x442;&#x438;, &#x432;&#x43D;&#x435;&#x434;&#x440;&#x44F;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x43E;&#x435; &#x438; &#x431;&#x44B;&#x442;&#x44C; &#x432; &#x447;&#x438;&#x441;&#x43B;&#x435; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x445; &#x2014; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x435; &#x43A;&#x43E;&#x43D;&#x444;&#x443;! &#x1F680;<br><br>&#x410; &#x43F;&#x43E; &#x43F;&#x440;&#x43E;&#x43C;&#x43E;&#x43A;&#x43E;&#x434;&#x443; <strong>fc25_front_end_dev </strong>&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442;<strong> &#x441;&#x43A;&#x438;&#x434;&#x43A;&#x430; 5%</strong></p>]]></content:encoded></item><item><title><![CDATA[Используем старый смартфон для мониторинга доступности мобильного интернета]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;! &#x412; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x43E;&#x431;&#x43B;&#x430;&#x441;&#x442;&#x438;, &#x43A;&#x430;&#x43A; &#x438; &#x432;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445;, &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x43B;&#x433;</p>]]></description><link>https://jem-space.ru/old-smartphone-as-sensor/</link><guid isPermaLink="false">68c43f75a00f10000130c992</guid><category><![CDATA[web]]></category><category><![CDATA[mobile]]></category><category><![CDATA[nodejs]]></category><category><![CDATA[smartphone]]></category><category><![CDATA[termux]]></category><category><![CDATA[telegram]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Sun, 14 Sep 2025 13:10:33 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/09/--------------2025-09-14---17.05.52-min.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/09/--------------2025-09-14---17.05.52-min.png" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x434;&#x43B;&#x44F; &#x43C;&#x43E;&#x43D;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x43D;&#x433;&#x430; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;&#x430;"><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;! &#x412; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x43E;&#x431;&#x43B;&#x430;&#x441;&#x442;&#x438;, &#x43A;&#x430;&#x43A; &#x438; &#x432;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445;, &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x43B;&#x433;&#x43E;&#x434;&#x430; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; &#x441; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;&#x43E;&#x43C;. &#x418; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x438;&#x432;&#x430;&#x435;&#x448;&#x44C; &#x438;&#x445;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x438;&#x448;&#x44C; &#x438;&#x437; &#x434;&#x43E;&#x43C;&#x430;, &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44F;&#x441;&#x44C; &#x43E;&#x442; &#x434;&#x43E;&#x43C;&#x430;&#x448;&#x43D;&#x435;&#x433;&#x43E; wi-fi. &#x41F;&#x43E;&#x43A;&#x430; &#x441;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x44E; &#x440;&#x435;&#x431;&#x435;&#x43D;&#x43A;&#x430; &#x443;&#x442;&#x440;&#x43E;&#x43C;, &#x43D;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x432;&#x430;&#x44E; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x44C; &#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;, &#x430; &#x43E;&#x43D; &#x43D;&#x443;&#x436;&#x435;&#x43D;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x431;&#x435;&#x43D;&#x43A;&#x430; &#x43F;&#x43E;&#x434;&#x43A;&#x430;&#x441;&#x442; &#x43F;&#x43E; &#x434;&#x43E;&#x440;&#x43E;&#x433;&#x435; &#x432; &#x441;&#x430;&#x434;. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x431;&#x435;&#x441;&#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x44B; &#x43C;&#x43E;&#x43D;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x43B; &#x438; &#x43F;&#x440;&#x438;&#x441;&#x44B;&#x43B;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441; &#x432; Telegram &#x441; &#x443;&#x442;&#x440;&#x430;.</p><!--kg-card-begin: markdown--><h2 id="%D0%BA%D0%B0%D0%BA-%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%82%D1%8C-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8-%D1%81%D0%B5%D1%82%D0%B8-%D0%B2-%D1%80%D0%B5%D0%B3%D0%B8%D0%BE%D0%BD%D0%B5">&#x41A;&#x430;&#x43A; &#x43C;&#x43E;&#x43D;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x438; &#x441;&#x435;&#x442;&#x438; &#x432; &#x440;&#x435;&#x433;&#x438;&#x43E;&#x43D;&#x435;</h2>
<!--kg-card-end: markdown--><p>&#x42F; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x435; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x43F;&#x430;&#x440;&#x441;&#x438;&#x442;&#x44C;, &#x438; &#x43E;&#x43D;&#x438; &#x432;&#x441;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x44E;&#x442; &#x43F;&#x43E; &#x43F;&#x440;&#x438;&#x43D;&#x446;&#x438;&#x43F;&#x443; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432;. &#x422;.&#x435;. &#x441;&#x43A;&#x43E;&#x440;&#x435;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x441; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43C;&#x438; &#x437;&#x430;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x430;&#x43C;&#x438;, &#x434;&#x430; &#x438; &#x43D;&#x435; &#x441;&#x43E;&#x432;&#x441;&#x435;&#x43C; &#x442;&#x43E;&#x447;&#x43D;&#x43E;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x438; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x436;&#x430;&#x43B;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x430;&#x43C; (&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x443; &#x43A;&#x43E;&#x433;&#x43E;-&#x442;&#x43E; &#x434;&#x435;&#x43D;&#x44C;&#x433;&#x438; &#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x442;&#x430;&#x440;&#x438;&#x444;&#x435;, &#x438;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x441;&#x431;&#x43E;&#x438;). &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x43E;&#x442;&#x44B;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x441;&#x442;&#x430;&#x440;&#x435;&#x43D;&#x44C;&#x43A;&#x438;&#x439; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x44B; &#x441;&#x43B;&#x443;&#x436;&#x438;&#x43B; &#x434;&#x430;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x43C; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x441;&#x435;&#x442;&#x438; (&#x431;&#x43B;&#x430;&#x433;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x438;&#x43C;&#x43A;&#x430;).</p><p>&#x427;&#x442;&#x43E; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435;?</p><p>&#x41F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x438;&#x434;&#x435;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43A;&#x430;&#x43A;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x43D;&#x430; &#x43D;&#x435;&#x43C;, &#x43D;&#x43E; &#x435;&#x434;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430; &#x2013; &#x43A;&#x430;&#x43A; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x435; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x441;&#x435;&#x442;&#x438;. &#x422;.&#x43A;. &#x44F; &#x43F;&#x438;&#x448;&#x443; &#x43D;&#x430; NodeJS, &#x442;&#x43E; &#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x43D;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x439; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x442;&#x44C; &#x43D;&#x430; wifi (&#x43D;&#x443; &#x438;&#x43B;&#x438; &#x44F; &#x43E; &#x43D;&#x435;&#x439; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x44E;, &#x43D;&#x43E; &#x432;&#x441;&#x435; &#x440;&#x430;&#x432;&#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x441;&#x442;&#x430;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435;). &#x421; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C;&#x438; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x43C;&#x438; (&#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x439; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43F;&#x43E;&#x434; &#x430;&#x43D;&#x434;&#x440;&#x43E;&#x438;&#x434;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;) &#x437;&#x430;&#x43C;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435; &#x445;&#x43E;&#x447;&#x443; &#x434;&#x430;&#x436;&#x435; &#x441; &#x447;&#x430;&#x442;&#x43E;&#x43C; &#x433;&#x43E;&#x43F;&#x43E;&#x442;&#x44B;.</p><p>&#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x43B;&#x430; &#x432;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x438;&#x434;&#x435;&#x44F; &#x2013; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x441; &#x442;&#x435;&#x43B;&#x435;&#x444;&#x43E;&#x43D;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; 1 &#x440;&#x430;&#x437; &#x432; &#x43C;&#x438;&#x43D;&#x443;&#x442;&#x443;, &#x438; &#x435;&#x441;&#x43B;&#x438; &#x434;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x43D;&#x435; &#x434;&#x43E;&#x448;&#x435;&#x43B; &#x43D;&#x438; &#x43E;&#x434;&#x438;&#x43D; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x432; &#x442;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; 5 &#x43C;&#x438;&#x43D;&#x443;&#x442;, &#x442;&#x43E;, &#x432;&#x438;&#x434;&#x438;&#x43C;&#x43E;, &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x43F;&#x43E;&#x442;&#x435;&#x440;&#x44F;&#x43B; &#x441;&#x43E;&#x435;&#x434;&#x438;&#x43D;&#x435;&#x43D;&#x438;&#x435;, &#x438; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442; (&#x443; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x430;) &#x43E;&#x442;&#x432;&#x430;&#x43B;&#x438;&#x43B;&#x441;&#x44F;. </p><h2 id="%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C-%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD-%D0%B2-%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D1%83-%D0%B4%D0%BB%D1%8F-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BE%D0%B4%D0%B0">&#x41A;&#x430;&#x43A; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x432; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x443; &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x434;&#x430;?</h2><p>&#x415;&#x441;&#x442;&#x44C; &#x437;&#x430;&#x43C;&#x435;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; Androind &#x2013; Termux, &#x438; &#x435;&#x433;&#x43E; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;. &#x41F;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x443; Termux &#x2013; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;-&#x44D;&#x43C;&#x443;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x442;&#x435;&#x440;&#x43C;&#x438;&#x43D;&#x430;&#x43B;&#x430; Linux &#x434;&#x43B;&#x44F; Android, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x446;&#x435;&#x43D;&#x43D;&#x443;&#x44E; Linux-&#x441;&#x440;&#x435;&#x434;&#x443; &#x43D;&#x430; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435; &#x438;&#x43B;&#x438; &#x43F;&#x43B;&#x430;&#x43D;&#x448;&#x435;&#x442;&#x435; &#x431;&#x435;&#x437; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; root-&#x43F;&#x440;&#x430;&#x432;. &#x41E;&#x43D;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C; &#x438;&#x437; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x44F; Linux &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x43D;&#x435;&#x434;&#x436;&#x435;&#x440;&#x430; <code>pkg</code>, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43D;&#x443;&#x44E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;. &#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x430;&#x436;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; nodejs &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x43D;&#x430; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;. &#x41D;&#x430;&#x43C; &#x436;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; sh &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; curl &#x431;&#x443;&#x434;&#x435;&#x442; &#x432; &#x431;&#x435;&#x441;&#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x43C; &#x446;&#x438;&#x43A;&#x43B;&#x435; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x43D;&#x430; &#x43D;&#x430;&#x448; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;.</p><p>&#x417;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; termux &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x43C; curl</p><p><code>pkg install curl cronie -y</code></p><p>&#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43D;&#x430;&#x448; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442; (&#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x430; nano): <code>nano heartbeat.sh</code></p><pre><code class="language-bash">#!/data/data/com.termux/files/usr/bin/bash

while true
	do
		curl -H &quot;Authorization: Bearer your_auth_secret&quot; http://YOUR_VPS_DOMAIN/heartbeat
    sleep 60
done</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43E;&#x43A; &#x430;&#x443;&#x442;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x430;&#x431;&#x44B; &#x43A;&#x442;&#x43E; &#x43D;&#x435; &#x43C;&#x43E;&#x433; &#x441;&#x43B;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x43D;&#x430; &#x43D;&#x430;&#x448; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; <code>Authorization: Bearer your_auth_secret</code></p><p>&#x421;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C;&#x44B;&#x43C;: <code>chmode +x heartbeat.sh</code></p><p>&#x41F;&#x435;&#x440;&#x435;&#x434; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x43E;&#x43C; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; <code>termux-wake-lock</code> (&#x44D;&#x442;&#x43E; &#x43F;&#x43E;&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x435; &#x433;&#x430;&#x441;&#x438;&#x442;&#x44C; &#x432;&#x430;&#x448;&#x443; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44E; termux &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x438; &#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x430;).</p><p>&#x421;&#x442;&#x430;&#x440;&#x442;&#x443;&#x435;&#x43C; <code>./heartbeat.sh</code></p><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x433;&#x430;&#x441;&#x438;&#x442;&#x44C; &#x44D;&#x43A;&#x440;&#x430;&#x43D;. &#x421;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;, &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x44D;&#x43A;&#x43E;&#x43D;&#x43E;&#x43C;&#x438;&#x442;&#x44C; &#x431;&#x430;&#x442;&#x430;&#x440;&#x435;&#x44E;, &#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x440;&#x435;&#x436;&#x435;, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x441; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x43A;&#x440;&#x438;&#x442;&#x438;&#x447;&#x43D;&#x43E; (&#x434;&#x430; &#x438; termux-wake-lock &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x43E;&#x43C;&#x43E;&#x447;&#x44C;) .</p><h2 id="%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%B1%D0%BE%D1%82%D0%B0">&#x414;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x431;&#x43E;&#x442;&#x430;</h2><p>&#x41F;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x43B; &#x431;&#x435;&#x437;&#x434;&#x443;&#x448;&#x43D;&#x443;&#x44E; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x443; &#x43D;&#x430;&#x43A;&#x438;&#x434;&#x430;&#x442;&#x44C; &#x43C;&#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x435;&#x43A;&#x435; NodeJS: telegraf + express + JSON &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;. &#x41F;&#x43E;&#x434;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;, &#x438; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x442;&#x430;&#x43A;&#x430;&#x44F;. <br><br>&#x421;&#x442;&#x430;&#x440;&#x442;&#x443;&#x435;&#x442; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43E;&#x442; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x430;. &#x421;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x435;&#x43C; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x448;&#x435;&#x434;&#x448;&#x435;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x438;&#x441;&#x442;&#x438;&#x43A;&#x438;. &#x415;&#x441;&#x43B;&#x438; &#x432; &#x442;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; 5 &#x43C;&#x438;&#x43D;&#x443;&#x442; &#x43D;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;, &#x43F;&#x440;&#x43E;&#x43F;&#x430;&#x43B; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;.<br>&#x41F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x440;&#x438; &#x441;&#x442;&#x430;&#x440;&#x442;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x435;&#x436;&#x435;&#x434;&#x43D;&#x435;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x44F;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x440;&#x43E;&#x441;&#x43D;&#x443;&#x432;&#x448;&#x438;&#x441;&#x44C;, &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441; &#x441;&#x435;&#x442;&#x438;. &#x412; &#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x435;&#x43C;&#x443; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;&#x43E;&#x43C;. &#x41B;&#x438;&#x431;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x443;&#x43A;&#x430;&#x43C;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;, &#x432;&#x44B;&#x437;&#x432;&#x430;&#x432; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; /status.<br>&#x41F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x431;&#x43E;&#x442;&#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; &#x441;&#x43C;&#x435;&#x43D;&#x443; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;&#x430; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439; /setstatuschange. &#x41D;&#x43E; &#x44D;&#x442;&#x43E;, &#x43D;&#x430;&#x432;&#x435;&#x440;&#x43D;&#x43E;, &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x434;&#x43B;&#x44F; &#x434;&#x435;&#x431;&#x430;&#x433;&#x430;, &#x43B;&#x438;&#x431;&#x43E; &#x434;&#x43B;&#x44F; &#x43E;&#x441;&#x43E;&#x431;&#x43E; &#x43B;&#x44E;&#x431;&#x43E;&#x437;&#x43D;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439; &#x434;&#x43E;&#x43C;&#x430;&#x448;&#x43D;&#x435;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;&#x430;.</p><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x441;&#x43A;&#x438;&#x445; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x440;&#x430;&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x43E; &#x44E;&#x437;&#x435;&#x440;&#x430;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x44F;&#x442;&#x44C; &#x43E; &#x43D;&#x43E;&#x432;&#x43E;&#x432;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F;&#x445; &#x438;&#x43B;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x445;/&#x441;&#x431;&#x43E;&#x44F;&#x445;. </p><p><a href="https://github.com/jemsgit/mobile-check-bot/">&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x439; GitHub</a></p><h2 id="%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9">&#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x439;</h2><p>&#x422;&#x430;&#x43A;&#x438;&#x435; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44B;&#x43A; &#x440;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; <a href="https://pm2.keymetrics.io/">pm2</a>, &#x430; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x44C; &#x2013; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x43C; sh &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x43E;&#x43C; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; rsync &#x438; ssh &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;. &#x41A;&#x441;&#x442;&#x430;&#x442;&#x438;, &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x43B;&#x441;&#x44F; &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x438;&#x43D;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x441;&#x442;&#x430;&#x434;&#x438;&#x44F; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x435;&#x439;. &#x41E;&#x43A;&#x430;&#x437;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x435; ssh &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x433;&#x440;&#x443;&#x436;&#x430;&#x442;&#x44C; nvm.sh &#x43F;&#x440;&#x43E;&#x444;&#x430;&#x439;&#x43B; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x430;&#x448;&#x430; ssh &#x441;&#x435;&#x441;&#x441;&#x438;&#x44F; &#x437;&#x43D;&#x430;&#x43B;&#x430; &#x43F;&#x440;&#x43E; nvm &#x438; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x443;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; node.</p><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x432;&#x441;&#x451;. &#x421;&#x43F;&#x430;&#x441;&#x438;&#x431;&#x43E; &#x437;&#x430; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;!<br>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x43E;&#x439; Telegram &#x43A;&#x430;&#x43D;&#x430;&#x43B; <a href="https://t.me/five_a_m">Sleepless Tech</a>.</p>]]></content:encoded></item><item><title><![CDATA[Используем eleventy в 2025]]></title><description><![CDATA[<h2 id="%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-eleventy-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8-%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3%D0%BE%D0%B2-%D0%B8-%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85-%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2">&#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; Eleventy &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x43D;&#x433;&#x43E;&#x432; &#x438; &#x441;&#x442;</h2>]]></description><link>https://jem-space.ru/eleventy-in-2025/</link><guid isPermaLink="false">68825c6563611f000109128a</guid><category><![CDATA[js]]></category><category><![CDATA[css]]></category><category><![CDATA[eleventy]]></category><category><![CDATA[11ty]]></category><category><![CDATA[landing]]></category><category><![CDATA[лендинг]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Fri, 25 Jul 2025 07:03:40 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/07/11ty_homepage.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-eleventy-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8-%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3%D0%BE%D0%B2-%D0%B8-%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85-%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2">&#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; Eleventy &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x43D;&#x433;&#x43E;&#x432; &#x438; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x441;&#x430;&#x439;&#x442;&#x43E;&#x432;</h2><img src="https://jem-space.ru/content/images/2025/07/11ty_homepage.jpg" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; eleventy &#x432; 2025"><p></p><p>Eleventy (&#x438;&#x43B;&#x438; 11ty) &#x2014; &#x44D;&#x442;&#x43E; &#x43B;&#x435;&#x433;&#x43A;&#x43E;&#x432;&#x435;&#x441;&#x43D;&#x44B;&#x439; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x441;&#x430;&#x439;&#x442;&#x43E;&#x432;, &#x438;&#x434;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x433;&#x434;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x438; &#x433;&#x438;&#x431;&#x43A;&#x43E; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x441;&#x430;&#x439;&#x442; &#x43D;&#x430; &#x447;&#x438;&#x441;&#x442;&#x43E;&#x43C; HTML, CSS &#x438; JavaScript. &#x412; &#x43C;&#x43E;&#x451;&#x43C; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x443;&#x437;&#x44B;&#x440;&#x435; &#x43E;&#x43D; &#x434;&#x430;&#x432;&#x43D;&#x43E; &#x43D;&#x435; &#x43D;&#x430; &#x441;&#x43B;&#x443;&#x445;&#x443;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x434;&#x430;&#x432;&#x43D;&#x43E; &#x445;&#x430;&#x439;&#x43F;&#x443;&#x44E;&#x442; NextJs &#x438; RemixJs. &#x41D;&#x43E; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x43D;&#x433;&#x438; &#x438;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; &#x432;&#x430;&#x43C; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x435;&#x43D; React &#x438;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x444;&#x440;&#x435;&#x439;&#x43C;&#x432;&#x43E;&#x440;&#x43A;&#x438;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x43A;&#x43B;&#x435;&#x43F;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x447;&#x43A;&#x443; &#x43E;&#x434;&#x43D;&#x43E;&#x442;&#x438;&#x43F;&#x43D;&#x44B;&#x445; (&#x438;&#x43B;&#x438; &#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C;) &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x43D;&#x433;&#x43E;&#x432;, &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x435;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; - &#x44D;&#x442;&#x43E; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;. &#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430;&#x44F; &#x444;&#x438;&#x448;&#x43A;&#x430; 11ty &#x44D;&#x442;&#x43E; &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x437; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x447;&#x435;&#x440;&#x435;&#x437; Markdown &#x444;&#x430;&#x439;&#x43B;&#x44B;.</p><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x444;&#x438;&#x448;&#x43A;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44F;&#x442; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x43D;&#x430; Eleventy.</p><hr><h3 id="1-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2-nunjucks-njk-%D0%B8-markdown">1. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x432; Nunjucks (njk) &#x438; Markdown</h3><p>&#x41E;&#x434;&#x43D;&#x43E; &#x438;&#x437; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x435;&#x438;&#x43C;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432; Eleventy &#x2014; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x430; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x432; &#x438; Markdown &#xAB;&#x438;&#x437; &#x43A;&#x43E;&#x440;&#x43E;&#x431;&#x43A;&#x438;&#xBB;. &#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x443; HTML &#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;. &#x42F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E; Nunjucks &#x434;&#x43B;&#x44F; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x432; &#x438; Markdown &#x434;&#x43B;&#x44F; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;:</p><h4 id="srcurlpathprojectmd"><code>src/urlpath/project.md</code></h4><pre><code class="language-markdown">--- 
title: &#x41C;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442; 
layout: layout.njk 
--- 

header: Hello

## &#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430; 
&#x42D;&#x442;&#x43E;&#x442; &#x441;&#x430;&#x439;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; Eleventy.</code></pre><h4 id="srcincludeslayoutnjk"><code>src/_includes/layout.njk</code></h4><pre><code class="language-nunjucks">&lt;!DOCTYPE html&gt; 
&lt;html lang=&quot;ru&quot;&gt; 
	&lt;head&gt; 
		&lt;meta charset=&quot;UTF-8&quot; /&gt; 
		&lt;title&gt;{{ title }}&lt;/title&gt; 
	&lt;/head&gt; 
	&lt;body&gt; 
		&lt;h1&gt;{{header}}&lt;/h1&gt;
		&lt;main&gt; {{ content | safe }} &lt;/main&gt; 
	&lt;/body&gt; 
&lt;/html&gt;
</code></pre><p>&#x422;&#x430;&#x43A;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x441;&#x430;&#x439;&#x442; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442;&#x43E;&#x43C;, &#x43D;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x44F;&#x44F; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x442;&#x43A;&#x443; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; (&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; <code>safe</code> &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x432;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;, &#x430; html &#x43A;&#x43E;&#x434; &#x438; &#x435;&#x433;&#x43E; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x432;&#x435;&#x440;&#x433;&#x430;&#x442;&#x44C; &#x441;&#x430;&#x43D;&#x438;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; - &#x43E;&#x447;&#x438;&#x441;&#x442;&#x43A;&#x435; &#x43E;&#x442; &#x432;&#x440;&#x435;&#x434;&#x43E;&#x43D;&#x43E;&#x441;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;)</p><hr><h3 id="2-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0pathprefix-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%B0-%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8">2. &#x41F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x430; <code>--pathprefix</code> &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x43F;&#x440;&#x435;&#x444;&#x438;&#x43A;&#x441;&#x430; &#x441;&#x442;&#x430;&#x442;&#x438;&#x43A;&#x438;</h3><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x449;&#x430;&#x435;&#x442;&#x435; &#x441;&#x430;&#x439;&#x442; &#x432; &#x43F;&#x43E;&#x434;&#x43A;&#x430;&#x442;&#x430;&#x43B;&#x43E;&#x433;&#x435; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, <code>https://pdf-convert.ru/welcome</code>), Eleventy &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x444;&#x438;&#x43A;&#x441; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x43A;. &#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x435; &#x43F;&#x43B;&#x430;&#x433;&#x438;&#x43D; HTMLBasePlugin &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x435;&#x433;&#x43E; &#x432; &#x441;&#x432;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;:</p><p><strong><code>eleventy.config.js</code></strong></p><pre><code>
const { HtmlBasePlugin } = await import(&quot;@11ty/eleventy&quot;);

// &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x434;&#x43B;&#x44F; 11ty (&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43C;&#x43E;&#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x434;&#x430;&#x43B;&#x435;&#x435;)
eleventyConfig.addPlugin(HtmlBasePlugin);</code></pre><p>&#x418; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x439;&#x442;&#x435; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x443; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430; <code>eleventy --pathprefix nextlevelpath</code>, &#x433;&#x434;&#x435; <code>nextlevelpath</code> &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43F;&#x443;&#x442;&#x44C;.</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x443;&#x442;&#x438; &#x43A; &#x441;&#x442;&#x430;&#x442;&#x438;&#x43A;&#x435; &#x432; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435; &#x442;&#x430;&#x43A;:</p><p><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;/styles/base.css&quot; /&gt;</code></p><p>&#x410; Eleventy &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x435;&#x444;&#x438;&#x43A;&#x441; (<code>/nextlevelpath/styles/base.css</code>).</p><hr><h3 id="3-%D0%BC%D0%B8%D0%BD%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-esbuild">3. &#x41C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44F; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; esbuild</h3><p>&#x412;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x432;&#x430;&#x448; &#x441;&#x430;&#x439;&#x442; &#x432; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x43A;&#x448;&#x43D; &#x43D;&#x435; &#x441;&#x436;&#x430;&#x432; js - &#x43D;&#x435;&#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E;. 11ty &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x43A;&#x440;&#x443;&#x442;&#x438;&#x43C; &#x435;&#x433;&#x43E; &#x441;&#x430;&#x43C;&#x438;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; JS-&#x444;&#x430;&#x439;&#x43B;&#x44B; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; esbuild (&#x437;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x434;&#x43B;&#x44F; &#x43C;&#x43E;&#x435;&#x439; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x438;):</p><p><code><strong>eleventy.config.js</strong></code></p><pre><code class="language-js">const esbuild = require(&quot;esbuild&quot;);
const fs = require(&quot;fs&quot;);
const path = require(&quot;path&quot;);

module.exports = async function (eleventyConfig) {
  const { HtmlBasePlugin } = await import(&quot;@11ty/eleventy&quot;);
  eleventyConfig.addPlugin(HtmlBasePlugin);
  // &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x438;&#x43A;&#x443; &#x43F;&#x440;&#x438; &#x431;&#x438;&#x43B;&#x434;&#x435; (&#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x44B;, &#x441;&#x442;&#x438;&#x43B;&#x438;, &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x43A;&#x438; &#x438; &#x442;&#x43F;)
  eleventyConfig.addPassthroughCopy(&quot;src/styles&quot;);
  eleventyConfig.addPassthroughCopy(&quot;src/fonts&quot;);
  eleventyConfig.addPassthroughCopy(&quot;src/img&quot;);
  eleventyConfig.addPassthroughCopy(&quot;src/scripts&quot;);
  eleventyConfig.addPassthroughCopy(&quot;src/video&quot;);

  // &#x43C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x44B;
  eleventyConfig.on(&quot;afterBuild&quot;, () =&gt; {
    const scriptDir = &quot;src/scripts&quot;;
    const files = fs
      .readdirSync(scriptDir)
      .filter((file) =&gt; file.endsWith(&quot;.js&quot;))
      .map((file) =&gt; path.join(scriptDir, file));

    return esbuild.build({
      entryPoints: files,
      outdir: &quot;_site/scripts&quot;,
      minify: process.env.ELEVENTY_ENV === &quot;production&quot;,
      sourcemap: process.env.ELEVENTY_ENV !== &quot;production&quot;,
    });
  });

  eleventyConfig.addWatchTarget(&quot;src/scripts/&quot;);
   
  // &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x443; _site
  return {
    dir: {
      input: &quot;src&quot;,
      output: &quot;_site&quot;,
    },
  };
};
</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x430;&#x448;&#x438; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x44B; &#x431;&#x443;&#x434;&#x443;&#x442; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x44B; &#x43F;&#x440;&#x438; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x43A;&#x448;&#x435;&#x43D;-&#x441;&#x431;&#x43E;&#x440;&#x43A;&#x435;.</p><hr><h3 id="4-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85">4. &#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445;</h3><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437; &#x2014; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x438;&#x445; &#x432; &#x43B;&#x44E;&#x431;&#x43E;&#x43C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435;. &#x42D;&#x442;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x430;&#x44F; &#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x43D;&#x443;&#x436;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430; &#x432; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x441;&#x442;&#x430;&#x445;, &#x43B;&#x438;&#x431;&#x43E; &#x43E;&#x43D;&#x430; &#x43D;&#x435; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x442; &#x43E;&#x442; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x438;&#x437;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43C;&#x435;&#x442;&#x430;&#x442;&#x435;&#x433;&#x430; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x43E; &#x430;&#x431;&#x441;&#x43E;&#x43B;&#x44E;&#x442;&#x43D;&#x44B;&#x43C; &#x43F;&#x443;&#x442;&#x435;&#x43C;. </p><h4 id="eleventyconfigjs"><code>eleventy.config.js</code></h4><pre><code class="language-js">const isProd = process.env.ELEVENTY_ENV === &quot;production&quot;; 

module.exports = { 
    baseUrl: isProd ? &quot;https://pdf-convert.ru/welcome&quot; : &quot;&quot;, 
}</code></pre><h4 id="%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5">&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435;:</h4><p><code>&lt;meta property=&quot;og:image&quot; content=&quot;{{ site.baseUrl }}{{ metaImage }}&quot; /&gt;</code></p><p>&#x42D;&#x442;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x43A;, &#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, CDN &#x438; &#x43C;&#x435;&#x442;&#x430;-&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</p><hr><h3 id="5-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-addglobaldata">5. &#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x447;&#x435;&#x440;&#x435;&#x437; <code>addGlobalData</code></h3><p>&#x41F;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x443; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x442;&#x43E; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x435;, &#x447;&#x442;&#x43E; &#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43F;&#x443;&#x43D;&#x43A;&#x442;&#x435;. &#x427;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; <code>11tydata.js</code>, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x435;:</p><pre><code class="language-javascript">const isProd = process.env.ELEVENTY_ENV === &quot;production&quot;;

module.exports = function(eleventyConfig) {
    eleventyConfig.addGlobalData(&quot;isProd&quot;, isProd); 
	return { 
			dir: { input: &quot;src&quot;, output: &quot;_site&quot;, }, 
			pathPrefix: isProd ? &quot;/welcome&quot; : &quot;/&quot;, 
    	}; 
};</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; <code>isProd</code> &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x430; &#x432; &#x43B;&#x44E;&#x431;&#x43E;&#x43C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435;:</p><p><code>{% if isProd %} &lt;script&gt;/* production analytics */&lt;/script&gt; {% endif %}</code></p><h3 id="6-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-css-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D1%85">6. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x432; css &#x444;&#x430;&#x439;&#x43B;&#x430;&#x445;</h3><p>&#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x44F; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; &#x448;&#x440;&#x438;&#x444;&#x442;&#x43E;&#x432; &#x43C;&#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x444;&#x438;&#x43A;&#x441;. &#x41A; &#x441;&#x43E;&#x436;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x44E; pathPrefix &#x43D;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x434;&#x43B;&#x44F; css, &#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x432;. &#x414;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C; css &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43D;&#x44B;&#x439;, &#x43F;&#x43E;&#x43C;&#x435;&#x43D;&#x44F;&#x432; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; css.njk. &#xA0;&#x41E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43D;&#x43E;&#x43C; &#x444;&#x430;&#x439;&#x43B;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x438;&#x43C;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x43E;&#x435;&#x43D;&#x43E; &#x444;&#x430;&#x439;&#x43B;&#x443; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; css &#x438;&#x437; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x442;&#x435;&#x43C;&#x43F;&#x43B;&#x435;&#x439;&#x442;&#x430; &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x44E;&#x449;&#x438;&#x439; &#x437;&#x430; &#x442;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x437; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x442;&#x435;&#x43C;&#x43F;&#x43B;&#x435;&#x439;&#x442;&#x430; &#x43D;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x43B;&#x441;&#x44F; html &#x444;&#x430;&#x439;&#x43B;.</p><p><code><strong>base.css.njk</strong></code></p><pre><code class="language-njk">---
permalink: /styles/base.css
eleventyExcludeFromCollections: true
---
# &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435;

@font-face {  
	font-family: &quot;Manrope&quot;;  
    font-style: normal;  
    font-weight: 400;  
    src: url(&quot;{{ site.baseUrl }}/fonts/Manrope-Regular.ttf&quot;) format(&quot;truetype&quot;);
 }</code></pre><hr><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x433;&#x43B;&#x44F;&#x43D;&#x443;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x433;&#x43E;&#x432; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x43E; &#x43E;&#x434;&#x43D;&#x43E;&#x43C;&#x443; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x443;:</p><p><a href="https://pdf-convert.ru/welcome/e/pdf-to-png/">PDF to PNG Chrome extension</a><br><a href="https://pdf-convert.ru/welcome/e/combine-pdf/">Combine PDF Chrome extension</a><br><a href="https://pdf-convert.ru/welcome/e/compress-pdf/">Compress PDF &#xA0;Chrome extension</a></p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x431;&#x438;&#x43B;&#x434;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x43A;&#x438;&#x43D;&#x443;&#x442;&#x44C; &#x432;&#x430;&#x448;&#x443; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x441;&#x442;&#x430;&#x442;&#x438;&#x43A;&#x443; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x435;&#x435; &#x440;&#x430;&#x437;&#x434;&#x430;&#x432;&#x430;&#x43B; nginx &#x438; &#x432;&#x441;&#x435; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43E;!</p><p><strong>&#x412; &#x43E;&#x431;&#x449;&#x435;&#x43C;, Eleventy</strong> &#x2014; &#x43C;&#x43E;&#x449;&#x43D;&#x44B;&#x439; &#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x434;&#x43B;&#x44F; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x438; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x441;&#x430;&#x439;&#x442;&#x43E;&#x432;. &#x41E;&#x43D; &#x438;&#x434;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x43E;&#x439;&#x434;&#x451;&#x442; &#x43A;&#x430;&#x43A; &#x434;&#x43B;&#x44F; &#x43B;&#x435;&#x43D;&#x434;&#x438;&#x43D;&#x433;&#x43E;&#x432;, &#x442;&#x430;&#x43A; &#x438; &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x441;&#x430;&#x439;&#x442;&#x43E;&#x432;, &#x431;&#x43B;&#x43E;&#x433;&#x43E;&#x432; &#x438; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x439; &#x2014; &#x43E;&#x441;&#x43E;&#x431;&#x435;&#x43D;&#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x44C; &#x43D;&#x430;&#x434; HTML, CSS &#x438; JS, &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x442;&#x44F;&#x436;&#x451;&#x43B;&#x44B;&#x435; &#x444;&#x440;&#x435;&#x439;&#x43C;&#x432;&#x43E;&#x440;&#x43A;&#x438;.</p><p>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x43E;&#x439; &#x43A;&#x430;&#x43D;&#x430;&#x43B; <a href="https://t.me/five_a_m">SleeplessTech</a></p>]]></content:encoded></item><item><title><![CDATA[Используем Chrome Identity API]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; Chrome &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x430;&#x443;&#x442;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x446;&#x438;</p>]]></description><link>https://jem-space.ru/chrome-identity/</link><guid isPermaLink="false">680396d63471270001440d9c</guid><category><![CDATA[js]]></category><category><![CDATA[chrome]]></category><category><![CDATA[extension]]></category><category><![CDATA[web]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Wed, 23 Apr 2025 17:24:20 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/04/passkeys-card-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/04/passkeys-card-2.jpg" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Chrome Identity API"><p>&#x41F;&#x440;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; Chrome &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x430;&#x443;&#x442;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x43F;&#x43E; &#x43B;&#x43E;&#x433;&#x438;&#x43D;&#x443; &#x432; Chrome. &#x41F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x441;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x438;&#x43B; &#x432;&#x445;&#x43E;&#x434; &#x432; &#x441;&#x432;&#x43E;&#x439; &#x430;&#x43A;&#x43A;&#x430;&#x443;&#x43D;&#x442;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43B;&#x43E;&#x433;&#x438;&#x43D;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x432;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; Chrome &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&#x43C; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x439; <code>identity</code> &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;.</p><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x43C; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x43F;&#x443;&#x431;&#x43B;&#x438;&#x43A;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x447;&#x435;&#x440;&#x43D;&#x43E;&#x432;&#x438;&#x43A; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x432; Chrome Web Store &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x441;&#x44F; id (&#x432;&#x438;&#x434;&#x430;: idhnkoehnkpmejapcxxxxlpfldsf, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43D;&#x430; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F;).</p><p>&#x417;&#x430;&#x442;&#x435;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x442;&#x438; &#x432; <a href="https://console.cloud.google.com/">Google Cloud Console</a> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442; (&#x43B;&#x438;&#x431;&#x43E; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439;). &#x41D;&#x430; <a href="https://console.cloud.google.com/welcome">&#x433;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435;</a> &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x442;&#x438; &#x432; <a href="https://console.cloud.google.com/apis/dashboard?">Api &amp; Services</a>. </p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.12.43.png" class="kg-image" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Chrome Identity API" loading="lazy" width="2000" height="956" srcset="https://jem-space.ru/content/images/size/w600/2025/04/--------------2025-04-22---07.12.43.png 600w, https://jem-space.ru/content/images/size/w1000/2025/04/--------------2025-04-22---07.12.43.png 1000w, https://jem-space.ru/content/images/size/w1600/2025/04/--------------2025-04-22---07.12.43.png 1600w, https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.12.43.png 2268w" sizes="(min-width: 720px) 720px"></figure><p>&#x421;&#x43B;&#x435;&#x432;&#x430; &#x432;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x430; Credentials, &#x43D;&#x430;&#x43C; &#x442;&#x443;&#x434;&#x430;.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.12.52.png" class="kg-image" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Chrome Identity API" loading="lazy" width="862" height="758" srcset="https://jem-space.ru/content/images/size/w600/2025/04/--------------2025-04-22---07.12.52.png 600w, https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.12.52.png 862w" sizes="(min-width: 720px) 720px"></figure><p><br>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x43A;&#x440;&#x435;&#x434;&#x44B;: <strong>Create Credentials</strong> &#x2192; <strong>OAuth 2.0 Client ID</strong></p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.18.25.png" class="kg-image" alt="&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Chrome Identity API" loading="lazy" width="1226" height="1366" srcset="https://jem-space.ru/content/images/size/w600/2025/04/--------------2025-04-22---07.18.25.png 600w, https://jem-space.ru/content/images/size/w1000/2025/04/--------------2025-04-22---07.18.25.png 1000w, https://jem-space.ru/content/images/2025/04/--------------2025-04-22---07.18.25.png 1226w" sizes="(min-width: 720px) 720px"></figure><p>Application type: Chrome extension<br>Item ID: id &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x438;&#x434;&#x430; idhnkoehnkpmejapcxxxxlpfldsf<br>&#x422;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x442;&#x432;&#x435;&#x440;&#x434;&#x438;&#x442;&#x44C; &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x432;&#x430;&#x448;&#x435; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x435;.<br>&#x41D;&#x430;&#x436;&#x438;&#x43C;&#x430;&#x435;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C;.</p><p>&#x412; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x440;&#x435;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x430; &#x432; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x432; &#x433;&#x440;&#x430;&#x444;&#x435; ClientId &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x430;&#x448; id, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x432; &#x43C;&#x430;&#x43D;&#x438;&#x444;&#x435;&#x441;&#x442; (&#x43E;&#x43D; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43F;&#x443;&#x431;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x439;, &#x43D;&#x43E; &#x432; git &#x435;&#x433;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x43D;&#x435; &#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x430;&#x442;&#x44C;).</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x434;&#x43B;&#x44F; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x432;&#x430;&#x436;&#x43D;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; id &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x430;&#x43B;&#x441;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x44B;&#x439; (&#x442; &#x43A; &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;&#x435; &#x440;&#x430;&#x441;&#x43F;&#x430;&#x43A;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x434;&#x435;&#x431;&#x430;&#x433;&#x435;, &#x43E;&#x43D; &#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F;)<br>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x432; Chrome Web Store &#x432;&#x43E; &#x432;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x435; &#x41F;&#x430;&#x43A;&#x435;&#x442; &#x43D;&#x430; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435; &#x441; &#x432;&#x430;&#x448;&#x438;&#x43C; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x438;&#x449;&#x435;&#x43C; &#x433;&#x440;&#x430;&#x444;&#x443; &#x41E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44B;&#x439; &#x43A;&#x43B;&#x44E;&#x447;, &#x43A;&#x43B;&#x438;&#x43A;&#x430;&#x435;&#x43C;, &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x43C;.<br><br>&#x412;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43D;&#x430;&#x448;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43C;&#x430;&#x43D;&#x438;&#x444;&#x435;&#x441;&#x442;:<br>&#x41E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44B;&#x439; &#x43A;&#x43B;&#x44E;&#x447; <br><code>&quot;key&quot;: &quot;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKJHFDISJHFKJHDKJHSKJFHSJ&quot;</code><br>&#x420;&#x430;&#x437;&#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F;: <br><code>&quot;permissions&quot;: [&quot;identity&quot;, &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x432;&#x430;&#x448;&#x438; &#x440;&#x430;&#x441;&#x437;&#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F;]</code><br>ClientId &#x438;&#x437; Cloud Console:</p><pre><code class="language-json">&quot;oauth2&quot;: {
	&quot;client_id&quot;: &quot;YOUR_CLIENT_ID.apps.googleusercontent.com&quot;,
    &quot;scopes&quot;: [&quot;https://www.googleapis.com/auth/userinfo.email&quot;]
 }</code></pre><p>&#x413;&#x43E;&#x442;&#x43E;&#x432;&#x43E;!</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x430;&#x448;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x43E;&#x43A;&#x435;&#x43D; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x432; content.js, &#x43F;&#x440;&#x438; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;:</p><pre><code class="language-javascript">function getAuthToken(res: (res: string) =&gt; void, rej: () =&gt; void) {
  chrome.identity.getAuthToken({ interactive: false }, (token) =&gt; {
  /// &#x435;&#x441;&#x43B;&#x438; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x437;&#x430;&#x43F;&#x440;&#x430;&#x448;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x431;&#x435;&#x437; &#x43E;&#x43A;&#x43D;&#x430; oauth2
    if (chrome.runtime.lastError || !token) {
      console.warn(&quot;Silent auth failed:&quot;, chrome.runtime.lastError?.message);
 
/// &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x432;&#x44B;&#x448;&#x43B;&#x43E;, &#x437;&#x430;&#x43F;&#x440;&#x430;&#x448;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x441; &#x43F;&#x43E;&#x43F;&#x430;&#x43F;&#x43E;&#x43C; oauth2
      chrome.identity.getAuthToken(
        { interactive: true },
        (interactiveToken) =&gt; {
          if (chrome.runtime.lastError || !interactiveToken) {
            console.error(
              &quot;Interactive auth failed:&quot;,
              chrome.runtime.lastError?.message
            );
            rej();
            return;
          }
/// &#x432;&#x43E;&#x442; &#x43D;&#x430;&#x448; &#x442;&#x43E;&#x43A;&#x435;&#x43D;
          res(interactiveToken);
        }
      );

      return;
    }
/// &#x432;&#x43E;&#x442; &#x43D;&#x430;&#x448; &#x442;&#x43E;&#x43A;&#x435;&#x43D;
    res(token);
  });
}</code></pre><p>&#x41D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x442;&#x43E;&#x43A;&#x435;&#x43D; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x43D;&#x44B;&#x439; &#x447;&#x435;&#x440;&#x435;&#x437; GET &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43D;&#x430; <code>https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=${token}</code></p><p>&#x412; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; </p><pre><code class="language-javascript">{
    azp: &apos;81800004758-xxxxxxxxx.apps.googleusercontent.com&apos;,
    /// &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x43C; &#x447;&#x442;&#x43E; aud &#x441;&#x43E;&#x432;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442; &#x441; &#x432;&#x430;&#x448;&#x435;&#x43C; clientid &#x438;&#x437; cloud console
    aud: &apos;818600004758-xxxxxx.apps.googleusercontent.com&apos;,
    sub: &apos;101158204829854056900&apos;,
    scope: &apos;https://www.googleapis.com/auth/userinfo.email openid&apos;,
    exp: &apos;1745297288&apos;,
    expires_in: &apos;3598&apos;,
    email: &apos;test@gmail.com&apos;,
    email_verified: &apos;true&apos;,
    access_type: &apos;online&apos;
}</code></pre><p>&#x413;&#x43E;&#x442;&#x43E;&#x432;&#x43E;, &#x442;&#x435;&#x43F;&#x440;&#x44C; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x431;&#x435;&#x441;&#x448;&#x43E;&#x432;&#x43D;&#x43E; &#x430;&#x443;&#x442;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x430;&#x448;&#x438;&#x445; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439;.<br><br>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; <a href="https://t.me/five_a_m">&#x43C;&#x43E;&#x439; &#x43A;&#x430;&#x43D;&#x430;&#x43B; &#x432; Telegram</a> &#x43F;&#x440;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x438; &#x43D;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E;.</p>]]></content:encoded></item><item><title><![CDATA[Создаем сервис с автозагрузкой на Ubuntu]]></title><description><![CDATA[<p>&#x41F;&#x430;&#x440;&#x430; &#x448;&#x430;&#x433;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x43B;&#x438; &#x43D;&#x443;&#x436;&#x43D;&#x430;&#x44F; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x430; &#x437;</p>]]></description><link>https://jem-space.ru/create-service-ubuntu/</link><guid isPermaLink="false">680919f9dd6f9d0001d96345</guid><category><![CDATA[ubuntu]]></category><category><![CDATA[server]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Wed, 23 Apr 2025 17:03:43 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/04/images-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/04/images-2.png" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x441; &#x430;&#x432;&#x442;&#x43E;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x43E;&#x439; &#x43D;&#x430; Ubuntu"><p>&#x41F;&#x430;&#x440;&#x430; &#x448;&#x430;&#x433;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x43B;&#x438; &#x43D;&#x443;&#x436;&#x43D;&#x430;&#x44F; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x430; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x43B;&#x430;&#x441;&#x44C; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x442;&#x430;&#x440;&#x442;&#x430; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;. &#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x432;&#x43E;&#x437;&#x44C;&#x43C;&#x435;&#x43C; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x443; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; <a href="https://pocketbase.io/">pocketbase</a>.</p><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x44E;&#x43D;&#x438;&#x442;-&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x434;&#x43B;&#x44F; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430; <br><code>sudo nano /etc/systemd/system/pocketbase.service</code></p><pre><code class="language-bash">[Unit]
Description=PocketBase service
After=network.target

[Service]
ExecStart=/path/to/pocketbase serve --http=8090 # &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x430; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x449;&#x430;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x43F;&#x443;&#x442;&#x44C; &#x43A; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C;&#x43E;&#x43C;&#x443; &#x444;&#x430;&#x439;&#x43B;&#x443; &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; (&#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x442;&#x44C; &#x447;&#x435;&#x440;&#x435;&#x437; Environment)
WorkingDirectory=/path/to/ #&#x43F;&#x443;&#x442;&#x44C; &#x434;&#x43E; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x438; &#x433;&#x434;&#x435; &#x43B;&#x435;&#x436;&#x438;&#x442; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x444;&#x430;&#x439;&#x43B;
Restart=always
User=your-username # &#x432;&#x430;&#x448; &#x44E;&#x437;&#x435;&#x440;
Environment=PORT=8090 # &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x43A;&#x438;&#x43D;&#x443;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x442;&#x430;&#x43A;&#x43E;&#x43C; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x435;

[Install]
WantedBy=multi-user.target
</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C;:</p><p><code>sudo systemctl daemon-reexec</code> &#x2014; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; &#x441;&#x430;&#x43C; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; <code>systemd</code></p><p><code>sudo systemctl daemon-reload</code> &#x2014; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; (&#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;) &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x44B;&#x435; &#x444;&#x430;&#x439;&#x43B;&#x44B; systemd (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, <code>.service</code> &#x444;&#x430;&#x439;&#x43B;&#x44B;). &#x41D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x44E;&#x43D;&#x438;&#x442;-&#x444;&#x430;&#x439;&#x43B;&#x430;&#x445;.</p><p><code>sudo systemctl enable pocketbase</code> &#x2014; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x44E;&#x43D;&#x438;&#x442; <code>pocketbase.service</code> &#x432; &#x430;&#x432;&#x442;&#x43E;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x443;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x43B;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x441;&#x442;&#x430;&#x440;&#x442;&#x435; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;.</p><p><code>sudo systemctl start pocketbase</code> &#x2014; &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; <code>pocketbase</code></p><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x44E;&#x43D;&#x438;&#x442; &#x444;&#x430;&#x439;&#x43B; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44D;&#x442;&#x438; 2 &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;:</p><p><code>sudo systemctl daemon-reload</code></p><p><code>sudo systemctl restart pocketbase</code></p><p>&#x41D;&#x443; &#x432;&#x43E;&#x442; &#x438; &#x432;&#x441;&#x435;, &#x432;&#x430;&#x448; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x433;&#x43E;&#x442;&#x43E;&#x432;!<br><br>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x43E;&#x439; <a href="https://t.me/five_a_m">&#x442;&#x435;&#x43B;&#x435;&#x433;&#x440;&#x430;&#x43C;-&#x43A;&#x430;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443;</a></p>]]></content:encoded></item><item><title><![CDATA[⚡ Современные и малоизвестные возможности JavaScript, о которых стоит знать]]></title><description><![CDATA[<p>JavaScript &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x438; &#x441; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x43C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E;&#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F;</p>]]></description><link>https://jem-space.ru/js-features/</link><guid isPermaLink="false">67fc724b954b6200011bdda6</guid><category><![CDATA[front-end]]></category><category><![CDATA[js]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Mon, 14 Apr 2025 03:28:22 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2025/04/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_80ijyr830p5h9q61kfwv.webp" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2025/04/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_80ijyr830p5h9q61kfwv.webp" alt="&#x26A1; &#x421;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x43C;&#x430;&#x43B;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; JavaScript, &#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x437;&#x43D;&#x430;&#x442;&#x44C;"><p>JavaScript &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x438; &#x441; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x43C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E;&#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x43E;&#x432;&#x44B;&#x435; &#x444;&#x438;&#x447;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x435;&#x43B;&#x430;&#x44E;&#x442; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x438; &#x443;&#x441;&#x442;&#x430;&#x440;&#x435;&#x432;&#x448;&#x438;&#x43C;&#x438; &#x438; &#x43C;&#x435;&#x43D;&#x435;&#x435; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C;&#x438;. &#x41D;&#x438;&#x436;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x451;&#x43D; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43A;&#x430;&#x43A; &#x43D;&#x43E;&#x432;&#x44B;&#x445;, &#x442;&#x430;&#x43A; &#x438; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x445;, &#x43D;&#x43E; &#x43D;&#x435;&#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x44B;&#x445; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x435;&#x439; &#x44F;&#x437;&#x44B;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x433;&#x43E;&#x434;&#x44F;&#x442;&#x441;&#x44F; &#x43B;&#x44E;&#x431;&#x43E;&#x43C;&#x443; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443;.</p><hr><h3 id="%F0%9F%94%81-%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-%D0%B8-%D0%B8%D1%85-%D0%B2%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B">&#x1F501; &#x418;&#x442;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x44B; &#x438; &#x438;&#x445; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;</h3><p>&#x415;&#x441;&#x43B;&#x438; &#x442;&#x44B; &#x43A;&#x43E;&#x433;&#x434;&#x430;-&#x43B;&#x438;&#x431;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x43B; &#x446;&#x435;&#x43F;&#x43E;&#x447;&#x43A;&#x443; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x439; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x432;&#x440;&#x43E;&#x434;&#x435;:</p><pre><code class="language-js">arr.slice(10, 20).filter(el =&gt; el &lt; 10).map(el =&gt; el + 5);
</code></pre><p>&#x2026;&#x442;&#x43E; &#x442;&#x44B;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x43D;&#x435; &#x437;&#x430;&#x434;&#x443;&#x43C;&#x44B;&#x432;&#x430;&#x43B;&#x441;&#x44F;, &#x43D;&#x430;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;. &#x41A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x451;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;. &#x414;&#x43B;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x445; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; (&gt;500K &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;) &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x442;&#x430;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x44C;&#x451;&#x437;&#x43D;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x43E;&#x439;.</p><p>&#x421; &#x43D;&#x435;&#x434;&#x430;&#x432;&#x43D;&#x438;&#x445; &#x43F;&#x43E;&#x440; &#x432; JavaScript &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x438;&#x441;&#x44C; <strong>&#x438;&#x442;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x43D;&#x44B;&#x435; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x43D;&#x438;&#x43A;&#x438;</strong> &#x2014; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x44E;&#x442; &#x43A;&#x430;&#x43A; <code>map</code>, <code>filter</code> &#x438; &#x442;.&#x434;., &#x43D;&#x43E; &#x43D;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x44B;, &#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x435; &#x438;&#x442;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x44B;.</p><p>&#x412;&#x43E;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435;:</p><p><code>drop(n)</code> &#x2014; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; <code>n</code> &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; (&#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433; <code>slice(n)</code>).</p><p><code>take(n)</code> &#x2014; &#x431;&#x435;&#x440;&#x451;&#x442; &#x43C;&#x430;&#x43A;&#x441;&#x438;&#x43C;&#x443;&#x43C; <code>n</code> &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; (&#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433; <code>slice(0, n)</code>).</p><p><code>some(fn)</code> / <code>every(fn)</code> &#x2014; &#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433;&#x438; &#x43E;&#x434;&#x43D;&#x43E;&#x438;&#x43C;&#x451;&#x43D;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;.</p><p><code>filter(fn)</code> / <code>find(fn)</code> / <code>map(fn)</code> / <code>flatMap(fn)</code> &#x2014; &#x432;&#x441;&#x451; &#x43A;&#x430;&#x43A; &#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;&#x445;.</p><p><code>reduce(fn, initial)</code> &#x2014; &#x43A;&#x430;&#x43A; <code>reduce</code> &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x438;&#x442;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x432;.</p><p><code>forEach(fn)</code> &#x2014; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430;.</p><p><code>toArray()</code> &#x2014; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x442; &#x438;&#x442;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440; &#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;.</p><p>&#x418;&#x445; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>Iterator.from()</code> &#x438;&#x43B;&#x438;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, <code>arr.values()</code>:</p><pre><code class="language-js">arr.values()
  .drop(10)
  .take(10)
  .filter(el =&gt; el &lt; 10)
  .map(el =&gt; el + 5)
  .toArray();
</code></pre><p>&#x26A0;&#xFE0F; &#x41F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x430; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x43D;&#x435;&#x434;&#x430;&#x432;&#x43D;&#x43E;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, Safari &#x43D;&#x430;&#x447;&#x430;&#x43B; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441; <strong>31 &#x43C;&#x430;&#x440;&#x442;&#x430; 2025 &#x433;&#x43E;&#x434;&#x430;</strong>, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43A;&#x430; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441; &#x43E;&#x441;&#x442;&#x43E;&#x440;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E;.</p><hr><h3 id="%F0%9F%93%8D-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-at">&#x1F4CD; &#x41C;&#x435;&#x442;&#x43E;&#x434; <code>at()</code></h3><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>Array.prototype.at()</code> &#x2014; &#x44D;&#x442;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; &#x43F;&#x43E; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x443;. &#x421;&#x430;&#x43C;&#x43E;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43D;&#x43E;&#x435; &#x2014; &#x43E;&#x43D; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; <strong>&#x43E;&#x442;&#x440;&#x438;&#x446;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x44B;</strong>:</p><pre><code class="language-js">[10, 20, 30].at(-1); // 30
[10, 20, 30].at(-2); // 20
</code></pre><p>&#x41F;&#x440;&#x43E;&#x449;&#x430;&#x439;, <code>arr[arr.length - 1]</code>.</p><hr><h3 id="%F0%9F%A7%A9-promisewithresolvers">&#x1F9E9; <code>Promise.withResolvers()</code></h3><p>&#x420;&#x430;&#x43D;&#x44C;&#x448;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; <code>resolve</code> &#x438; <code>reject</code> &#x432;&#x43D;&#x435; Promise, &#x43F;&#x438;&#x441;&#x430;&#x43B;&#x438; &#x442;&#x430;&#x43A;:</p><pre><code class="language-js">let resolve, reject;
const promise = new Promise((res, rej) =&gt; {
  resolve = res;
  reject = rej;
});
</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x449;&#x435;:</p><pre><code class="language-js">const { promise, resolve, reject } = Promise.withResolvers();
</code></pre><hr><h3 id="%F0%9F%93%9D-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0-%D1%81%D1%82%D1%80%D0%BE%D0%BA-%D1%81-%D0%BA%D0%BE%D0%BB%D0%B1%D1%8D%D0%BA%D0%BE%D0%BC">&#x1F4DD; &#x417;&#x430;&#x43C;&#x435;&#x43D;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x441; &#x43A;&#x43E;&#x43B;&#x431;&#x44D;&#x43A;&#x43E;&#x43C;</h3><p>&#x41C;&#x435;&#x442;&#x43E;&#x434;&#x44B; <code>replace</code> &#x438; <code>replaceAll</code> &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; <strong>&#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;</strong>, &#x430; &#x43D;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;:</p><pre><code class="language-js">let counter = 0;
console.log(&quot;NUMBER, NUMBER, NUMBER&quot;.replaceAll(&quot;NUMBER&quot;, (match) =&gt; `${match}=${++counter}`));
// &#x2192; NUMBER=1, NUMBER=2, NUMBER=3
</code></pre><p>&#x41F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x44B; &#x437;&#x430; &#x43E;&#x434;&#x438;&#x43D; &#x43F;&#x440;&#x43E;&#x445;&#x43E;&#x434;.</p><hr><h3 id="%F0%9F%94%84-%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8">&#x1F504; &#x41E;&#x431;&#x43C;&#x435;&#x43D; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438;</h3><p>&#x41D;&#x435; &#x43D;&#x430;&#x434;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C;:</p><pre><code class="language-js">const temp = a;
a = b;
b = temp;
</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x44D;&#x43B;&#x435;&#x433;&#x430;&#x43D;&#x442;&#x43D;&#x435;&#x435;:</p><pre><code class="language-js">[a, b] = [b, a];
</code></pre><p>&#x41A;&#x440;&#x430;&#x441;&#x438;&#x432;&#x43E; &#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;.</p><hr><h3 id="%F0%9F%93%A6-structuredclone">&#x1F4E6; <code>structuredClone()</code></h3><p>&#x410;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x430; <code>JSON.parse(JSON.stringify(obj))</code>, &#x43D;&#x43E; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x435;&#x435; &#x438; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x435;&#x435;. &#x41E;&#x43D;&#x430;:</p><ul><li>&#x41F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; <code>NaN</code>, <code>undefined</code>, <code>bigint</code>, &#x446;&#x438;&#x43A;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438;.</li><li>&#x420;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x435;&#x435; &#x438; &#x43D;&#x435; &#x43B;&#x43E;&#x43C;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x440;&#x435;&#x43A;&#x443;&#x440;&#x441;&#x438;&#x432;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;&#x445;.</li></ul><pre><code class="language-js">const obj = {};
obj.self = obj;

const clone = structuredClone(obj);
console.log(clone.self === clone); // true
</code></pre><hr><h3 id="%F0%9F%94%96-tagged-templates">&#x1F516; Tagged templates</h3><p>&#x41C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x437;&#x43D;&#x430;&#x44E;&#x442; &#x43F;&#x440;&#x43E; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;, &#x43D;&#x43E; &#x43D;&#x435; &#x43F;&#x440;&#x43E; <strong>&#x442;&#x435;&#x433;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B;</strong>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x435;&#x439;.</p><p>&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x2014; &#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; HTML:</p><pre><code class="language-js">function escapeHtml(strings, ...values) {
  const div = document.createElement(&quot;div&quot;);
  return strings.reduce((acc, str, i) =&gt; {
    div.textContent = values[i] ?? &quot;&quot;;
    return acc + str + div.innerHTML;
  }, &quot;&quot;);
}

console.log(escapeHtml`&lt;br&gt; ${&apos;&lt;script&gt;&apos;}`); // &lt;br&gt; &amp;lt;script&amp;gt;
</code></pre><p>&#x41F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43A;&#x430;&#x441;&#x442;&#x43E;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;.</p><hr><h3 id="%F0%9F%A7%A0-weakmap-weakset">&#x1F9E0; <code>WeakMap</code> / <code>WeakSet</code></h3><p>&#x41A;&#x430;&#x43A; <code>Map</code> &#x438; <code>Set</code>, &#x43D;&#x43E;:</p><ul><li>&#x43A;&#x43B;&#x44E;&#x447;&#x438; <strong>&#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x44B;</strong> (&#x43D;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;/&#x447;&#x438;&#x441;&#x43B;&#x430;)</li><li>&#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x431;&#x44B;&#x442;&#x44C; <strong>&#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x443;&#x434;&#x430;&#x43B;&#x435;&#x43D;&#x44B;</strong> &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x442;&#x435;&#x440;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x43A; (garbage collection)</li></ul><p>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x43C; <strong>&#x431;&#x435;&#x437; &#x440;&#x438;&#x441;&#x43A;&#x430; &#x443;&#x442;&#x435;&#x447;&#x435;&#x43A; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438;</strong>.</p><pre><code class="language-js">const map = new WeakMap();
{
    const obj = {};
    map.set(obj, &quot;value&quot;);
} // obj &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x435;&#x43D; &#x2192; &#x431;&#x443;&#x434;&#x435;&#x442; &#x443;&#x434;&#x430;&#x43B;&#x451;&#x43D; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x441; entry &#x438;&#x437; WeakMap
</code></pre><h3 id="%F0%9F%94%A3-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0%D0%B4-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8">&#x1F523; &#x41E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43D;&#x430;&#x434; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x430;&#x43C;&#x438;</h3><p>&#x412; JavaScript &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x435;&#x441;&#x442;&#x44C; &#x431;&#x443;&#x43B;&#x435;&#x432;&#x44B;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; <code>Set</code>:</p><pre><code class="language-js">const a = new Set([1, 2, 3, 4]);
const b = new Set([3, 4, 5, 6]);

a.union(b); // union() &#x2014; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x435;&#x43D;&#x438;&#x435;. Set(6) {1, 2, 3, 4, 5, 6}
a.intersection(b); // intersection() &#x2014; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435;. Set(2) {3, 4}
a.difference(b); // difference() &#x2014; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x441;&#x442;&#x44C;. Set(2) {1, 2}
a.symmetricDifference(b); // symmetricDifference() &#x2014; &#x441;&#x438;&#x43C;&#x43C;&#x435;&#x442;&#x440;&#x438;&#x447;&#x43D;&#x430;&#x44F; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x441;&#x442;&#x44C;. Set(4) {1, 2, 5, 6}
a.isDisjointFrom(b); // isDisjointFrom() &#x2014; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430;, &#x447;&#x442;&#x43E; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x430; &#x43D;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x435;&#x43A;&#x430;&#x44E;&#x442;&#x441;&#x44F;. false
a.isSubsetOf(b); // isSubsetOf() &#x2014; &#x43F;&#x43E;&#x434;&#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;. false
a.isSupersetOf(b); // isSupersetOf() &#x2014; &#x43D;&#x430;&#x434;&#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;. false
</code></pre><hr><p><a href="https://waspdev.com/articles/2025-04-06/features-that-every-js-developer-must-know-in-2025">&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; </a></p><p>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430;<a href="https://t.me/front_end_dev"> FrontEndDev</a> &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x43E;&#x432;&#x43E;&#x441;&#x442;&#x435;&#x439; &#x43E; web &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435;</p>]]></content:encoded></item><item><title><![CDATA[Дебажим мобильное веб приложение на Android-смартфоне]]></title><description><![CDATA[<p>&#x418;&#x43D;&#x43E;&#x433;&#x434;&#x430; &#x431;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x435;&#x431;&#x430;&#x436;&#x438;&#x442;&#x44C; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x43D;&#x430; &#x442;&#x435;&#x43B;</p>]]></description><link>https://jem-space.ru/mobile-degub-on-desktop/</link><guid isPermaLink="false">66f464a6af95c10001989dac</guid><category><![CDATA[web]]></category><category><![CDATA[js]]></category><category><![CDATA[chrome]]></category><category><![CDATA[debug]]></category><category><![CDATA[adb]]></category><category><![CDATA[andriod]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Wed, 25 Sep 2024 20:15:26 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.54.03-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.54.03-1.png" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;"><p>&#x418;&#x43D;&#x43E;&#x433;&#x434;&#x430; &#x431;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x435;&#x431;&#x430;&#x436;&#x438;&#x442;&#x44C; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x43D;&#x430; &#x442;&#x435;&#x43B;&#x435;&#x444;&#x43E;&#x43D;&#x435; &#x434;&#x43B;&#x44F; &#x447;&#x438;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x44D;&#x43A;&#x441;&#x43F;&#x435;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x442;&#x430;. Google Chrome &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43E;&#x442;&#x43B;&#x430;&#x434;&#x43A;&#x443; &#x43F;&#x43E; USB. &#x412;&#x43E;&#x442; &#x43F;&#x43E;&#x448;&#x430;&#x433;&#x43E;&#x432;&#x44B;&#x439; &#x442;&#x443;&#x442;&#x43E;&#x440;&#x438;&#x430;&#x43B; &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C;.</p><p>&#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x441;&#x43A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43C; <strong>adb</strong> (Android Debug Bridge). adb &#x432;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432; platform-tools. &#x421;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; <a href="https://developer.android.com/tools/releases/platform-tools?hl=ru#downloads">&#x43F;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435; </a> (&#x43B;&#x438;&#x431;&#x43E; &#x447;&#x435;&#x440;&#x435;&#x437; home brew &#x43D;&#x430; macOS).<br>&#x415;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D; Android SDK, &#x442;&#x43E; &#x441;&#x43A;&#x43E;&#x440;&#x435;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E; adb &#xA0;&#x443;&#x436;&#x435; &#x443; &#x432;&#x430;&#x441; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D; (&#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x438;&#x437; &#x43C;&#x435;&#x43D;&#x44E; SDK).</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x43C;, &#x447;&#x442;&#x43E; adb &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x435;&#x43D; &#x432; &#x442;&#x435;&#x440;&#x43C;&#x438;&#x43D;&#x430;&#x43B;&#x435;, &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x432; <em>adb</em>.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-26---00.03.10.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="754" height="300" srcset="https://jem-space.ru/content/images/size/w600/2024/09/--------------2024-09-26---00.03.10.png 600w, https://jem-space.ru/content/images/2024/09/--------------2024-09-26---00.03.10.png 754w" sizes="(min-width: 720px) 720px"></figure><p><br>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x434;&#x43E;&#x43A;&#x430;&#x436;&#x435;&#x43C; &#x432;&#x430;&#x448;&#x435;&#x43C;&#x443; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x443;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;. &#x41F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x432; &#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; - &#x41E; &#x442;&#x435;&#x43B;&#x435;&#x444;&#x43E;&#x43D;&#x435; - &#x41D;&#x43E;&#x43C;&#x435;&#x440; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x438; &#x438; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x43D;&#x435;&#x438;&#x441;&#x442;&#x43E;&#x432;&#x43E; &#x442;&#x430;&#x43F;&#x430;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x431;&#x443;&#x434;&#x442;&#x43E; &#x434;&#x43E; &#x43B;&#x438;&#x441;&#x442;&#x438;&#x43D;&#x433;&#x430; &#x445;&#x43E;&#x43C;&#x44F;&#x43A;&#x430; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x43E;&#x441;&#x44C; 5 &#x43C;&#x438;&#x43D;&#x443;&#x442;. &#x41F;&#x43E;&#x441;&#x43B;&#x435; 10 &#x440;&#x430;&#x437;&#x430;, &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x432;&#x430;&#x43C; &#x43F;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442; &#x438; &#x441;&#x43A;&#x430;&#x436;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x443; &#x432;&#x430;&#x441; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x43D;&#x44E; Developer Options, &#x433;&#x434;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C; USB debugging &#x438; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E;.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/image-1.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="576" height="782"></figure><p> &#x41E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x43E;, &#x432;&#x430;&#x448; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D; &#x433;&#x43E;&#x442;&#x43E;&#x432; &#x43A; &#x440;&#x430;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;!</p><p>&#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43C; &#x435;&#x433;&#x43E; &#x43A; &#x43A;&#x43E;&#x43C;&#x43F;&#x443;, &#x430; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C; <em>adb devices</em> &#x438; &#x443;&#x432;&#x438;&#x434;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x43E;&#x435;-&#x442;&#x43E; &#x43D;&#x435;&#x430;&#x432;&#x442;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x443;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; (&#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435;&#x442;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430; &#x442;&#x435;&#x43B;&#x435;&#x444;&#x43E;&#x43D;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x432;&#x438;&#x434; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A; &#x43A;&#x43E;&#x43C;&#x43F;&#x443; - &#x44D;&#x442;&#x43E; &#x437;&#x430;&#x440;&#x44F;&#x434;&#x43A;&#x430; &#x438;&#x43B;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x430; &#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432;. &#x412;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; USB debug). </p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---21.16.52.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="586" height="148"></figure><p>&#x41D;&#x430; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x432;&#x44B;&#x441;&#x43A;&#x43E;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x43F;&#x430;&#x43F; &#x43E; &#x440;&#x430;&#x437;&#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x438; &#x434;&#x435;&#x431;&#x430;&#x433;&#x430; &#x43F;&#x43E; USB - &#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x440;&#x430;&#x437;&#x440;&#x435;&#x448;&#x430;&#x44E;, &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x432; &#x433;&#x430;&#x43B;&#x43E;&#x447;&#x43A;&#x443; &quot;&#x412;&#x441;&#x435;&#x433;&#x434;&#x430; &#x440;&#x430;&#x437;&#x440;&#x435;&#x448;&#x430;&#x442;&#x44C; &#x441; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&quot;.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/image-2.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="576" height="368"></figure><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---21.17.01.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="538" height="126"></figure><p>&#x423;&#x440;&#x430;!</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x43D;&#x430; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x443; <a href="chrome://inspect/#devices">chrome://inspect/#devices</a>. &#x422;&#x430;&#x43C; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x443;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430; &#x438; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44B;&#x435; &#x432;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x438; &#x43D;&#x430; &#x43D;&#x438;&#x445; (&#x43E;&#x444;&#x438;&#x433;&#x435;&#x435;&#x43C; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x43A;&#x43B;&#x430;&#x434;&#x43E;&#x43A; &#x443; &#x43D;&#x430;&#x441; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x43E;). &#x41C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x442;&#x438; &#x432; &#x43B;&#x44E;&#x431;&#x443;&#x44E; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x43D;&#x430; &#x443;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x435;, &#x43F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x44F;&#x441;&#x44C; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x43A;&#x43E;&#x43C;&#x43F;&#x44C;&#x44E;&#x442;&#x435;&#x440;&#x435;. </p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.52.06.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="1556" height="1258" srcset="https://jem-space.ru/content/images/size/w600/2024/09/--------------2024-09-25---23.52.06.png 600w, https://jem-space.ru/content/images/size/w1000/2024/09/--------------2024-09-25---23.52.06.png 1000w, https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.52.06.png 1556w" sizes="(min-width: 720px) 720px"></figure><p>&#x41D;&#x43E; &#x43A;&#x430;&#x43A; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x435; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x43E; &#x43D;&#x430; localhost &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;?</p><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x448;&#x435;&#x43C; port forwarding (&#x441;&#x430;&#x43C;&#x430;&#x44F; &#x432;&#x435;&#x440;&#x445;&#x43D;&#x44F;&#x44F; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x430;). &#x41E;&#x442;&#x43A;&#x440;&#x43E;&#x435;&#x43C; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x438; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x448;&#x435;&#x43C; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; 6006: localhost:6006), &#x438; &#x43D;&#x435; &#x437;&#x430;&#x431;&#x443;&#x434;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x433;&#x430;&#x43B;&#x43E;&#x447;&#x43A;&#x443; &#x432;&#x43D;&#x438;&#x437;&#x443; &quot;&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; port forwarding&quot;.<br><br>&#x413;&#x43E;&#x442;&#x43E;&#x432;&#x43E;, &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435; http://localhost:6006 &#x43D;&#x430; &#x442;&#x435;&#x43B;&#x435;&#x444;&#x43E;&#x43D;&#x435; &#x438; &#x434;&#x435;&#x431;&#x430;&#x436;&#x44C;&#x442;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x43A;&#x43E;&#x43C;&#x43F;&#x435;.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.54.03.png" class="kg-image" alt="&#x414;&#x435;&#x431;&#x430;&#x436;&#x438;&#x43C; &#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; Android-&#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x435;" loading="lazy" width="2000" height="1094" srcset="https://jem-space.ru/content/images/size/w600/2024/09/--------------2024-09-25---23.54.03.png 600w, https://jem-space.ru/content/images/size/w1000/2024/09/--------------2024-09-25---23.54.03.png 1000w, https://jem-space.ru/content/images/size/w1600/2024/09/--------------2024-09-25---23.54.03.png 1600w, https://jem-space.ru/content/images/2024/09/--------------2024-09-25---23.54.03.png 2366w" sizes="(min-width: 720px) 720px"></figure><p>&#x421;&#x43F;&#x430;&#x441;&#x438;&#x431;&#x43E; &#x437;&#x430; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;!<br><br>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43A;&#x430;&#x43D;&#x430;&#x43B;&#x44B; &#x432; &#x442;&#x435;&#x43B;&#x435;&#x433;&#x440;&#x430;&#x43C; <a href="https://t.me/front_end_dev">FrontEndDev</a> &#x438; <a href="https://t.me/five_a_m">Sleepless Tech</a> &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442;&#x430; &#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435;.</p><!--kg-card-begin: html--><div id="marketWidget"></div><!--kg-card-end: html--><!--kg-card-begin: html--><!-- Yandex.Market Widget -->
<script async src="https://aflt.market.yandex.ru/widget/script/api" type="text/javascript"></script>
<script type="text/javascript">
    (function (w) {
        function start() {
            w.removeEventListener("YaMarketAffiliateLoad", start);
            w.YaMarketAffiliate.createWidget({type:"offers",
	containerId:"marketWidget",
	fallback:true,
	params:{clid:10901550,
		erid:"5jtCeReNx12oajt4ZxgC2Jp",
		searchText:"клавиатура беспроводная",
		themeId:1 } });
        }
        w.YaMarketAffiliate
            ? start()
            : w.addEventListener("YaMarketAffiliateLoad", start);
    })(window);
</script>
<!-- End Yandex.Market Widget -->
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Бекапим важные данные]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;! &#x412;&#x44B;&#x43D;&#x443;&#x436;&#x434;&#x435;&#x43D; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x443; &#x43D;&#x430; &#x441;&#x432;&#x43E;&#x435;&#x43C; vps c Ubuntu 18 &#x43D;&#x430; 20. &#x41F;&#x440;&#x438; &#x43E;&#x431;&#x43D;&#x43E;</p>]]></description><link>https://jem-space.ru/backups/</link><guid isPermaLink="false">66dcb5db763cd300015de05a</guid><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Sat, 07 Sep 2024 22:20:42 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/09/backup.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/09/backup.jpg" alt="&#x411;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x43C; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;"><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;! &#x412;&#x44B;&#x43D;&#x443;&#x436;&#x434;&#x435;&#x43D; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x443; &#x43D;&#x430; &#x441;&#x432;&#x43E;&#x435;&#x43C; vps c Ubuntu 18 &#x43D;&#x430; 20. &#x41F;&#x440;&#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x43E; &#x438;&#x434;&#x435;&#x435; &#x432;&#x441;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x43E;&#x441;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F;, &#x43F;&#x43E; &#x43A;&#x440;&#x430;&#x439;&#x43D;&#x435;&#x439; &#x43C;&#x435;&#x440;&#x435; &#x432; /home &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x438;. &#x41D;&#x43E; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x439;, &#x447;&#x442;&#x43E; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x431;&#x430;&#x437; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; Mongo &#x438; MYSQL, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; volume docker &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x43E;&#x432; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x437;&#x430;&#x442;&#x440;&#x43E;&#x43D;&#x443;&#x442;&#x44B; - &#x43D;&#x435;&#x442;. </p><p>&#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x437;&#x430;&#x431;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x442;&#x44C; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x436;&#x43D;&#x43E;.</p><h3 id="mongo">Mongo</h3><p>&#x414;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x431;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x431;&#x430;&#x437;&#x44B; &#x438;&#x437; &#x43C;&#x43E;&#x43D;&#x433;&#x438;, &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x441;&#x44F; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x43E;&#x439; <code>mongodump</code> (&#x435;&#x441;&#x43B;&#x438; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x431;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x443;&#x44E;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; --db mydatabasename)</p><pre><code class="language-bash">mongodump --host localhost --port 27017 --username adminUser --password MyPassword --authenticationDatabase admin --out ~/projects/mongo_bkp</code></pre><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x435;&#x449;&#x435; &#x441;&#x436;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x432; &#x430;&#x440;&#x445;&#x438;&#x432;</p><pre><code class="language-bash">mongodump --host localhost --port 27017 --username adminUser --password MyPassword --authenticationDatabase admin --gzip --archive=/path/to/backup/mydatabase.gz</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x430;&#x43A;&#x430;&#x442;&#x438;&#x442;&#x44C; &#x431;&#x435;&#x43A;&#x430;&#x43F;, &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443;:</p><pre><code>mongorestore --host localhost --port 27017 --drop ~/projects/mongo_bkp
</code></pre><p>&#x41A;&#x441;&#x442;&#x430;&#x442;&#x438; chatgpt &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x442; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x443;&#x44E; &#x434;&#x436;&#x43E;&#x431;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x431;&#x443;&#x434;&#x435;&#x442; &#x431;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x442;&#x44C; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x43E;&#x43C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430;</p><pre><code>#!/bin/bash
TIMESTAMP=$(date +&quot;%F&quot;)
BACKUP_DIR=&quot;/path/to/backup/$TIMESTAMP&quot;
mkdir -p $BACKUP_DIR
mongodump --host localhost --port 27017 --username adminUser --password MyPassword --authenticationDatabase admin --db mydatabase --out $BACKUP_DIR</code></pre><h3 id="wordpress">Wordpress</h3><p>Wordpress &#x43F;&#x43E;&#x434;&#x43D;&#x44F;&#x442;&#x44C; &#x432; &#x434;&#x43E;&#x43A;&#x435;&#x440; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x431;&#x435;&#x43A;&#x430;&#x43F;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x434;&#x43E;&#x43A;&#x435;&#x440;. &#x41D;&#x43E; &#x441;&#x443;&#x442;&#x44C; &#x43E;&#x441;&#x43E;&#x431;&#x43E; &#x43D;&#x435; &#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F;. &#x411;&#x443;&#x434;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x443; <code>mysqldump</code>. &#x41F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x430;&#x436;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F; ($MYSQL_ROOT_PASSWORD). &#x417;&#x434;&#x435;&#x441;&#x44C; db &#x2013; &#x44D;&#x442;&#x43E; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;.</p><pre><code class="language-bash">docker exec db sh -c &apos;exec mysqldump -uroot -p&quot;$MYSQL_ROOT_PASSWORD&quot; wordpress&apos; &gt; ~/projects/codeart-site/backup/wordpress.sql</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443;:</p><pre><code class="language-bash">cat ~/projects/codeart-site/backup/wordpress.sql | docker exec -i db sh -c &apos;exec mysql -uroot -p&quot;$MYSQL_ROOT_PASSWORD&quot; wordpress&apos;
</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43D;&#x435; &#x437;&#x430;&#x434;&#x430;&#x432;&#x430;&#x43B;&#x438; &#x438;&#x43C;&#x44F; &#x434;&#x43B;&#x44F; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; <code>wordpress</code> &#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435;.</p><h3 id="%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82-wordpress">&#x41A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442; Wordpress</h3><p>&#x414;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x433;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x430; (&#x432;&#x441;&#x435; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x438; &#x43C;&#x435;&#x434;&#x438;&#x430;) &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x438;&#x437; docker volume. &#x423; &#x43C;&#x435;&#x43D;&#x44F; &#x432; docker-compose &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; volume &#x434;&#x43B;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; <code>wordpress</code></p><p>volumes: <br>- wordpress:/var/www/html</p><p>&#x41F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x432; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E; volumes <code>docker volume ls</code> , &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x447;&#x442;&#x43E; volume &#x43D;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; codeartsite_wordpress. &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x43C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x43D;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442; codeartsite_wordpress &#x441;&#x435;&#x431;&#x435; &#x438; &#x431;&#x435;&#x43A;&#x430;&#x43F;&#x438;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; busybox tar:</p><pre><code class="language-bash">docker run --rm -v codeartsite_wordpress:/data -v ~/projects/codeart-site/backup:/backup busybox tar czf /backup/wordpress_content_backup.tar.gz -C /data wp-content</code></pre><p>&#x412;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439; </p><pre><code>docker run --rm -v codeartsite_wordpress:/data -v /path/to/backup:/backup busybox tar xzf /backup/wordpress_content_backup.tar.gz -C /data
</code></pre><h3 id="%D0%BA%D0%B0%D0%BA-%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D1%81-vps">&#x41A;&#x430;&#x43A; &#x441;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441; vps</h3><p>&#x421;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43D;&#x430; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x442;&#x430;&#x447;&#x43A;&#x443;. &#x415;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x432;: &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x447;&#x435;&#x440;&#x435;&#x437; sftp &#x447;&#x435;&#x440;&#x435;&#x437; &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43D;&#x438;&#x442;&#x44C; TotalCommander &#x438;&#x43B;&#x438; FileZilla, &#x43B;&#x438;&#x431;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; scp:</p><pre><code class="language-bash">scp usename@ip_address:~/projects/codeart-site/backup/wordpress_content_backup.tar.gz  ~/Documents/vps_backup</code></pre><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x432;&#x441;&#x435;! &#x412;&#x441;&#x435;&#x43C; &#x443;&#x434;&#x430;&#x447;&#x438; &#x432; &#x431;&#x435;&#x43A;&#x430;&#x43F;&#x430;&#x445; &#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;&#x445;!)</p>]]></content:encoded></item><item><title><![CDATA[Деплоим приложение с Dokku]]></title><description><![CDATA[<p>&#x427;&#x430;&#x441;&#x442;&#x43E; &#x445;&#x43E;&#x447;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x43D;&#x430;&#x43B;&#x430;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x432;&#x43E;&#x438;&#x445; &#x43F;&#x435;</p>]]></description><link>https://jem-space.ru/dokku-deploy/</link><guid isPermaLink="false">66c72d28b6a693000150f73d</guid><category><![CDATA[devops]]></category><category><![CDATA[nodejs]]></category><category><![CDATA[dokku]]></category><category><![CDATA[web]]></category><category><![CDATA[telegram]]></category><category><![CDATA[vps]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Fri, 23 Aug 2024 10:52:21 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/08/dokku.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/08/dokku.png" alt="&#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; Dokku"><p>&#x427;&#x430;&#x441;&#x442;&#x43E; &#x445;&#x43E;&#x447;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x43D;&#x430;&#x43B;&#x430;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x432;&#x43E;&#x438;&#x445; &#x43F;&#x435;&#x442;-&#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432;. &#x421; &#x43A;&#x430;&#x43A;&#x438;&#x43C;&#x438;-&#x442;&#x43E; &#x441;&#x435;&#x440;&#x44C;&#x435;&#x437;&#x43D;&#x44B;&#x43C;&#x438; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430; Jenkins &#x437;&#x430;&#x43C;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435; &#x445;&#x43E;&#x447;&#x435;&#x442;&#x441;&#x44F;. &#x415;&#x441;&#x442;&#x44C; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x44B;: Github Actions | rsync | Dokku. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x436;&#x443; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E; Dokku, &#x43E; &#x442;&#x43E;&#x43C; &#x43A;&#x430;&#x43A; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x438; &#x437;&#x430;&#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x435; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; Telegram &#x431;&#x43E;&#x442;&#x430; @<a href="https://t.me/ytb_cover_bot">ytb_cover_bot</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43A;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x441; &#x43F;&#x440;&#x435;&#x432;&#x44C;&#x44E;&#x448;&#x43A;&#x443; &#x441; &#x432;&#x438;&#x434;&#x435;&#x43E; youtube &#x438;&#x43B;&#x438; &#x442;&#x440;&#x435;&#x43A;&#x430; youtube music. &#x41E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44E;&#x441;&#x44C;, &#x447;&#x442;&#x43E; &#x434;&#x43B;&#x44F; &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439; (&#x431;&#x43E;&#x442;&#x43E;&#x432;) &#x435;&#x441;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x44F; &#x441;&#x43F;&#x435;&#x446;&#x438;&#x444;&#x438;&#x43A;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x437;&#x430;&#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x43C; &#x438; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x439; &#x432;&#x435;&#x431; &#x441;&#x430;&#x439;&#x442;.<br><br><a href="https://dokku.com/">Dokku</a> - &#x44D;&#x442;&#x43E; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x439; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x438; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x44C; &#x432;&#x430;&#x448;&#x438; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x430;&#x43A; &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x432;&#x44B; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x43B;&#x438; &#x43D;&#x430; Heroku, &#x43D;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;. &#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x443;&#x448;&#x435;&#x43C; &#x432; &#x440;&#x435;&#x43C;&#x43E;&#x443;&#x442; &#x432;&#x435;&#x442;&#x43A;&#x443; dokku (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x445;&#x43E;&#x441;&#x442;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;) &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439; git push. &#x41F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x43B;&#x43E;&#x433;&#x438; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x441;&#x440;&#x430;&#x437;&#x443; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x438;. &#x423; dokku &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x438;&#x447;&#x435;&#x439; &#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43A;, &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x436;&#x443; &#x43B;&#x438;&#x448;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E; &#x431;&#x430;&#x437;&#x43E;&#x432;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x43C;&#x43D;&#x435; &#x445;&#x432;&#x430;&#x442;&#x430;&#x435;&#x442;.</p><h3 id="%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0">&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430;</h3><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43A;&#x430;&#x43A; standalone &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;, <a href="https://dokku.com/docs/getting-started/install/docker/">&#x442;&#x430;&#x43A; &#x438; &#x432; &#x434;&#x43E;&#x43A;&#x435;&#x440;&#x435;</a>. &#x42F; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43B; &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; (&#x442;.&#x43A;. &#x441; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x431;&#x44B;&#x43B;&#x438; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x437;-&#x437;&#x430; &#x441;&#x43A;&#x440;&#x43E;&#x43C;&#x43D;&#x44B;&#x445; &#x441;&#x432;&#x43E;&#x431;&#x43E;&#x434;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432; &#x43C;&#x43E;&#x435;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;) .</p><p>&#x41F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D; <a href="https://dokku.com/docs/getting-started/install/docker/">&#x442;&#x443;&#x442;</a>, &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;, &#x434;&#x443;&#x43C;&#x430;&#x44E;, &#x43D;&#x435;&#x442; &#x441;&#x43C;&#x44B;&#x441;&#x43B;&#x430;. &#x41E;&#x431;&#x440;&#x430;&#x449;&#x443; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43D;&#x435; &#x437;&#x430;&#x431;&#x44B;&#x442;&#x44C; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44C; &#x43F;&#x43E;&#x440;&#x442;&#x44B; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x44B; &#x434;&#x43B;&#x44F; dokku &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; 3022, 8080, 8443.</p><h3 id="%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-dokku">&#x41F;&#x435;&#x440;&#x432;&#x43E;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; dokku</h3><p>&#x41D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x437;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; (&#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x438; &#x432; &#x434;&#x43E;&#x43A;&#x435;&#x440;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x442;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x439;&#x442;&#x435; &#x432;&#x441;&#x435; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B; &#x432; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x438;):</p><pre><code class="language-bash">docker exec -it dokku bash</code></pre><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x43A;&#x441;&#x442;&#x430;&#x442;&#x438; &#x432; &#x430;&#x43B;&#x438;&#x430;&#x441;&#x44B; &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443;:</p><pre><code>nano ~/.bash_aliases
alias dokku=&quot;docker exec -it dokku dokku&quot; # add this line then re-login with your linux account
</code></pre><p>&#x414;&#x43B;&#x44F; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430; &#x43A; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x434;&#x43B;&#x44F; dokku &#x436;&#x435;&#x43B;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x434;&#x43E;&#x43C;&#x435;&#x43D; (&#x43E;&#x434;&#x438;&#x43D; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439;). &#x42D;&#x442;&#x43E; <a href="https://dokku.com/docs/getting-started/installation/#system-requirements">&#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x448;&#x430;&#x433;</a>, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x443;&#x43F;&#x440;&#x43E;&#x449;&#x430;&#x435;&#x442; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; (&#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44C;&#x442;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; Wildcard domain *.domain.tld A Record &#x443; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x434;&#x43E;&#x43C;&#x435;&#x43D; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x430;):</p><pre><code>domains:add-global jem-art.ru</code></pre><p>&#x412; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x443;&#x434;&#x443;&#x442; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B; &#x43F;&#x43E; &#x430;&#x434;&#x440;&#x435;&#x441;&#x443; scheme://app-name.jem-art.ru </p><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; (&#x43A;&#x430;&#x43A; &#x438; &#x44F;) &#x441;&#x43F;&#x443;&#x441;&#x442;&#x44F; &#x43A;&#x430;&#x43A;&#x43E;&#x435; &#x442;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x437;&#x430;&#x431;&#x44B;&#x43B;&#x438; &#x43A; &#x43A;&#x430;&#x43A;&#x43E;&#x43C;&#x443; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x443; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43B;&#x438; dokku, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x435; domains &#x434;&#x43B;&#x44F; &#x43B;&#x44E;&#x431;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439;</p><pre><code class="language-bash">dokku domains:report app-name</code></pre><p>Domains app enabled: &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; true<br>Domains app vhosts: &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;ytb-image-bot.jem-art.ru<br>Domains global enabled: &#xA0; &#xA0; &#xA0; &#xA0;true<br>Domains global vhosts: &#xA0; &#xA0; &#xA0; &#xA0; jem-art.ru</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; ssh &#x43A;&#x43B;&#x44E;&#x447; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43A;&#x43E;&#x43C;&#x43F;&#x44C;&#x44E;&#x442;&#x435;&#x440;&#x435; &#x43E;&#x442;&#x43A;&#x443;&#x434;&#x430; &#x432;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x442;&#x435; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x44C; (&#x447;&#x442;&#x43E;&#x431;&#x44B; &#x430;&#x431;&#x44B; &#x43A;&#x442;&#x43E; &#x43D;&#x435; &#x43C;&#x43E;&#x433; &#x43F;&#x443;&#x448;&#x438;&#x442;&#x44C; &#x432; &#x432;&#x430;&#x448; dokku)</p><pre><code class="language-bash">ssh-keygen -f dokku_rsa</code></pre><p>&#x421;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442; &#x43A;&#x43B;&#x44E;&#x447;&#x430; <code>cat dokku_rsa.pub</code></p><p>&#x418; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x435;&#x433;&#x43E; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x432; dokku</p><pre><code class="language-bash">echo &quot;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCs6DIF bla bla bla&quot; | dokku ssh-keys:add dokku_rsa</code></pre><p>&#x422;.&#x43A;. &#x43C;&#x43E;&#x439; dokku &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D; &#x43F;&#x43E;&#x434; &#x434;&#x43E;&#x43A;&#x435;&#x440;&#x43E;&#x43C;, &#x442;&#x43E; &#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D; &#x43C;&#x430;&#x43F;&#x43F;&#x438;&#x43D;&#x433; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; 3022 (&#x441;&#x435;&#x440;&#x432;&#x435;&#x440;) -&gt; 22 (&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;) &#x438; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x440;&#x435;&#x437;&#x43E;&#x43B;&#x432;&#x438;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x43E;&#x439; ssh &#x445;&#x43E;&#x441;&#x442;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x432; ~/.ssh/config &#x43D;&#x430; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43A;&#x43E;&#x43C;&#x43F;&#x435;:</p><pre><code class="language-bash">Host dokku.docker 
HostName 104.131.22.43 
Port 3022  
IdentityFile ~/.ssh/dokku_rsa</code></pre><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;</h3><p>&#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x43D;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; ytb-image-bot</p><pre><code class="language-bash">dokku apps:create ytb-image-bot</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; remote &#x432; git </p><pre><code class="language-bash">git remote add dokku dokku@dokku.docker:ytb-image-bot</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x438; <code>git push dokku master</code> &#x443; &#x43D;&#x430;&#x441; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x442;&#x430;&#x440;&#x442;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x439; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;. &#x421;&#x442;&#x430;&#x440;&#x442;&#x430;&#x43D;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x447;&#x443;&#x442;&#x44C; &#x43F;&#x43E;&#x437;&#x436;&#x435;, &#x430; &#x43F;&#x43E;&#x43A;&#x430; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x435;&#x449;&#x435; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438;.</p><p>&#x412; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x438; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; Procfile &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; &#x43D;&#x430;&#x434;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x422;.&#x43A;. &#x443; &#x43C;&#x435;&#x43D;&#x44F; telegram &#x431;&#x43E;&#x442;, &#x430; &#x43D;&#x435; &#x432;&#x435;&#x431;-&#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x442;&#x43E; &#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E; <code>worker</code>: <code>worker: yarn start</code><br><br>&#x415;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x44D;&#x442;&#x43E; &#x431;&#x44B;&#x43B; &#x432;&#x435;&#x431;-&#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x443; <code>web</code> - &#x43F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; dokku &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x43F;&#x438;&#x43D;&#x433; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; &#x43D;&#x430; &#x43F;&#x43E;&#x440;&#x442; 5000 &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; (&#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x445;&#x43E;&#x447;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x442;&#x43E; &#x434;&#x43E;&#x43F; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x442;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x441;&#x43B;&#x443;&#x448;&#x430;&#x43B; &#x43F;&#x43E;&#x440;&#x442; 5000).</p><p>&#x41D;&#x435; &#x437;&#x430;&#x431;&#x443;&#x434;&#x435;&#x43C; &#x441;&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; dokku &#x43D;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; worker</p><pre><code>dokku ps:scale ytb-image-bot worker=1</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x435; env &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439; &#x441; &#x444;&#x43B;&#x430;&#x433;&#x43E;&#x43C; --no-restart &#x447;&#x435;&#x440;&#x435;&#x437; &#x43F;&#x440;&#x43E;&#x431;&#x435;&#x43B; (&#x431;&#x435;&#x437; &#x444;&#x43B;&#x430;&#x433;&#x430; dokku &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x435;&#x449;&#x435; &#x43D;&#x435;&#x442; &#x438; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x442;&#x430;&#x43A; &#x438; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;)</p><pre><code>dokku config:set ytb-image-bot --no-restart TG_TOKEN=YOUR_TOKEN MONGOURL=mongo://blabla21</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x431;&#x435;&#x43B;&#x44B; &#x438;&#x43B;&#x438; &#x441;&#x43F;&#x435;&#x446; &#x441;&#x438;&#x43C;&#x432;&#x43E;&#x43B;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; bash &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43F;&#x440;&#x435;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43F;&#x43E; &#x441;&#x432;&#x43E;&#x435;&#x43C;&#x443;, &#x442;&#x43E; &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x438;&#x442;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x432; &#x43E;&#x434;&#x438;&#x43D;&#x430;&#x440;&#x43D;&#x44B;&#x435; &#x43A;&#x430;&#x432;&#x44B;&#x447;&#x43A;&#x438;.</p><p>&#x41F;&#x43E; &#x434;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x443; dokku &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x43D;&#x435; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x443;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x43E; &#x443; &#x43C;&#x435;&#x43D;&#x44F; telegram &#x431;&#x43E;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x43E; long-polling. &#x418; &#x435;&#x441;&#x43B;&#x438; &#x431;&#x443;&#x434;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x43E; 2 &#x438;&#x43D;&#x441;&#x442;&#x430;&#x43D;&#x441;&#x430; &#x441; &#x43E;&#x434;&#x43D;&#x438;&#x43C; &#x438; &#x442;&#x435;&#x43C; &#x436;&#x435; &#x43A;&#x43B;&#x44E;&#x447;&#x43E;&#x43C;, &#x442;&#x43E; &#x431;&#x443;&#x434;&#x443;&#x442; &#x441;&#x44B;&#x43F;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;, &#x438; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; dokku &#x43F;&#x440;&#x435;&#x440;&#x432;&#x435;&#x442; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x439; &#x43D;&#x43E;&#x432;&#x43E;&#x439; &#x432;&#x435;&#x440;&#x441;&#x438;&#x438;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43C; zerodowntime</p><pre><code class="language-bash">dokku checks:disable ytb-image-bot</code></pre><p> &#x414;&#x43B;&#x44F; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x445; &#x432;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439; zerodowntime, &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x442;&#x43E;&#x43F; &#x444;&#x438;&#x447;&#x430;.</p><p>&#x412;&#x43E;&#x442; &#x438; &#x432;&#x441;&#x435;, &#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x43A;&#x43E;&#x43C;&#x438;&#x442; &#x438; &#x43F;&#x443;&#x448;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x432; dokku <code>git push dokku master</code></p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/08/--------------2024-08-23---04.49.00.png" class="kg-image" alt="&#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; Dokku" loading="lazy" width="1400" height="488" srcset="https://jem-space.ru/content/images/size/w600/2024/08/--------------2024-08-23---04.49.00.png 600w, https://jem-space.ru/content/images/size/w1000/2024/08/--------------2024-08-23---04.49.00.png 1000w, https://jem-space.ru/content/images/2024/08/--------------2024-08-23---04.49.00.png 1400w" sizes="(min-width: 720px) 720px"></figure><p>&#x420;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x438;. &#x422; &#x43A; &#x443; &#x43D;&#x430;&#x441; &#x43D;&#x435; web-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x442;&#x43E; <a href="https://ytb-image-bot.jem-art.ru/">https://ytb-image-bot.jem-art.ru/</a> &#x443; &#x43D;&#x430;&#x441; &#x43D;&#x435; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442;. &#x417;&#x430;&#x442;&#x43E; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; <a href="https://t.me/ytb_cover_bot">@ytb_cover_bot</a> &#x1F60A; (&#x43A;&#x430;&#x43A; &#x438; <a href="https://t.me/aiko_tiktok_download_bot">@aiko_tiktok_download_bot</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x442;&#x430;&#x43A;&#x438;&#x43C; &#x436;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x43C;).</p><h3 id="%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B8%D0%BC-%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5">&#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x43C; &#x432;&#x435;&#x431;-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;</h3><p>&#x41E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x432;&#x435;&#x431; &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;.<br>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x43A;&#x430;&#x43A; &#x438; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x439;:</p><pre><code>dokku apps:create web-test</code></pre><p>&#x41D;&#x430; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43A;&#x43E;&#x43C;&#x43F;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x440;&#x435;&#x43C;&#x43E;&#x443;&#x442;:</p><pre><code class="language-bash">git remote add dokku dokku@dokku.docker:web-test</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; Procfile &#x441; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43E;&#x439; web: <code>web: yarn start</code> &#x438;&#x43B;&#x438; <code>web: node index.js</code></p><p>&#x41F;&#x443;&#x448;&#x430;&#x435;&#x43C; <code>git push dokku master</code><br><br><a href="https://web-test.jem-art.ru/">&#x41D;&#x430;&#x441;&#x43B;&#x430;&#x436;&#x434;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x43E;&#x43C;</a> &#x1F60A; (&#x44F; &#x43B;&#x435;&#x43D;&#x438;&#x432;&#x430;&#x44F; &#x436;&#x43E;&#x43F;&#x430; &#x43D;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x434;&#x43B;&#x44F; * &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x43E;&#x432;, &#x43D;&#x43E; &#x43F;&#x43E; http &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;) .</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/08/--------------2024-08-23---14.37.12.png" class="kg-image" alt="&#x414;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; Dokku" loading="lazy" width="1086" height="664" srcset="https://jem-space.ru/content/images/size/w600/2024/08/--------------2024-08-23---14.37.12.png 600w, https://jem-space.ru/content/images/size/w1000/2024/08/--------------2024-08-23---14.37.12.png 1000w, https://jem-space.ru/content/images/2024/08/--------------2024-08-23---14.37.12.png 1086w" sizes="(min-width: 720px) 720px"></figure><p>&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x43E;&#x439; <a href="https://t.me/five_a_m">&#x43A;&#x430;&#x43D;&#x430;&#x43B; &#x432; Telegram</a>, &#x433;&#x434;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E; &#x43F;&#x440;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x438; &#x43D;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E;.<br>&#x412;&#x441;&#x435;&#x43C; &#x443;&#x434;&#x430;&#x447;&#x438; &#x270C;&#xFE0F;</p><!--kg-card-begin: html--><div id="marketWidget"></div><!--kg-card-end: html--><!--kg-card-begin: html--><!-- Yandex.Market Widget -->
<script async src="https://aflt.market.yandex.ru/widget/script/api" type="text/javascript"></script>
<script type="text/javascript">
    (function (w) {
        function start() {
            w.removeEventListener("YaMarketAffiliateLoad", start);
            w.YaMarketAffiliate.createWidget({type:"models",
	containerId:"marketWidget",
	fallback:true,
	params:{clid:10901550,
		erid:"5jtCeReNx12oajt4ZxgCMZR",
		searchText:"ноутбук",
		themeId:3 } });
        }
        w.YaMarketAffiliate
            ? start()
            : w.addEventListener("YaMarketAffiliateLoad", start);
    })(window);
</script>
<!-- End Yandex.Market Widget -->
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Обновление TLS сертификатов]]></title><description><![CDATA[<p>&#x418;&#x43B;&#x438; &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x44F; &#x43D;&#x435; &#x43B;&#x44E;&#x431;&#x438;&#x43B; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x441; certbot.</p><p>&#x41F;&#x43E; &#x441;&#x432;&#x43E;&#x435;&#x439; &#x43D;&#x430;&#x442;&#x443;&#x440;&#x435;, &#x44F; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A; &#x43E;&#x447;</p>]]></description><link>https://jem-space.ru/renew-tls/</link><guid isPermaLink="false">66a80d78780f9e000122de9f</guid><category><![CDATA[web]]></category><category><![CDATA[certbot]]></category><category><![CDATA[js]]></category><category><![CDATA[wordpress]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Mon, 29 Jul 2024 23:20:46 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/07/eff-certbot-lockup.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/07/eff-certbot-lockup.png" alt="&#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; TLS &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432;"><p>&#x418;&#x43B;&#x438; &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x44F; &#x43D;&#x435; &#x43B;&#x44E;&#x431;&#x438;&#x43B; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x441; certbot.</p><p>&#x41F;&#x43E; &#x441;&#x432;&#x43E;&#x435;&#x439; &#x43D;&#x430;&#x442;&#x443;&#x440;&#x435;, &#x44F; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x442;&#x43E;&#x440;&#x43E;&#x43F;&#x43B;&#x438;&#x432;&#x44B;&#x439;. &#x415;&#x441;&#x43B;&#x438; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x438; &#x43D;&#x435; &#x432;&#x43D;&#x438;&#x43A;&#x430;&#x44F; &#x432; &#x441;&#x443;&#x442;&#x44C; (&#x43F;&#x43E; &#x43A;&#x430;&#x43A;&#x43E;&#x43C;&#x443; &#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x442;&#x443;&#x442;&#x43E;&#x440;&#x438;&#x430;&#x43B;&#x443; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;), &#x442;&#x43E; &#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x440;&#x430;&#x434;. &#x421;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x438; &#x437;&#x430;&#x431;&#x44B;&#x43B; &#x438; &#x436;&#x435;&#x43B;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x435; &#x434;&#x443;&#x43C;&#x430;&#x442;&#x44C; &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x442;&#x43E; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43E;&#x43F;&#x44F;&#x442;&#x44C;. &#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E;, &#x447;&#x430;&#x441;&#x442;&#x43E; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E; &#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x43A;&#x430;&#x43A;&#x430;&#x44F; &#x442;&#x43E; &#x43E;&#x441;&#x43E;&#x431;&#x430;&#x44F; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44F; &#x432; &#x43F;&#x43B;&#x430;&#x43D;&#x435; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x438; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43D;&#x430; &#x43D;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x432;&#x43E;&#x442; &#x44D;&#x442;&#x430;. <br><br>&#x415;&#x441;&#x442;&#x44C; docker &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x441; wordpress &#x438; docker &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x441; nginx. &#x420;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x44E;&#x442; &#x43E;&#x43D;&#x438; &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;, &#x442;&#x430;&#x43A; &#x441;&#x43B;&#x43E;&#x436;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x438;&#x441;&#x442;&#x43E;&#x440;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;. &#x418; &#x43A;&#x43E;&#x433;&#x434;&#x430;-&#x442;&#x43E; &#x43A;&#x430;&#x43A;-&#x442;&#x43E; &#x44F; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; letsencrypt &#x438; &#x432;&#x43E;&#x442; &#x43F;&#x43E;&#x440;&#x430; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x438;&#x445; &#x441;&#x43D;&#x43E;&#x432;&#x430;. &#x422;&#x430;&#x43A; &#x432; &#x447;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;?</p><h3 id="%D0%BD%D0%B5%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B3%D0%B4%D0%B5-%D0%BB%D0%B5%D0%B6%D0%B0%D1%82-%D1%8D%D1%82%D0%B8-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D1%8B-%D1%81%D0%B5%D0%B9%D1%87%D0%B0%D1%81-%D0%B8-%D0%BE%D1%82%D0%BA%D1%83%D0%B4%D0%B0-%D0%BE%D0%BD%D0%B8-%D0%B1%D0%B5%D1%80%D1%83%D1%82%D1%81%D1%8F">&#x41D;&#x435;&#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x433;&#x434;&#x435; &#x43B;&#x435;&#x436;&#x430;&#x442; &#x44D;&#x442;&#x438; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x438; &#x43E;&#x442;&#x43A;&#x443;&#x434;&#x430; &#x43E;&#x43D;&#x438; &#x431;&#x435;&#x440;&#x443;&#x442;&#x441;&#x44F;.</h3><p>&#x422;&#x430;&#x43A; &#x432;&#x44B;&#x448;&#x43B;&#x43E; &#x447;&#x442;&#x43E; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x431;&#x44B;&#x43B;&#x438; &#x432;&#x44B;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x44B; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; docker &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; certbot. &#x418; &#x436;&#x43E;&#x43D;&#x433;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x432;&#x43E;&#x43B;&#x44E;&#x43C;&#x430;&#x43C;&#x438; &#x438; &#x444;&#x430;&#x439;&#x43B;&#x430;&#x43C;&#x438; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x43D;&#x438;&#x43C;&#x438; (&#x434;&#x43B;&#x44F; &#x43C;&#x435;&#x43D;&#x44F;) &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x443;&#x436;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x43C;. &#x41D;&#x430;&#x434;&#x43E; &#x43A;&#x430;&#x43A;-&#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43A;&#x438;&#x43D;&#x443;&#x442;&#x44C; &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x432; (&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x432; &#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x43C;&#x438;&#x448;&#x435;&#x43D;&#x44B; &#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438; &#x43D;&#x430; &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x439;) &#x43C;&#x435;&#x436;&#x434;&#x443; &#x432;&#x43E;&#x43B;&#x44C;&#x44E;&#x43C;&#x430;&#x43C;&#x438; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x43E;&#x432; certbot &#x438; nginx. &#x41A;&#x430;&#x43A;&#x438;&#x43C;-&#x442;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C; &#x44F; &#x44D;&#x442;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x438; &#x443;&#x436;&#x435; &#x43D;&#x435; &#x43F;&#x43E;&#x43C;&#x43D;&#x44E; &#x43A;&#x430;&#x43A;.</p><h3 id="%D0%BD%D0%B5%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-certbot">&#x41D;&#x435;&#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; certbot</h3><p>&#x41F;&#x440;&#x438; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x435; &#x43D;&#x430;&#x445;&#x440;&#x430;&#x43F;&#x43E;&#x43C; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x435;&#x43D;&#x44C;&#x43A;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x442;&#x44B;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x448;&#x44C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;, &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x431;&#x438;&#x440;&#x430;&#x442;&#x44C; &#x441; &#x433;&#x443;&#x433;&#x43B;&#x43E;&#x43C; &#x438;&#x43B;&#x438; &#x447;&#x430;&#x442;&#x43E;&#x43C; &#x433;&#x43F;&#x442;. + &#x435;&#x449;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x434;&#x43E;&#x43A;&#x435;&#x440; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x443;&#x437;&#x430; &#x434;&#x43B;&#x44F; nginx + &#x441;&#x430;&#x43C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; nginx + &#x435;&#x449;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x448;&#x430;&#x440;&#x438;&#x43D;&#x433;&#x430; volume &#x43C;&#x435;&#x436;&#x434;&#x443; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;&#x43C;&#x438;. &#x422;&#x42C;&#x41C;&#x410;!</p><p>&#x421;&#x435;&#x439;&#x447;&#x430;&#x441; &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x431;&#x443;&#x435;&#x43C; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x438; &#x440;&#x430;&#x437;&#x43B;&#x43E;&#x436;&#x438;&#x442;&#x44C; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E; &#x43F;&#x43E;&#x43B;&#x43A;&#x430;&#x43C;.</p><p>&#x415;&#x441;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; docker-compose &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430; &#x43D;&#x430; wordpress:</p><pre><code class="language-yml">version: &apos;3&apos;

services:
  db:
    image: mysql:8.0
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=wordpress
    volumes:
      - dbdata:/var/lib/mysql
    command: &apos;--default-authentication-plugin=mysql_native_password --table-definition-cache=200&apos;
    networks:
      - app-network
    cap_add:
      - SYS_NICE

  wordpress:
    depends_on:
      - db
    image: wordpress:5.1.1-fpm-alpine
    container_name: wordpress
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - app-network

volumes:
  wordpress:
  dbdata:

networks:
  app-network:
    driver: bridge</code></pre><p>&#x413;&#x434;&#x435; &#x43C;&#x44B; &#x432;&#x438;&#x434;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x435;&#x441;&#x442;&#x44C; volume <code>wordpress</code>. &#x417;&#x430;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43B;&#x438;.</p><p>&#x415;&#x441;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; docker-compose &#x434;&#x43B;&#x44F; nginx:</p><pre><code class="language-yml">version: &apos;3&apos;
services:
  web:
    image: nginx-ssl-preread
    volumes:
      - codeartsite_wordpress:/var/www/html
      - /etc/letsencrypt:/etc/letsencrypt
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./modules-enabled:/etc/nginx/modules-enabled
    ports:
      - &quot;80:80&quot;
      - &quot;4443:4443&quot;
      - &quot;8444:8444&quot;
      - &quot;1337:1338&quot;
    networks:
      - codeartsite_app-network
    command: [nginx-debug, &apos;-g&apos;, &apos;daemon off;&apos;]

volumes:
  codeartsite_wordpress:
    external: true

networks:
  codeartsite_app-network:
    external: true</code></pre><p>&#x423; &#x43D;&#x435;&#x433;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43C;&#x430;&#x43F;&#x438;&#x43D;&#x433; <code>codeartsite_wordpress:/var/www/html</code>.</p><p>&#x42D;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;, &#x447;&#x442;&#x43E; volume <code>wordpress</code>, &#x43E;&#x431;&#x44A;&#x44F;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x435; codeartsite &#x43C;&#x430;&#x43F;&#x438;&#x442;&#x441;&#x44F; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; &#x43F;&#x43E; &#x43F;&#x443;&#x442;&#x438; <code>/var/www/html</code>. &#x417;&#x430;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43B;&#x438;.</p><p>&#x418; &#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;, &#x435;&#x441;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x43C;&#x43E;&#x433;&#x43E; nginx:</p><pre><code class="language-yml">server {
    listen 80;
    listen [::]:80;
    client_max_body_size 12m;
    server_name jem-art.ru www.jem-art.ru;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html/wordpress;
    }

    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }
}</code></pre><p>&#x427;&#x442;&#x43E; &#x442;&#x443;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;&#x433;&#x43E;? &#xA0;<code>location ~ /.well-known/acme-challenge</code>- &#x44D;&#x442;&#x430; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x430; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x430; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x435;.</p><p>&#x422; &#x435;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x442;&#x435; certbot &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442; &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x430; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439;</p><p><code>sudo certbot certonly --webroot -w /var/www/html/ --email test<a>@gmail.com</a> --agree-tos --no-eff-email -d jem-art.ru -d www.jem-art.ru</code></p><p>&#x422;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x430;, &#x43F;&#x435;&#x440;&#x435;&#x434; &#x442;&#x435;&#x43C; &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x43F;&#x43E; &#x43F;&#x443;&#x442;&#x438; /etc/letsencrypt/..., certbot &#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x438;&#x442; &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x442;&#x43E; &#x43A;&#x43B;&#x44E;&#x447; (&#x43D;&#x435; &#x443;&#x432;&#x435;&#x440;&#x435;&#x43D; &#x43A;&#x430;&#x43A;&#x43E;&#x439;, &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x438; &#x441;&#x430;&#x43C; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;, &#x43D;&#x435; &#x441;&#x443;&#x442;&#x44C;) &#x43F;&#x43E; &#x43F;&#x443;&#x442;&#x438; /var/www/html, &#x438; &#x43F;&#x43E;&#x439;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x43C; &#x43D;&#x430; <code>http://<code>jem-art.ru</code>/.well-known/acme-challenge</code>, &#x430; &#x432;&#x430;&#x448; nginx &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x438;&#x442;&#x44C; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p><p>&#x412;&#x43E;&#x442; &#x442;&#x443;&#x442; &#x438; &#x43F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x43C;&#x43E;&#x44F; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;. &#x42F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x44E; 404 &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p><pre><code>Domain: www.jem-art.ru
  Type:   unauthorized
  Detail: 104.248.43.82: Invalid response from http://www.jem-art.ru/.well-known/acme-challenge/P0hEw2RfnX8gJYFwTz-NzRTbBYOwiUmbHhE7gpVqaC0: 404</code></pre><p>&#x41F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; - &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x44F; <code>/var/www/html/ </code> &#x43D;&#x435; &#x441;&#x43C;&#x43E;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x430; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; nginx. &#x42F; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x43A;&#x43B;&#x430;&#x434;&#x443; &#x432; &#xA0;<code>/var/www/html/</code> , &#x430; &#x432; nginx &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F;. &#x412;&#x441;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x43E;, &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43C; nginx &#x440;&#x430;&#x437;&#x434;&#x430;&#x435;&#x442; &#x443; &#x441;&#x435;&#x431;&#x44F; &#x432;&#x441;&#x435;, &#x447;&#x442;&#x43E; &#x43B;&#x435;&#x436;&#x438;&#x442; &#x432; <code>codeartsite_wordpress</code>. &#x41A;&#x430;&#x43A; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x43D;&#x430; &#x434;&#x438;&#x441;&#x43A;&#x435; &#x443; &#x44D;&#x442;&#x43E;&#x433;&#x43E; volume? &#x41D;&#x435;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;</p><p><code>docker volume ls</code> - &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x432;&#x441;&#x435;&#x445; &#x432;&#x43E;&#x43B;&#x44E;&#x43C;&#x43E;&#x432; (&#x432;&#x438;&#x434;&#x438;&#x43C; &#x43D;&#x430;&#x448;)</p><p><code>docker volume inspect codeartsite_wordpress</code> - &#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438;</p><p>&#x410; &#x432;&#x43E;&#x442; &#x438; &quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/codeartsite_wordpress/_data&quot;</p><p>&#x414;&#x430;, &#x43D;&#x430;&#x432;&#x435;&#x440;&#x43D;&#x43E;, &#x43D;&#x435; &#x441;&#x43E;&#x432;&#x441;&#x435;&#x43C; &#x43A;&#x440;&#x430;&#x441;&#x438;&#x432;&#x43E;, &#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x443;&#x442;&#x44C; &#x434;&#x43B;&#x44F; certbot.<br><br>&#x412;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; - &#x442;&#x443;&#x43F;&#x43E; &#x43D;&#x435;&#x442; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x438; wordpress &#x43F;&#x440;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x438; &#x43A; /var/www/html/wordpress &#x432; nginx. &#x41F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C; /var/www/html/</p><pre><code class="language-yml">location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html;
    }</code></pre><p>&#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443;:</p><p><code>archive directory exists for jem-art.ru</code></p><p>&#x42D;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;, &#x447;&#x442;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x430;&#x43F;&#x43A;&#x430; archive &#x443; letsencypt &#x438; &#x432; &#x43D;&#x435;&#x439; &#x435;&#x441;&#x442;&#x44C; &#x43A;&#x43B;&#x44E;&#x447; &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430; jem-art.ru. &#x417;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43D;&#x430;&#x434;&#x43E; &#x43D;&#x435; &#x437;&#x430;&#x43D;&#x43E;&#x432;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;, &#x430; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x435;&#x433;&#x43E;. &#x41D;&#x43E; &#x442;.&#x43A;. &#x44F; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x442;&#x430;&#x43C; &#x43A;&#x440;&#x443;&#x442;&#x438;&#x43B;-&#x432;&#x435;&#x440;&#x442;&#x435;&#x43B;, &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x435; renewal &#x434;&#x43B;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x430; &#x43D;&#x435;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x43C; &#x43D;&#x430;&#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x430; (&#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C;, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x432; certbot renew).</p><p><code>sudo certbot certonly --webroot -w /var/lib/docker/volumes/codeartsite_wordpress/_data --email <a>test@gmail.com</a> --agree-tos --no-eff-email --force-renewal -d jem-art.ru -d www.jem-art.ru --force-renewal</code></p><p>&#x413;&#x43E;&#x442;&#x43E;&#x432;&#x43E;! &#x421;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x44B; &#x432; &#x43D;&#x443;&#x436;&#x43D;&#x43E;&#x439; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x438;. &#x41F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C; nginx &#x432; &#x434;&#x43E;&#x43A;&#x435;&#x440;&#x435; &#x438; &#x43D;&#x430;&#x441;&#x43B;&#x430;&#x436;&#x434;&#x430;&#x435;&#x43C;&#x441;&#x44F;.<br><br>&#x41D;&#x443; &#x430; &#x43F;&#x43E;-&#x445;&#x43E;&#x440;&#x43E;&#x448;&#x435;&#x43C;&#x443; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x437;&#x430;&#x434;&#x430;&#x447;&#x443; &#x432; crontab:</p><p><code>30 2 1 */3 * /usr/bin/certbot renew --quiet --deploy-hook &quot;/home/jem/projects/nginx/restart.sh&quot;</code></p><p>&#x41D;&#x435; &#x442;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x433;&#x43B;&#x443;&#x431;&#x43E;&#x43A;&#x43E; &#x43A;&#x43E;&#x43F;&#x43D;&#x443;&#x43B;, &#x43D;&#x43E; &#x445;&#x43E;&#x442;&#x44F; &#x431;&#x44B; &#x43D;&#x435; &#x431;&#x435;&#x437;&#x434;&#x443;&#x43C;&#x43D;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C;)</p>]]></content:encoded></item><item><title><![CDATA[Generative art. Sticks]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;.<br>&#x41D;&#x438; &#x441; &#x447;&#x435;&#x433;&#x43E; &#x432; &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x435; &#x43F;&#x440;&#x43E;&#x43C;&#x435;&#x43B;&#x44C;&#x43A;&#x43D;&#x443;&#x43B;&#x43E; &#x43A;&#x430;&#x43A;&#x43E;&#x435;-&#x442;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43C;&#x438;&#x43D;&#x430;&#x43D;</p>]]></description><link>https://jem-space.ru/generative-art-sticks/</link><guid isPermaLink="false">66a414efc22624000151cd52</guid><category><![CDATA[code art]]></category><category><![CDATA[generative art]]></category><category><![CDATA[plot]]></category><category><![CDATA[drawbot]]></category><category><![CDATA[jem_art]]></category><category><![CDATA[js]]></category><category><![CDATA[codeart]]></category><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Sun, 28 Jul 2024 05:51:02 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/07/img.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/07/img.png" alt="Generative art. Sticks"><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;.<br>&#x41D;&#x438; &#x441; &#x447;&#x435;&#x433;&#x43E; &#x432; &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x435; &#x43F;&#x440;&#x43E;&#x43C;&#x435;&#x43B;&#x44C;&#x43A;&#x43D;&#x443;&#x43B;&#x43E; &#x43A;&#x430;&#x43A;&#x43E;&#x435;-&#x442;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43C;&#x438;&#x43D;&#x430;&#x43D;&#x438;&#x435; &#x438;&#x435;&#x440;&#x43E;&#x433;&#x43B;&#x438;&#x444;&#x43E;&#x432; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x441;&#x442;&#x43E;&#x43B;&#x431;&#x438;&#x43A;. &#x412;&#x438;&#x434;&#x438;&#x43C;&#x43E;, &#x43D;&#x430; &#x432;&#x43E;&#x441;&#x442;&#x43E;&#x43A;&#x435; &#x43D;&#x430;&#x434;&#x43F;&#x438;&#x441;&#x438; &#x438;&#x43D;&#x43E;&#x433;&#x434;&#x430; &#x438;&#x43B;&#x438; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x440;&#x430;&#x441;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x44E;&#x442; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;. &#x414;&#x43B;&#x44F; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A;&#x430; &#x43D;&#x435; &#x43E;&#x441;&#x43E;&#x431;&#x43E; &#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x43E;&#x433;&#x43E; &#x441; &#x432;&#x43E;&#x441;&#x442;&#x43E;&#x43A;&#x43E;&#x43C; &#x434;&#x43B;&#x44F; &#x43C;&#x435;&#x43D;&#x44F; &#x438;&#x435;&#x440;&#x43E;&#x433;&#x43B;&#x438;&#x444;&#x44B; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43D;&#x430;&#x431;&#x43E;&#x440; &#x447;&#x435;&#x440;&#x442;&#x43E;&#x447;&#x435;&#x43A;.</p><p>&#x412; &#x43F;&#x43E;&#x433;&#x43E;&#x43D;&#x435; &#x437;&#x430; &#x441;&#x432;&#x43E;&#x435;&#x439; &#x432;&#x438;&#x437;&#x443;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x435;&#x439; &#x43D;&#x430;&#x43A;&#x438;&#x434;&#x430;&#x43B; &#x441;&#x43A;&#x435;&#x442;&#x447; &#x441; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x44B;&#x445; &#x432;&#x435;&#x43B;&#x438;&#x447;&#x438;&#x43D;. &#x41A;&#x430;&#x436;&#x434;&#x430;&#x44F; &#x43B;&#x438;&#x43D;&#x438;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x43A;&#x43E;&#x440;&#x43E;&#x442;&#x43A;&#x43E;&#x439; &#x438; &#x440;&#x430;&#x441;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x43B;&#x430;&#x441;&#x44C; &#x432; &#x441;&#x435;&#x442;&#x43A;&#x435; &#x441; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x44B;&#x43C; &#x43E;&#x442;&#x43A;&#x43B;&#x43E;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x438; &#x43F;&#x43E;&#x432;&#x43E;&#x440;&#x43E;&#x442;&#x43E;&#x43C; &#x43D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x44B;&#x439; &#x443;&#x433;&#x43E;&#x43B;. &#x42F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x440;&#x438; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x445; &#x446;&#x432;&#x435;&#x442;&#x430; &#x2014; &#x43A;&#x440;&#x430;&#x441;&#x43D;&#x44B;&#x439;, &#x441;&#x438;&#x43D;&#x438;&#x439; &#x438; &#x436;&#x435;&#x43B;&#x442;&#x44B;&#x439;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x44F;&#x440;&#x43A;&#x438;&#x439; &#x438; &#x434;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x443;&#x437;&#x43E;&#x440;. &#x41F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x44F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x435;&#x449;&#x435; &#x43F;&#x43E;&#x44D;&#x43A;&#x441;&#x43F;&#x435;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x438; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x430;&#x440;&#x438;&#x430;&#x446;&#x438;&#x439;.<br>&#x41F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x432;&#x430;&#x440;&#x438;&#x430;&#x446;&#x438;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43E;&#x434;&#x438;&#x43D; &#x446;&#x432;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x441;&#x442;&#x432;&#x43E;, &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x439; - &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x43D;&#x430; 2/3, &#x430; &#x442;&#x440;&#x435;&#x442;&#x438;&#x439; &#x43D;&#x430; 1/3. <br>&#x412;&#x43E; &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x443;&#x44E; &#x432;&#x430;&#x440;&#x438;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x438; &#x432; &#x43B;&#x435;&#x432;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x438; &#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x435; &#x432; &#x43F;&#x440;&#x430;&#x432;&#x43E;&#x439;.<br>&#x422;&#x440;&#x435;&#x442;&#x44C;&#x44F; - &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x447;&#x435;&#x440;&#x442;&#x43E;&#x447;&#x435;&#x43A; &#x43F;&#x43E; &#x44F;&#x447;&#x435;&#x439;&#x43A;&#x430;&#x43C; &#x441;&#x435;&#x442;&#x43A;&#x438; &#x432; &#x442;&#x430;&#x43A;&#x43E;&#x43C; &#x436;&#x435; &#x441;&#x43E;&#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x438; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x432;. &#x41D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x44F;&#x447;&#x435;&#x439;&#x43A;&#x430; &#x443;&#x436;&#x435; &#x431;&#x44B;&#x43B;&#x430; &#x437;&#x430;&#x43D;&#x44F;&#x442;&#x430; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x43C;, &#x442;&#x43E; &#x435;&#x435; &#x443;&#x436;&#x435; &#x437;&#x430;&#x43D;&#x44F;&#x442;&#x44C; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C; &#x446;&#x432;&#x435;&#x442;&#x43E;&#x43C; &#x43D;&#x435;&#x43B;&#x44C;&#x437;&#x44F;.<br>&#x415;&#x449;&#x435; &#x43E;&#x434;&#x43D;&#x430; &#x431;&#x44B;&#x43B;&#x430; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x430; &#x441; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x43C;&#x438; &#x432; &#x430;&#x43B;&#x433;&#x43E;&#x440;&#x438;&#x442;&#x43C;&#x435;, &#x447;&#x442;&#x43E; &#x442;&#x43E;&#x436;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;.</p><p>&#x41A;&#x430;&#x43A; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;, &#x435;&#x449;&#x435; &#x43E;&#x434;&#x43D;&#x430; &#x441;&#x435;&#x440;&#x438;&#x44F; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.07.59-1.png" width="1810" height="1806" loading="lazy" alt="Generative art. Sticks" srcset="https://jem-space.ru/content/images/size/w600/2024/07/--------------2024-07-27---20.07.59-1.png 600w, https://jem-space.ru/content/images/size/w1000/2024/07/--------------2024-07-27---20.07.59-1.png 1000w, https://jem-space.ru/content/images/size/w1600/2024/07/--------------2024-07-27---20.07.59-1.png 1600w, https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.07.59-1.png 1810w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.08.30-1.png" width="1808" height="1810" loading="lazy" alt="Generative art. Sticks" srcset="https://jem-space.ru/content/images/size/w600/2024/07/--------------2024-07-27---20.08.30-1.png 600w, https://jem-space.ru/content/images/size/w1000/2024/07/--------------2024-07-27---20.08.30-1.png 1000w, https://jem-space.ru/content/images/size/w1600/2024/07/--------------2024-07-27---20.08.30-1.png 1600w, https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.08.30-1.png 1808w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.12.43.png" width="1808" height="1808" loading="lazy" alt="Generative art. Sticks" srcset="https://jem-space.ru/content/images/size/w600/2024/07/--------------2024-07-27---20.12.43.png 600w, https://jem-space.ru/content/images/size/w1000/2024/07/--------------2024-07-27---20.12.43.png 1000w, https://jem-space.ru/content/images/size/w1600/2024/07/--------------2024-07-27---20.12.43.png 1600w, https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.12.43.png 1808w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.09.44.png" width="1806" height="1810" loading="lazy" alt="Generative art. Sticks" srcset="https://jem-space.ru/content/images/size/w600/2024/07/--------------2024-07-27---20.09.44.png 600w, https://jem-space.ru/content/images/size/w1000/2024/07/--------------2024-07-27---20.09.44.png 1000w, https://jem-space.ru/content/images/size/w1600/2024/07/--------------2024-07-27---20.09.44.png 1600w, https://jem-space.ru/content/images/2024/07/--------------2024-07-27---20.09.44.png 1806w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x435;&#x449;&#x435; &#x43F;&#x43E;&#x438;&#x433;&#x440;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x446;&#x432;&#x435;&#x442;&#x430;&#x43C;&#x438; &#x438; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440;&#x43E;&#x43C;. &#x410; &#x43F;&#x43E;&#x43A;&#x430; &#x441;&#x43B;&#x435;&#x43F;&#x438;&#x43B; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x440;&#x43E;&#x43B;&#x438;&#x43A; &#x441; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433;&#x43E;&#x43C; &#x441;&#x43A;&#x435;&#x442;&#x447;&#x430;.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/LxKVPxxnFRg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Sticks-1 series #generativeart #codeart #art"></iframe></figure><p>&#x415;&#x449;&#x435; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442;&#x430; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x441; generative art &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x432; <a href="https://t.me/drawbot_art">Telegram</a>, <a href="https://www.instagram.com/drawbot_art/">Instagram</a> &#x438; <a href="https://x.com/draw_bot_art">Twitter</a>.</p><p>&#x41F;&#x43E;&#x43D;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x441;&#x44F; &#x440;&#x438;&#x441;&#x443;&#x43D;&#x43E;&#x43A;. &#x41F;&#x43E;&#x43C;&#x43E;&#x433;&#x443; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D; &#x443;&#x43A;&#x440;&#x430;&#x441;&#x438;&#x43B; &#x441;&#x442;&#x435;&#x43D;&#x443; &#x432; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x434;&#x43E;&#x43C;&#x435; &#x438;&#x43B;&#x438; &#x43E;&#x444;&#x438;&#x441;&#x435;: <a href="https://jem-art.ru/shop/sticks-1/">&#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Разработка Telegram бота на NodeJs + Telegraf.js]]></title><description><![CDATA[<p>&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x431;&#x43E;&#x442;&#x43E;&#x432; &#x442;&#x435;&#x43C;&#x430; &#x43D;&#x435; &#x43D;&#x43E;&#x432;&#x430;&#x44F; &#x438; &#x437;&#x430;&#x442;&#x435;&#x440;&#x442;&#x430;&#x44F; &#x434;&#x43E; &#x434;&#x44B;&#x440;. &#x412; &#x441;&#x435;&#x442;&#x438; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;</p>]]></description><link>https://jem-space.ru/tg-bot-with-telegraf/</link><guid isPermaLink="false">65ca728524547d0001858c7e</guid><dc:creator><![CDATA[Jem]]></dc:creator><pubDate>Wed, 21 Feb 2024 15:30:10 GMT</pubDate><media:content url="https://jem-space.ru/content/images/2024/02/--------------2024-02-21---14.22.41.png" medium="image"/><content:encoded><![CDATA[<img src="https://jem-space.ru/content/images/2024/02/--------------2024-02-21---14.22.41.png" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js"><p>&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x431;&#x43E;&#x442;&#x43E;&#x432; &#x442;&#x435;&#x43C;&#x430; &#x43D;&#x435; &#x43D;&#x43E;&#x432;&#x430;&#x44F; &#x438; &#x437;&#x430;&#x442;&#x435;&#x440;&#x442;&#x430;&#x44F; &#x434;&#x43E; &#x434;&#x44B;&#x440;. &#x412; &#x441;&#x435;&#x442;&#x438; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E; &#x442;&#x443;&#x442;&#x43E;&#x440;&#x438;&#x430;&#x43B;&#x43E;&#x432; &#x43A;&#x430;&#x43A; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x422;&#x435;&#x43B;&#x435;&#x433;&#x440;&#x430;&#x43C;-&#x431;&#x43E;&#x442;&#x430; &#x438;&#x43B;&#x438; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x433;&#x43E;, &#x438; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x441;&#x43F;&#x438;&#x43A;&#x435;&#x440; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x442;&#x43E; &#x441;&#x432;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;. &#x412;&#x435;&#x434;&#x44C;, &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, &#x43E;&#x434;&#x438;&#x43D; &#x438; &#x442;&#x43E;&#x442; &#x436;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E;-&#x440;&#x430;&#x437;&#x43D;&#x43E;&#x43C;&#x443;. &#x418;, &#x43A; &#x441;&#x43E;&#x436;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x44E;, &#x43A;&#x430;&#x43A;&#x438;&#x445;-&#x442;&#x43E; best practices &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435; &#x431;&#x43E;&#x442;&#x43E;&#x432; &#x44F; &#x43D;&#x435; &#x43D;&#x430;&#x448;&#x435;&#x43B;, &#x430; &#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43A;&#x443;&#x447;&#x443; &#x443;&#x440;&#x43E;&#x43A;&#x43E;&#x432; - &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438; &#x43D;&#x435; &#x43D;&#x430;&#x43F;&#x430;&#x441;&#x435;&#x448;&#x44C;&#x441;&#x44F;. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x441;&#x430;&#x43C; &#x438;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432; &#x434;&#x430;&#x43B;&#x44C;&#x43D;&#x435;&#x439;&#x448;&#x435;&#x43C;. <br>&#x41A;&#x430;&#x43A; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x44D;&#x442;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x432; &#x431;&#x43E;&#x442;&#x435; <a href="https://t.me/cute_astro_bot">&#x410;&#x441;&#x442;&#x440;&#x43E;&#x41A;&#x43E;&#x442;</a> (&#x435;&#x441;&#x442;&#x44C; &#x434;&#x435;&#x43C;&#x43E; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x430; &#x43D;&#x430; 7 &#x434;&#x43D;&#x435;&#x439;)</p><!--kg-card-begin: markdown--><h3 id="%D0%BF%D0%B0%D1%80%D1%83-%D1%81%D0%BB%D0%BE%D0%B2-%D0%BE-telegrafjs">&#x41F;&#x430;&#x440;&#x443; &#x441;&#x43B;&#x43E;&#x432; &#x43E; Telegraf.js.</h3>
<!--kg-card-end: markdown--><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x43B; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x438;&#x445; &#x431;&#x43E;&#x442;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43F;&#x435;&#x442;-&#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x44F; &#x43F;&#x438;&#x441;&#x430;&#x43B; &#x441; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43D;&#x430;&#x431;&#x43E;&#x440;&#x43E;&#x43C; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;, &#x434;&#x430;&#x436;&#x435; &#x431;&#x435;&#x437; telegram-node. &#x418; &#x432; &#x44D;&#x442;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;&#x445; &#x43C;&#x43D;&#x435; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x432;&#x432;&#x43E;&#x434;&#x430; &#x438;&#x43B;&#x438; &#x440;&#x435;&#x430;&#x43A;&#x446;&#x438;&#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x442;&#x43B;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x432;&#x432;&#x43E;&#x434;. &#x41C;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x433;&#x434;&#x430;, &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43D;&#x435;&#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F;. &#x42D;&#x442;&#x430; &#x437;&#x430;&#x434;&#x430;&#x447;&#x430; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x43E; &#x440;&#x435;&#x448;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x430; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x445; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x43E;&#x432; (FSM). &#x414;&#x43B;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432; &#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43B; &#x443;&#x436;&#x435; <a href="https://xstate.js.org/">XState</a>. &#x418; &#x43D;&#x435;&#x434;&#x430;&#x432;&#x43D;&#x43E; &#x43D;&#x430;&#x442;&#x43A;&#x43D;&#x443;&#x43B;&#x441;&#x44F; &#x43D;&#x430; <a href="https://telegraf.js.org/">Telegraf.js</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x442; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B; FSM (&#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x441;&#x446;&#x435;&#x43D;), &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x43D;&#x43E; &#x441; Telegram Bot API. &#x412; &#x43E;&#x431;&#x449;&#x435;&#x43C; - &#x44D;&#x442;&#x43E; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E;. &#x41F;&#x43B;&#x44E;&#x441;, &#x435;&#x441;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; middleware (&#x43A;&#x430;&#x43A; &#x432; Express), &#x447;&#x435;&#x43C; &#x43C;&#x44B; &#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x438; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F;.</p><!--kg-card-begin: markdown--><h3 id="%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0">&#x417;&#x430;&#x434;&#x430;&#x447;&#x430;</h3>
<!--kg-card-end: markdown--><p>&#x41F;&#x438;&#x448;&#x435;&#x43C; &#x431;&#x43E;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x441;&#x44B;&#x43B;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x434;&#x435;&#x43D;&#x44C; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;, &#x430; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;&#x43C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438;:</p><!--kg-card-begin: markdown--><ul>
<li>&#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x435; &#x432;&#x438;&#x434;&#x44B; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;&#x43E;&#x432;,</li>
<li>&#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x441;&#x43A;&#x43B;&#x430;&#x434; &#x41E;&#x440;&#x430;&#x43A;&#x443;&#x43B;&#x430;,</li>
<li>&#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43A;&#x43E; &#x412;&#x441;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x439;,</li>
<li>&#x437;&#x430;&#x433;&#x43E;&#x432;&#x43E;&#x440; &#x43D;&#x430; &#x434;&#x435;&#x43D;&#x44C;&#x433;&#x438;,</li>
<li>&#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x43E;&#x434; &#x441;&#x435;&#x431;&#x44F; - &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F;, &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x439;,</li>
<li>&#x438; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E; &#x41E;&#x424;&#x41E;&#x420;&#x41C;&#x418;&#x422;&#x42C; &#x41F;&#x41E;&#x414;&#x41F;&#x418;&#x421;&#x41A;&#x423;!</li>
</ul>
<!--kg-card-end: markdown--><p>&#x411;&#x435;&#x437; &#x43F;&#x430;&#x43D;&#x438;&#x43A;&#x438;, &#x43E;&#x431;&#x43E; &#x432;&#x441;&#x435;&#x43C; &#x432; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x44F;&#x445; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443;. &#x425;&#x43E;&#x442;&#x435;&#x43B;&#x43E;&#x441;&#x44C; &#x431;&#x44B; &#x441;&#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; &#x442;&#x43E;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x43D;&#x435;&#x441;&#x442;&#x438; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D; &#x434;&#x43B;&#x44F; &#x431;&#x43E;&#x442;&#x430;, &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x443;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x443;&#x44E; &#x43F;&#x440;&#x435;&#x434;&#x43C;&#x435;&#x43D;&#x442;&#x43D;&#x443;&#x44E; &#x43E;&#x431;&#x43B;&#x430;&#x441;&#x442;&#x44C;.<br>&#x427;&#x442;&#x43E; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x442;&#x44C; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x435;:</p><!--kg-card-begin: markdown--><ul>
<li>&#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x438; &#x435;&#x433;&#x43E; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;  &#x43F;&#x440;&#x438; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x438; &#x441; &#x431;&#x43E;&#x442;&#x43E;&#x43C; (&#x43D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x440;&#x438; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x435;)</li>
<li>&#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x441; &#x43D;&#x435;&#x43A;&#x438;&#x43C;&#x438; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x44B;&#x431;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x43B;&#x43E;&#x443; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x441; &#x431;&#x43E;&#x442;&#x43E;&#x43C; (&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;-&#x43E;&#x442;&#x432;&#x435;&#x442;)</li>
<li>&#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x441; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x430;</li>
<li>&#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x438;</li>
<li>&#x441;&#x431;&#x43E;&#x440; &#x43C;&#x435;&#x442;&#x440;&#x438;&#x43A;</li>
<li>&#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43F;&#x440;&#x438;&#x435;&#x43C;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439; &#x43E; &#x431;&#x430;&#x433;&#x430;&#x445;</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5-%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B1%D0%BE%D1%82%D0%B0-%D0%BD%D0%B0-telegrafjs">&#x411;&#x44B;&#x441;&#x442;&#x440;&#x43E;&#x435; &#x432;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; Telegraf.js</h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x431;&#x43E;&#x442;&#x430; <code>let bot = new Telegraf(token);</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>&#x41F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; <code>use</code> &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; middleware, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x438;&#x445; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B;&#x438;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x441;&#x441;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x443;&#x44E; &#x442;&#x43E; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; (&#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x435; ctx.session, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x435;&#x43D; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x438; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F;), &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x441;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x43E;&#x439;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x43D;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;.<br>
<code>bot.use(session())</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>&#x41C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43D;&#x430;&#x432;&#x435;&#x441;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43A;&#x43E;&#x43C;&#x43C;&#x430;&#x43D;&#x434; (&#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43E;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x441; /) &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438;<br>
<code>bot.command(&apos;subscription&apos;, async (ctx) =&gt; {...})</code></p>
<p>&#x41E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F;<br>
<code>bot.on(message(&quot;text&quot;), async (ctx) =&gt; {...});</code></p>
<p>O&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x43D;&#x430;&#x436;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x43A;&#x43E;&#x43B;&#x431;&#x435;&#x43A; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x435;<br>
<code>bot.on(callbackQuery(), async (ctx) =&gt; {...});</code></p>
<p>&#x41C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x432; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x443;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x441;&#x446;&#x435;&#x43D;&#x443; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;&#x43E;&#x432; &#x438; &#x43F;&#x440;&#x438; &#x43A;&#x43B;&#x438;&#x43A;&#x435; &#x43D;&#x430; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x435;&#x434;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x432; &#x43D;&#x435;&#x435;.</p>
<!--kg-card-end: markdown--><pre><code class="language-javascript">const horoMainScene = new Scenes.BaseScene(&quot;horoMainScene&quot;);

horoMainScene.enter(async (ctx) =&gt; {
    ///&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x439;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x437;&#x430;&#x448;&#x435;&#x43B; &#x432; &#x445;&#x430;&#x442;&#x443; &#x441;&#x446;&#x435;&#x43D;&#x443;
    /// &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x442;&#x443;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x438;&#x43B;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x438;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;&#x43E;&#x432; &#x438; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438;
})

bot.on(callbackQuery(), async (ctx) =&gt; {...
    await ctx.scene.enter(&quot;currentHoroScene&quot;);
});</code></pre><!--kg-card-begin: markdown--><p>&#x421;&#x446;&#x435;&#x43D;&#x44B; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; middleware &#x432; &#x431;&#x43E;&#x442; <code>this.bot.use(getStage().middleware());</code></p>
<p>&#x433;&#x434;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; <code>getStage()</code> &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &#x441;&#x446;&#x435;&#x43D;&#x44B; &#x434;&#x43B;&#x44F; &#x431;&#x43E;&#x442;&#x430;</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%D1%84%D0%B8%D1%87%D0%B8">&#x424;&#x438;&#x447;&#x438;</h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h5 id="%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D0%B5%D0%B9%D1%82%D0%B0-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F">&#x421;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x435;&#x439;&#x442;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;.</h5>
<!--kg-card-end: markdown--><p>&#x424;&#x438;&#x447;&#x430; &#x432;&#x430;&#x436;&#x43D;&#x430;&#x44F;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E; &#x43C;&#x43D;&#x435;, &#x43D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x443;&#x43F;&#x430;&#x43B;&#x43E; &#x438;&#x43B;&#x438; &#x442;&#x44B; &#x435;&#x433;&#x43E; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x435;&#x448;&#x44C; &#x43D;&#x435; &#x441; zero downtime. &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x430;&#x43A; &#x431;&#x43E;&#x442; &#x43F;&#x43E;&#x434;&#x43D;&#x44F;&#x43B;&#x441;&#x44F;, &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43E;&#x431;&#x449;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x431;&#x43E;&#x442;&#x43E;&#x43C; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x43A;&#x430;&#x43A; &#x43D;&#x438; &#x432; &#x447;&#x435;&#x43C; &#x43D;&#x435; &#x431;&#x44B;&#x432;&#x430;&#x43B;&#x43E; (&#x430; &#x43D;&#x435; &#x442;&#x44B;&#x43A;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x438; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x441;&#x43B;&#x430;&#x442;&#x44C; /start, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430;), &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x445;&#x435;&#x43D;&#x434;&#x43B;&#x435;&#x440;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x43F;&#x443;&#x442;&#x430; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x442;&#x43E;&#x439; &#x436;&#x435; &#x441;&#x446;&#x435;&#x43D;&#x435;, &#x433;&#x434;&#x435; &#x438; &#x431;&#x44B;&#x43B; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;.</p><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x432;&#x445;&#x43E;&#x434;&#x430; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x443; <code>( scene.enter(() =&gt; {}) )</code> &#x432; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; ctx.session &#x438; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x441;&#x446;&#x435;&#x43D;&#x44B;. &#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435; - &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x43D;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43B;&#x430;&#x441;&#x44C; &#x431;&#x435;&#x437; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A; &#x438; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x442;&#x443;&#x442;. ctx.session &#x438; &#x438;&#x43C;&#x44F; &#x441;&#x446;&#x435;&#x43D;&#x44B; - &#x43F;&#x43E;&#x43B;&#x43D;&#x430;&#x44F; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43D;&#x430;&#x43C; &#x43F;&#x43E;&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x437;&#x438;&#x446;&#x438;&#x44E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x438; &#x43A;&#x430;&#x43A;&#x438;&#x445; &#x442;&#x43E; &#x43E;&#x441;&#x43E;&#x431;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x44F; &#x43D;&#x430; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443;, &#x43D;&#x435; &#x443;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x432; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x443;, &#x43D;&#x43E; &#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x43A;&#x430;&#x43A;&#x43E;&#x435;-&#x442;&#x43E; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x435;.</p><p>&#x423; Telegraf.js &#x435;&#x441;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x441;&#x446;&#x435;&#x43D;&#x44B; &#x432; Redis &#x438;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;e &#x431;&#x434; &#x432; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x430;&#x445; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x441; middleware <a href="https://www.npmjs.com/package/telegraf-session-local">session-local</a>). &#x42F; &#x436;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x441;&#x432;&#x43E;&#x439; &#x432;&#x435;&#x43B;&#x43E;&#x441;&#x438;&#x43F;&#x435;&#x434; &#x441; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; mongoDB, &#x442; &#x43A; &#x438; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x442;&#x43E;&#x436;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x44F;&#x442;&#x441;&#x44F; &#x432; &#x43C;&#x43E;&#x43D;&#x433;&#x435;. &#x415;&#x441;&#x43B;&#x438; &#x431;&#x43E;&#x442; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x431;&#x434;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x43E;&#x431;&#x43E;&#x439;&#x442;&#x438;&#x441;&#x44C; &#x438; <a href="https://www.npmjs.com/package/telegraf-session-local">session-local</a>.</p><!--kg-card-begin: markdown--><p>&#x421;&#x430;&#x43C;&#x430; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;:</p>
<!--kg-card-end: markdown--><pre><code class="language-javascript">saveState(ctx, &quot;horoMainScene&quot;);

///
async function saveState(ctx, scene) {  
    let { session = {} } = ctx;  
    let { __scenes, ...rest } = session;  
    let userId = ctx.chat.id;  
    return saveUserState(userId, scene, JSON.stringify(rest));
}
///

async function saveUserState(userId, scene, session) {  
    const newUser = new UserStateModel({    
        userId,    
        scene,    
        session: JSON.stringify(session),  
    });  
    await newUser.save();
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;?</p><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#x441;&#x432;&#x43E;&#x439; middleware:</p><pre><code class="language-javascript">async function restoreState(ctx, next) {
  if (
    ctx.update &amp;&amp;
    ctx.update.message &amp;&amp;
    ctx.update.message.text &amp;&amp;
    ctx.update.message.text.startsWith(&quot;/&quot;)
  ) {
    /// &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x44D;&#x442;&#x43E; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43E;&#x439;, &#x430; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x446;&#x435;&#x43D;&#x44B; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B; &#x43E;&#x442;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;
    return next();
  }

  if (!ctx.scene.current) {
  // &#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x43D;&#x435;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B;. &#x412; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430; &#x442;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442;, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x446;&#x435;&#x43D;&#x443; &#x438;&#x437; &#x431;&#x434;

    let userState = await getState(ctx);
    
    if (userState) {
      const scene = userState.scene; // &#x438;&#x43C;&#x44F; &#x441;&#x446;&#x435;&#x43D;&#x44B;
      let currentScene = ctx.scene.scenes.get(scene);
      if (!currentScene) {
        return next();
      }
      
      let currentHandler = currentScene.handler; // &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; &#x445;&#x435;&#x43D;&#x434;&#x43B;&#x435;&#x440; &#x441;&#x446;&#x435;&#x43D;&#x44B;
      ctx.session = JSON.parse(userState.session);

      await ctx.scene.enter(scene, {}, true); // &#x432;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x443; &#x431;&#x435;&#x441;&#x448;&#x443;&#x43C;&#x43D;&#x43E; (&#x442; &#x435; &#x431;&#x435;&#x437; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; enter)
      
      currentHandler(ctx, next); // &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442;&#x430; &#x43E;&#x442; &#x44E;&#x437;&#x435;&#x440;&#x430;
      return;
    }
    return next();
  }
  return next();
} </code></pre><p>&#x41E;&#x43D; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x441;&#x435;&#x445; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; middleware &#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x43D;&#x435;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B; (&#x447;&#x442;&#x43E; &#x432; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E;, &#x442;.&#x43A; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x43A;&#x430;&#x43A; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x431;&#x43E;&#x442;&#x43E;&#x43C; &#x441;&#x440;&#x430;&#x437;&#x443; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x430;&#x43A;&#x443;&#x44E; &#x43B;&#x438;&#x431;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x443;), &#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x435;&#x43C;&#x443; &#x435;&#x435; &#x43D;&#x430;&#x434;&#x43E; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C;.</p><p><code>getState()</code> &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x441;&#x442;&#x435;&#x439;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x438;&#x437; &#x431;&#x434;. &#x418;&#x437; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; &#x441;&#x446;&#x435;&#x43D; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x435;&#x43D; &#x447;&#x435;&#x440;&#x435;&#x437; `ctx.scene.scenes`)&#x431;&#x43E;&#x442;&#x430; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x443;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x443; &#x441;&#x43E; &#x432;&#x441;&#x435;&#x43C;&#x438; &#x435;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x43C;&#x438; &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x435;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;. &#x421;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x43D;&#x430;&#x434;&#x43E; &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E; &#x431;&#x44B; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; <code>enter</code> &#x434;&#x43B;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B; &#x43D;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x43B;&#x430;&#x441;&#x44C;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x432; &#x441;&#x432;&#x43E;&#x435;&#x43C; &#x444;&#x43B;&#x43E;&#x443; &#x443;&#x436;&#x435; &#x43D;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x432; &#x43D;&#x435;&#x439; &#x438; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x43E;&#x43F;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x437;&#x430;&#x445;&#x43E;&#x434;&#x435; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x443; &#x438;&#x43B;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A;&#x430;&#x44F;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x434;&#x440;&#x443;&#x433;&#x430;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; 3&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>ctx.scene.enter(scene, {}, true)</code> - silen = true.</p><p>&#x410; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x438; &#x441;&#x442;&#x435;&#x439;&#x442; &#x438; &#x441;&#x446;&#x435;&#x43D;&#x443;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; handler &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; update &#x43E;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; (&#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x435; &#x43F;&#x43E; callback &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x435; &#x438;&#x43B;&#x438; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x44B;&#x439; &#x438;&#x43D;&#x43F;&#x443;&#x442;), &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43D;&#x435; &#x431;&#x44B;&#x43B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D;, &#x442; &#x43A; &#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x44B; (&#x438; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x43E; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;).<br>&#x41D;&#x435; &#x437;&#x430;&#x431;&#x443;&#x434;&#x435;&#x43C; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>next()</code> &#x43D;&#x430; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x432;&#x435;&#x442;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43E;&#x43A;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; middleware, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x438; &#x435;&#x441;&#x442;&#x44C; &#x438;&#x43B;&#x438; &#x431;&#x443;&#x434;&#x443;&#x442;.</p><!--kg-card-begin: markdown--><h5 id="%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D1%8F-%D1%81-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8-%D0%B1%D0%BE%D1%82%D0%B0">&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F; &#x441; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x431;&#x43E;&#x442;&#x430;</h5>
<!--kg-card-end: markdown--><p>&#x411;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E;&#x43C;&#x443; &#x444;&#x43B;&#x43E;&#x443; &#x441; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43C; &#x432; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; - &#x43E;&#x442;&#x432;&#x435;&#x442;. &#x41A;&#x43E;&#x433;&#x434;&#x430; &#x431;&#x43E;&#x442; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x438;&#x43D;&#x43F;&#x443;&#x442; &#x43E;&#x442; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x438; &#x432;&#x44B;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442;, &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x432; &#x43A;&#x430;&#x43A;&#x443;&#x44E;-&#x442;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x443;, &#x433;&#x434;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x432; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44F; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x439; (&#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434;&#x43E;&#x432; &#x432; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x441;&#x446;&#x435;&#x43D;&#x44B;). &#x41D;&#x43E; &#x437;&#x430;&#x434;&#x430;&#x447;&#x430; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44E; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x442; &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x43E; &#x440;&#x430;&#x441;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44E;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F; - &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x43E;&#x439;, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x449;&#x435;&#x439; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x433;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;&#x44B; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x435;&#x43C;&#x430;&#x442;&#x438;&#x43A;&#x438; &#x438; &#x434;&#x43D;&#x438;. &#x41B;&#x438;&#x431;&#x43E; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x434;&#x43B;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x443;. &#x418; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43C;&#x43E;&#x447;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x442;&#x438; &#x43F;&#x43E; &#x44D;&#x442;&#x43E;&#x439; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x435;, &#x430; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43C;&#x43E;&#x447;&#x44C; &#x43F;&#x440;&#x43E;&#x438;&#x433;&#x43D;&#x43E;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x438; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x439; &#x444;&#x43B;&#x43E;&#x443;, &#x433;&#x434;&#x435; &#x43E;&#x43D; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43A; &#x438;&#x43B;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x433;&#x43E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x430;.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/02/ezgif-3-d894d964b3-1.gif" width="320" height="699" loading="lazy" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js"></div><div class="kg-gallery-image"><img src="https://jem-space.ru/content/images/2024/02/ezgif-5-e0d7d79aeb.gif" width="320" height="699" loading="lazy" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js"></div></div></div></figure><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x43A;&#x440;&#x443;&#x433; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x44B;&#x445; callbackQuery (&#x440;&#x435;&#x430;&#x43A;&#x446;&#x438;&#x439; &#x43D;&#x430; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x438; - &#x442; &#x435; id &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x430;), &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x440;&#x435;&#x430;&#x433;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;. &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x431;&#x43E;&#x442;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x432;: <code>otherHoro</code>, <code>renewSubscription</code>, <code>toMainGlobal</code> - &#x44D;&#x442;&#x43E; &#x443;&#x43D;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; id &#x43A;&#x43D;&#x43E;&#x43F;&#x43E;&#x43A; &#x434;&#x43B;&#x44F; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439;.</p><p>&#x414;&#x430;&#x43B;&#x435;&#x435;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; middleware &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x44D;&#x442;&#x438;&#x445; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442;&#x43E;&#x432; &#x43E;&#x442; &#x431;&#x43E;&#x442;&#x430;. &#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; middleware &#x441;&#x43E; &#x432;&#x441;&#x435;&#x43C; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x43C;&#x438;. &#x422; &#x435; &#x435;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x43D;&#x435; &#x437;&#x430;&#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43E;&#x432;&#x430;&#x43B; &#x43D;&#x438; &#x43E;&#x434;&#x438;&#x43D; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x438;&#x437; &#x441;&#x446;&#x435;&#x43D; &#x438; &#x43E;&#x43D; &#x43F;&#x43E;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442; &#x432; &#x44D;&#x442;&#x43E;&#x442; middleware, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x442;&#x443;&#x442; &#x431;&#x443;&#x434;&#x435;&#x442; &#x445;&#x435;&#x43D;&#x434;&#x43B;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x433;&#x43E;. </p><p>&#x412; Telegraf.js &#x435;&#x441;&#x442;&#x44C; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441; <code>Composer</code>, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>use</code> &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x43D;&#x430;&#x448;&#x438; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43A;&#x430;&#x43A; middleware. &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x438;&#x434;&#x43B;&#x432;&#x430;&#x440;&#x44B; &#x432; &#x43C;&#x438;&#x434;&#x43B;&#x432;&#x430;&#x440;&#x435; (&#x43F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x41D;&#x43E;&#x43B;&#x430;&#x43D;&#x443;).</p><p>&#x41F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x440;&#x430;&#x437;&#x443; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x43C; &#x432;&#x435;&#x442;&#x43A;&#x443;, &#x447;&#x442;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x430;&#x448; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x43E;&#x442; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x44D;&#x442;&#x43E; &#x43D;&#x435; callbackQuery - &#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C; &#x43D;&#x430;&#x448;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; middleware &#x447;&#x435;&#x440;&#x435;&#x437; <code>next()</code>. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>Composer.branch</code>:</p><pre><code class="language-javascript">const globalCallbackQueryComposer = new Composer();
globalCallbackQueryComposer.use(otherHoroGlobalCallbackHandler);
globalCallbackQueryComposer.use(renewSubscriptionHandler);
globalCallbackQueryComposer.use(toMainGlobalHandler);

let globalCallbackMiddleware = Composer.branch(
  (ctx) =&gt; {
    return ctx.callbackQuery;
  },
  globalCallbackQueryComposer,
  async (ctx, next) =&gt; {
    await next();
  }
);</code></pre><p>&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;</p><pre><code class="language-javascript">async function otherHoroGlobalCallbackHandler(ctx, next) {
  const answer = ctx.callbackQuery.data;
  if (answer === controls.otherHoro) {
    ctx.session.fromGlobal = true;
    await ctx.scene.enter(&quot;horoMainScene&quot;);

    answerButtonCb(ctx);
    await next();
    return;
  }
  await next();
}</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x437;&#x430;&#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43E;&#x432;&#x430;&#x43B;&#x43E; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435;, &#x442;&#x43E; &#x43C;&#x44B; &#x443;&#x436;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x438;&#x43C; &#x444;&#x43B;&#x43E;&#x443; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x44D;&#x442;&#x43E; &#x440;&#x443;&#x441;&#x43B;&#x43E;, &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x44F; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x432; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x443;. &#x41D;&#x435; &#x437;&#x430;&#x431;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>next()</code>, &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x43E;&#x442;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; middleware, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x44B; &#x434;&#x430;&#x43B;&#x435;&#x435;.</p><!--kg-card-begin: markdown--><h5 id="%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%BE-%D1%81-reply-%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D0%B0%D1%82%D1%83%D1%80%D0%BE%D0%B9">&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x43E; &#x441; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439;</h5>
<!--kg-card-end: markdown--><p>&#x412;&#x43E;&#x43E;&#x431;&#x449;&#x435;, &#x445;&#x43E;&#x442;&#x435;&#x43B;&#x43E;&#x441;&#x44C; &#x431;&#x44B; &#x443;&#x431;&#x438;&#x440;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x443; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x431;&#x43E;&#x440;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x43D;&#x44E;. &#x41D;&#x41E;! &#x42D;&#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435;&#x43C; (&#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x448;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x442;&#x438;&#x43F;&#x43E;&#x43C; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B; <code>removeKeyboard</code>), &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x43A;&#x430;&#x43A; &#x43D;&#x435;&#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43A;&#x43E;&#x43B;&#x431;&#x435;&#x43A; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439; &#x438; &#x43E;&#x434;&#x43D;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x443;&#x434;&#x430;&#x43B;&#x438;&#x442;&#x44C; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x443; - &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x443; Telegram Bot API. &#x41B;&#x438;&#x431;&#x43E; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x443; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x44D;&#x442;&#x430; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x430; &#x437;&#x430;&#x434;&#x430;&#x432;&#x430;&#x43B;&#x430;&#x441;&#x44C; (&#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x442;&#x430;&#x43A; &#x43D;&#x435; &#x437;&#x430;&#x432;&#x435;&#x43B;&#x43E;&#x441;&#x44C;). &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x435;&#x448;&#x438;&#x43B; &#x43D;&#x435; &#x43F;&#x430;&#x440;&#x438;&#x442;&#x44C;&#x441;&#x44F; (&#x43F;&#x43E; &#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43F;&#x43E;&#x432;&#x43E;&#x434;&#x443;, &#x430; &#x43F;&#x430;&#x440;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x43C;&#x443;).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jem-space.ru/content/images/2024/02/vLHu9.png" class="kg-image" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js" loading="lazy" width="595" height="297"><figcaption>reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x430; &#x432; &#x431;&#x43E;&#x442;&#x430;&#x445;</figcaption></figure><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x43C;&#x438;&#x434;&#x43B;&#x432;&#x430;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; reply &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442;&#x44B; &#x43E;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x443; - &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x442;&#x435;&#x43A;&#x441;&#x442;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x43D;&#x438; &#x442;&#x43E;&#x436;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x431;&#x44B;&#x442;&#x44C; &#x443;&#x43D;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x269C;&#xFE0F; &#x41E;&#x440;&#x430;&#x43A;&#x443;&#x43B;).</p><pre><code class="language-javascript">const { Composer } = require(&quot;telegraf&quot;);
const { mainMessageGlobalHandler } = require(&quot;../scenes/main&quot;);

class GlobalInlineKeyboardHandler {
  constructor(callback) {
    this.callback = callback;

    const globalInlineKeyboardComposer = new Composer();
    globalInlineKeyboardComposer.use(callback);

    this.globalInlineMiddleware = Composer.branch(
      (ctx) =&gt; ctx.update &amp;&amp; ctx.update.message,
      globalInlineKeyboardComposer,
      (ctx, next) =&gt; {
        next();
      }
    );
  }

  middleware() {
    return this.globalInlineMiddleware;
  }
}

let globalInlineMiddleware = new GlobalInlineKeyboardHandler(
  mainMessageGlobalHandler
).middleware();</code></pre><!--kg-card-begin: markdown--><p>&#x421;&#x430;&#x43C; &#x436;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x442;&#x430;&#x43A;</p>
<!--kg-card-end: markdown--><pre><code class="language-javascript">async function mainMessageHandler(ctx, next) {
  if (ctx.update.message.text === buttons.settings) {
    await ctx.scene.enter(&quot;settingsMainScene&quot;);
    return;
  }
  if (ctx.update.message.text === buttons.horo) {
    await ctx.scene.enter(&quot;horoMainScene&quot;);
    return;
  }
  if (ctx.update.message.text === buttons.request) {
    await ctx.scene.enter(&quot;universeScene&quot;);
    return;
  }
    .....
    ....
    ...
}</code></pre><!--kg-card-begin: markdown--><p><img src="https://jem-space.ru/content/images/2024/02/ezgif-5-25ac425486.gif" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js" loading="lazy"><br>
<code>&#x412;&#x44B;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43A;&#x43E; &#x412;&#x441;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x439;. &#x41F;&#x43E;&#x442;&#x43E;&#x43C; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x448;&#x44C;&#x44E; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B; &#x432;&#x44B;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x413;&#x43E;&#x440;&#x43E;&#x441;&#x43A;&#x43E;&#x43F;&#x44B;.</code></p>
<!--kg-card-end: markdown--><p>&#x421;&#x434;&#x435;&#x43B;&#x430;&#x44E; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x435; &#x43E;&#x442;&#x441;&#x442;&#x443;&#x43F;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x43F;&#x43E;&#x432;&#x43E;&#x434;&#x443; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>next()</code>. &#x412;&#x43E;&#x43E;&#x431;&#x449;&#x435;, &#x432;&#x441;&#x44E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x441; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x43E;&#x439; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x432; Telegraf.js &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x441; middleware. &#x41D;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x43E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x434;&#x435;&#x43B;&#x43E; &#x434;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x43E; &#x441;&#x446;&#x435;&#x43D; &#x438;&#x43B;&#x438; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;, &#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x437;&#x430;&#x431;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x43E; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x448; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; - &#x44D;&#x442;&#x43E; middleware, &#x443; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x432;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x430;&#x433;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442; <code>next</code>. &#x414;&#x430;&#x436;&#x435; &#x432; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;&#x445; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x43D;&#x430; &#x44D;&#x442;&#x43E; &#x437;&#x430;&#x431;&#x438;&#x432;&#x430;&#x44E;&#x442;. &#x418; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x43A;&#x430;&#x436;&#x435;&#x442;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x442;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43B; &#x430;&#x43F;&#x434;&#x442;&#x435;&#x439;&#x442; &#x43E;&#x442; &#x44E;&#x437;&#x435;&#x440;&#x430;, &#x430; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x445;&#x43E;&#x442;&#x44C; &#x442;&#x440;&#x430;&#x432;&#x430; &#x43D;&#x435; &#x440;&#x430;&#x441;&#x442;&#x438;. &#x412; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; &#x441;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x439; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x43E;&#x439; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x447;&#x440;&#x435;&#x432;&#x430;&#x442;&#x43E; &#x434;&#x43E;&#x43B;&#x433;&#x438;&#x43C; &#x43F;&#x43E;&#x438;&#x441;&#x43A;&#x43E;&#x43C; &#x431;&#x430;&#x433;&#x43E;&#x432;. &#x41D;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x43E; &#x431;&#x434;&#x438;&#x442;&#x44C; &#x437;&#x430; &#x442;&#x435;&#x43C; &quot;&#x430; &#x43D;&#x435; &#x437;&#x430;&#x431;&#x44B;&#x43B; &#x43B;&#x438; &#x44F; &#x432;&#x43E; &#x432;&#x441;&#x435;&#x445; &#x432;&#x435;&#x442;&#x43A;&#x430;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; next?&quot;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x443;</p><pre><code class="language-javascript">class BotScene {
  constructor(name) {
    this.name = name;
    this.scene = new Scenes.BaseScene(name);
  }

  onEnter(...middlewares) {
    this.scene.enter(...createMiddlewres(middlewares));
  }

  onAction(action, ...middlewares) {
    this.scene.action(action, ...createMiddlewres(middlewares));
  }

  on(actionType, ...middlewares) {
    this.scene.on(actionType, ...createMiddlewres(middlewares));
  }

  onCallbackQuery(...middlewares) {
    this.scene.on(callbackQuery(), ...createMiddlewres(middlewares));
  }

  onMessage(...middlewares) {
    this.scene.on(message(&quot;text&quot;), ...createMiddlewres(middlewares));
  }

  getScene() {
    return this.scene;
  }
}</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x43B; &#x43A;&#x43B;&#x430;&#x441;&#x441;, &#x441; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43D;&#x430; &#x432;&#x445;&#x43E;&#x434; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x443;, &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x43F;&#x443;&#x442;&#x430;, callbackQuery, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x431;&#x449;&#x438;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; on, &#x447;&#x435;&#x440;&#x435;&#x437; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x440;&#x443;&#x431;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43B;&#x43B;&#x431;&#x435;&#x43A; &#x43D;&#x430; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442;. &#x410;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x43C; &#x43A;&#x43E;&#x43B;&#x43B;&#x431;&#x435;&#x43A;&#x43E;&#x43C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x43A;&#x430;&#x43A;&#x443;&#x44E;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x432; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44E; &#x438;&#x43B;&#x438; &#x434;&#x435;&#x43B;&#x430;&#x44E;&#x442; &#x43A;&#x430;&#x43A;&#x443;&#x44E;-&#x442;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x43C; &#x43A;&#x43E;&#x43B;&#x43B;&#x431;&#x435;&#x43A;&#x43E;&#x43C;. &#x42D;&#x442;&#x438; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x437;&#x430;&#x43A;&#x430;&#x43D;&#x447;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; next(), &#x438;&#x43D;&#x430;&#x447;&#x435; &#x43D;&#x435; &#x434;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x442;&#x443;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x442;&#x440;&#x443;&#x434;&#x43D;&#x43E;.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x44F;&#x44F; &#x436;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x43E;&#x431;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x44F;&#x432;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>next()</code>, &#x43D;&#x430; &#x432;&#x441;&#x44F;&#x43A;&#x438;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x432; &#x431;&#x43B;&#x43E;&#x43A;&#x435; <code>try catch</code>, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; next &#x431;&#x44B;&#x43B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43D; &#x432; &#x432;&#x430;&#x448;&#x435;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; (&#x434;&#x432;&#x43E;&#x439;&#x43D;&#x43E;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>next</code> &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x442; &#x43A; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44E;)</p><pre><code class="language-javascript">function nextCallWrapper(cb) {
  return async (ctx, next) =&gt; {
    await cb(ctx, next);
    try {
      await next();
    } catch {}
  };
}

function createMiddlewres(middlewares) {
  let lastCallback = middlewares.pop();
  let mainCallback = nextCallWrapper(lastCallback);
  return [...middlewares, mainCallback];
}</code></pre><p>&#x422;&#x430;&#x43A;&#x436;&#x435;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x443;&#x447;&#x435;&#x441;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; middleware &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x441;&#x43B;&#x435; middleware &#x441;&#x446;&#x435;&#x43D; (&#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43E;&#x43A; &#x432;&#x430;&#x436;&#x435;&#x43D;), &#x438; &#x435;&#x441;&#x43B;&#x438; &#x432; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x432;&#x432;&#x43E;&#x434;&#x430;, &#x442;&#x43E; &#x43E;&#x43D; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x432;&#x430;&#x442;&#x438;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x44E;&#x437;&#x435;&#x440;&#x430;, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x435; &#x43F;&#x43E; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x438; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B; (&#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x435; &#x43F;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x443; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x442;&#x435;&#x43A;&#x441;&#x442; &#x432; &#x447;&#x430;&#x442;). &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x435; &#x43D;&#x430; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x43E;&#x435; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B;, &#x438; &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x430;&#x442;&#x447;&#x438;&#x442;&#x441;&#x44F; &#x441; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x438;&#x437; &#x43A;&#x43D;&#x43E;&#x43F;&#x43E;&#x43A;, &#x442;&#x43E; &#x43D;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; next, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x43A;&#x438;&#x434;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x441;&#x446;&#x435;&#x43D;&#x44B;. &#x418; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x44E;&#x430;&#x43D;&#x441;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x435;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; middleware &#x43A;&#x440;&#x43E;&#x43C;&#x435; &#x441;&#x446;&#x435;&#x43D;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x43F;&#x440;&#x43E;&#x43A;&#x438;&#x434;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442;&#x44B; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x432; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x445;. &#x41A;&#x430;&#x43A; &#x431;&#x44B;&#x442;&#x44C;, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; next, &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435; &#x43F;&#x43E;&#x439;&#x434;&#x435;&#x442;. &#x41A;&#x430;&#x43A; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; - &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B; &#x43D;&#x435; &#x43A;&#x430;&#x43A; middleware &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x444;&#x443;&#x43A;&#x43D;&#x446;&#x438;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B;, &#x430; &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x443; (high ordered function) &#x43D;&#x430;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x435;&#x439; &#x441;&#x446;&#x435;&#x43D;&#x44B;. &#x422; &#x435; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x43C;&#x430;&#x442;&#x447;&#x438;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x438;&#x437; &#x43A;&#x43D;&#x43E;&#x43F;&#x43E;&#x43A;, &#x435;&#x441;&#x43B;&#x438; &#x434;&#x430; &#x2013; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x435; &#x43D;&#x430; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443; &#x438; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>next</code>, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442; &#x2013; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x44B;, &#x438; &#x442;&#x43E;&#x436;&#x435; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>next</code>.</p><pre><code class="language-javascript">import globalInlineHanler from ......


function withGlobalInlineHandler(cb) {
  return async (ctx, next) =&gt; {
    let isKeyboardProcessed = await globalInlineHanler(ctx, next); // &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C;  true/false &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x43A;&#x430;&#x43A; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x435; &#x43F;&#x43E; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x438; &#x438;&#x43B;&#x438; &#x43D;&#x435;&#x442; (&#x43F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x441;&#x430;&#x43C;&#x430; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x442; next()) 
    if(!isKeyboardProcessed) {
        await cb(ctx);
        await next();
    }
  };
}


/// &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;

someInputScene.onMessage(withGlobalInlineHandler((ctx) =&gt; {
    /// &#x432;&#x430;&#x448;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x43F;&#x443;&#x442;&#x430;
})</code></pre><p>&#x410; &#x435;&#x441;&#x43B;&#x438; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430; &#x441; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x43E;&#x439; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; middleware &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x432;&#x430;&#x436;&#x43D;&#x430; (&#x442; &#x435; &#x43D;&#x435; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x43E;&#x43A;&#x438;&#x434;&#x44B;&#x432;&#x430;&#x43B;&#x441;&#x44F; &#x432;&#x43E; &#x432;&#x441;&#x435; middleware &#x434;&#x43E; &#x43A;&#x43E;&#x43D;&#x446;&#x430;), &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x43E;&#x442; &#x442;&#x430;&#x43A;</p><pre><code class="language-javascript">fucntion globalInlineHanler(ctx, next){
	if(ctx.update.message.text === &apos;&#x41A;&#x43D;&#x43E;&#x43F;&#x43A;&#x430; 1&apos;) {
    /// &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x430;
    	ctx.scene.enter(&apos;&#x418;&#x43C;&#x44F; &#x441;&#x446;&#x435;&#x43D;&#x44B; 1&apos;);
        return;
    }
    ///&#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442; - &#x43F;&#x440;&#x43E;&#x43A;&#x438;&#x434;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x441;&#x446;&#x435;&#x43D;&#x44B;
    next()
} 




import globalInlineHanler from ......

/// &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;

someInputScene.onMessage(globalInlineHanler, (ctx, next) =&gt; {
    /// &#x432;&#x430;&#x448;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x43F;&#x443;&#x442;&#x430;
})
</code></pre><!--kg-card-begin: markdown--><h5 id="%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0-%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%8B-%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%BA%D0%B8">&#x420;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x438;</h5>
<!--kg-card-end: markdown--><p>&#x421;&#x430;&#x43C;&#x44B;&#x439; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x438;, &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x447;&#x435;&#x440;&#x435;&#x437; TelegramPaymentAPI. &#x41D;&#x43E; &#x432; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x445; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x44F;&#x445; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x44F; &#x43D;&#x435; &#x441;&#x43C;&#x43E;&#x433; - &#x43D;&#x438; &#x43E;&#x434;&#x438;&#x43D; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440; (&#x44F; &#x43F;&#x440;&#x43E;&#x431;&#x43E;&#x432;&#x430;&#x43B; &#x446;&#x435;&#x43B;&#x44B;&#x445;) &#x43D;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x43F;&#x440;&#x438;&#x435;&#x43C; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x435;&#x439; &#x43F;&#x43E; &#x43A;&#x430;&#x440;&#x442;&#x430;&#x43C; &#x447;&#x435;&#x440;&#x435;&#x437; TelegramPaymentAPI (&#x430; &#x441;&#x447;&#x430;&#x441;&#x442;&#x44C;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x442;&#x430;&#x43A; &#x431;&#x43B;&#x438;&#x437;&#x43A;&#x43E;).<br>&#x41F;&#x440;&#x438;&#x448;&#x43B;&#x43E;&#x441;&#x44C; &#x43F;&#x440;&#x438;&#x434;&#x443;&#x43C;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x441;&#x432;&#x43E;&#x435;. &#x41C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x431;&#x43E;&#x442;&#x44B; &#x434;&#x435;&#x43B;&#x430;&#x44E;&#x442; &#x442;&#x430;&#x43A; - &#x433;&#x435;&#x43D;&#x435;&#x440;&#x44F;&#x442; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B; &#x447;&#x435;&#x440;&#x435;&#x437; &#x422;&#x438;&#x43D;&#x44C;&#x43A;&#x43E;&#x444;Pay &#x438;&#x43B;&#x438; &#x42E;&#x43A;&#x430;&#x441;&#x441;&#x443; (&#x432;&#x448;&#x438;&#x432;&#x430;&#x44F; &#x442;&#x430;&#x43C; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x43E; &#x44E;&#x437;&#x435;&#x440;&#x443;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x44C; &#x43A;&#x442;&#x43E; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x438;&#x43B;), &#x44E;&#x437;&#x435;&#x440; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;, &#x43E;&#x43F;&#x43B;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;, &#x430; &#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x432; &#x431;&#x43E;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x44F;&#x442; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x44C; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443; &quot;&#x42F; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x438;&#x43B;&quot;. &#x412;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x443;&#x436;&#x430;&#x441;&#x43D;&#x43E;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E; &#x43C;&#x43D;&#x435; (&#x43D;&#x43E; &#x43D;&#x430;&#x434;&#x435;&#x436;&#x43D;&#x43E;). </p><p>&#x42F; &#x436;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x43C;&#x443;. &#x423;&#x436;&#x430;&#x441;&#x43D;&#x44B;&#x439; &#x444;&#x43B;&#x43E;&#x443; &#x441; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x43E;&#x439; &quot;&#x42F; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x438;&#x43B;&quot; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x43A;&#x430;&#x43A; &#x437;&#x430;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; (&#x442; &#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E; &#x435;&#x435; &#x44E;&#x437;&#x435;&#x440;&#x443;), &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x441;&#x43B;&#x443;&#x448;&#x430;&#x44E;&#x449;&#x438;&#x439; &#x440;&#x435;&#x43A;&#x432;&#x435;&#x441;&#x442;&#x44B; &#x43E;&#x442; &#x42E;&#x41A;&#x430;&#x441;&#x441;&#x44B; &#x43E;&#x431; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x44B;&#x445; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x430;&#x445;. &#x412; &#x43B;&#x43A; &#x42E;&#x43A;&#x430;&#x441;&#x441;&#x430;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43B;&#x435;&#x442;&#x435;&#x442;&#x44C; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43E; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x430;&#x445;. &#x41A;&#x430;&#x43A; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43E;, &#x441;&#x440;&#x430;&#x437;&#x443; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x44E;&#x437;&#x435;&#x440;&#x443; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x431; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;&#x439; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x435;. &#x412; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x438; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x435;&#x434;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x432; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E; &#x441;&#x446;&#x435;&#x43D;&#x443;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;.</p><p>&#x41D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x448; &#x431;&#x43E;&#x442; (&#x430; &#x437;&#x430;&#x43E;&#x434;&#x43D;&#x43E; &#x438; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;) &#x43F;&#x440;&#x438;&#x43B;&#x435;&#x433; &#x432; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B;, &#x432;&#x44B; &#x43F;&#x440;&#x43E;&#x43C;&#x43E;&#x440;&#x433;&#x430;&#x435;&#x442;&#x435; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435;. &#x41D;&#x43E; &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x431;&#x43E;&#x442; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F;, &#x44E;&#x437;&#x435;&#x440; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x441;&#x432;&#x43E;&#x435;&#x433;&#x43E; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x430; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x441;&#x430;&#x43D;&#x43E;&#x439; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x43E;&#x439;.</p><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/02/--------------2024-02-21---19.19.50.png" class="kg-image" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js" loading="lazy" width="495" height="414"></figure><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x443; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x44B;</p><pre><code class="language-javascript">const axios = require(&quot;axios&quot;);
const { v4 } = require(&quot;uuid&quot;);
const PaymentServer = require(&quot;./payment-callback-server&quot;);

const API_URL = &quot;https://api.yookassa.ru/v3/payments&quot;;
const PAYMENT_BASE_URL =
  &quot;https://yoomoney.ru/checkout/payments/v2/contract/bankcard?orderId=&quot;;

class UkassaPaymentService {
  constructor(providerConfig) {
    this.token = providerConfig.secretKey;
    this.shopId = providerConfig.shopId;
    this.paymentServer = new PaymentServer(5023, &quot;/result-payments&quot;);
    this.paymentServer.startServer();
  }

  createAuthHeader() {
    return `Basic ${Buffer.from(`${this.shopId}:${this.token}`).toString(
      &quot;base64&quot;
    )}`;
  }

  async createInvoice(amount, currency, description, userId) {
    let paymentInfo = {
      amount: {
        value: amount,
        currency: currency,
      },
      payment_method_data: {
        type: &quot;bank_card&quot;,
      },
      confirmation: {
        type: &quot;redirect&quot;,
        return_url: &quot;https://t.me/cute_astro_bot&quot;,
      },
      capture: true,
      description,
      metadata: {
        userId,
      },
    };

    try {
      let result = await axios.post(API_URL, paymentInfo, {
        headers: {
          Authorization: this.createAuthHeader(),
          &quot;Idempotence-Key&quot;: v4(),
          &quot;Content-Type&quot;: &quot;application/json&quot;,
        },
      });
      let invoice = result.data;
      return {
        url: `${PAYMENT_BASE_URL}${invoice.id}`,
        invoice,
      };
    } catch (e) {
      console.log(&quot;error with invoice cration&quot;);
      console.log(e);
      return null;
    }
  }

  subscribeOnSuccessPayment(handler) {
    this.paymentServer.attachPaymentHandler(handler);
  }

  async checkPaymentIsDone(paymentId) {
    const url = `${API_URL}/${paymentId}`;
    try {
      let result = await axios.get(url, {
        headers: {
          Authorization: this.createAuthHeader(),
        },
      });
      return {
        isDone: result.data.status === &quot;succeeded&quot;,
        invoice: result.data,
      };
    } catch (e) {
      console.log(e);
      return { isDone: false };
    }
  }
}

module.exports = {
  UkassaPaymentService,
};</code></pre><p><code>subscribeOnSuccessPayment</code> - &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x435;&#x434;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x430;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x438;&#x43D;&#x444;&#x430; &#x43E; &#x442;&#x43E;&#x43C;, &#x43A;&#x442;&#x43E; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x438;&#x43B; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x443;. &#x41F;&#x43E; &#x44D;&#x442;&#x43E;&#x43C;&#x443; id (chat_id) &#x43C;&#x44B; &#x438; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x441;&#x43B;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x44E;&#x437;&#x435;&#x440;&#x430; &#x43E;&#x431; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x43E;&#x434;&#x43B;&#x435;&#x43D;&#x438;&#x438; (&#x432; &#x43D;&#x430;&#x434;&#x435;&#x436;&#x434;&#x435;, &#x447;&#x442;&#x43E; &#x435;&#x43C;&#x443; &#x43D;&#x435; &#x43F;&#x440;&#x438;&#x448;&#x43B;&#x43E;&#x441;&#x44C; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x44D;&#x442;&#x43E;&#x439; &#x443;&#x431;&#x43E;&#x433;&#x43E;&#x439; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x43E;&#x439;).</p><p><code>checkPaymentIsDone</code> - &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x437; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x43B;&#x430;&#x442;&#x435;&#x436;&#x430; &#x43F;&#x43E; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x435;.</p><p><code>PaymentServer</code> - &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x439; http server, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x447;&#x435;&#x440;&#x435;&#x437; nginx &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43D; &#x43A; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x443; &#x43C;&#x43E;&#x435;&#x433;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x430;, &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x43E;&#x444;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x430; &#x42E;&#x43A;&#x430;&#x441;&#x441;&#x430;. &#x42E;&#x43A;&#x430;&#x441;&#x441;&#x443; &#x43E;&#x444;&#x43E;&#x440;&#x43C;&#x438;&#x43B; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x436; &#x447;&#x435;&#x440;&#x435;&#x437; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442; &#x43C;&#x430;&#x433;&#x430;&#x437;&#x438;&#x43D;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x43A;&#x430;&#x43A; &#x434;&#x43B;&#x44F; &#x431;&#x43E;&#x442;&#x43E;&#x432; &#x43E;&#x43F;&#x43B;&#x430;&#x442;&#x443; &#x43F;&#x43E; &#x43A;&#x430;&#x440;&#x442;&#x435; &#x43E;&#x43D;&#x438; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442;, &#x430; &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430; - &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442;. &#x41D;&#x43E; &#x442;&#x430;&#x43C; &#x43F;&#x440;&#x43E;&#x442;&#x43E;&#x43A;&#x43E;&#x43B; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x43A; TelegramPaymentAPI (&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x43B;).</p><pre><code class="language-javascript">function createServer(paymentEndpoint, port, handlers = []) {
  const server = http.createServer((req, res) =&gt; {
    // Handle only POST requests
    if (req.method !== &quot;POST&quot;) {
      res.writeHead(405, { &quot;Content-Type&quot;: &quot;text/plain&quot; });
      res.end(&quot;Method Not Allowed&quot;);
      return;
    }

    let body = &quot;&quot;;
    req.on(&quot;data&quot;, (chunk) =&gt; {
      body += chunk.toString();
    });

    req.on(&quot;end&quot;, async () =&gt; {
      const { pathname, query } = url.parse(req.url);
      const queryParams = querystring.parse(query);
      // Check if the request is for the specified endpoint
      if (
        pathname !== paymentEndpoint ||
        req.headers[&quot;content-type&quot;] !== &quot;application/json&quot;
      ) {
        res.writeHead(404, { &quot;Content-Type&quot;: &quot;text/plain&quot; });
        res.end(&quot;Not Found&quot;);
        return;
      }
      try {
        const payment = JSON.parse(body);
        console.log(&quot;Received JSON data:&quot;, payment);
        handlers.forEach(async (handler) =&gt; {
          try {
            await handler(payment);
          } catch {}
        });
        // Send a response
        res.writeHead(200, { &quot;Content-Type&quot;: &quot;application/json&quot; });
        res.write(
          JSON.stringify({
            success: true,
          })
        );
        res.end();
      } catch (error) {
        res.writeHead(400, { &quot;Content-Type&quot;: &quot;application/json&quot; });
        res.end(JSON.stringify({ success: false }));
      }
    });
  });</code></pre><p>&#x41D;&#x435; &#x437;&#x430;&#x431;&#x443;&#x434;&#x44C;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43D;&#x435; &#x430;&#x431;&#x44B; &#x43A;&#x442;&#x43E; &#x448;&#x43B;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43D;&#x430; &#x432;&#x430;&#x448; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; :)</p><!--kg-card-begin: markdown--><h5 id="%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BF%D1%80%D0%B8%D0%B5%D0%BC%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B9-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%B5%D0%B9-%D0%BE-%D0%B1%D0%B0%D0%B3%D0%B0%D1%85">&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43F;&#x440;&#x438;&#x435;&#x43C;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;&#x435;&#x439; &#x43E; &#x431;&#x430;&#x433;&#x430;&#x445;</h5>
<!--kg-card-end: markdown--><p>&#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430; &#x43F;&#x43E;&#x434; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x43E;, &#x438; &#x44D;&#x442;&#x43E; &#x434;&#x430;&#x436;&#x435; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x435;&#x435;. &#x41D;&#x43E; &#x442;&#x43E;&#x433;&#x434;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; &#x437;&#x430;&#x43A;&#x430;&#x43F;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x436;&#x43E;&#x43D;&#x433;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x431;&#x43E;&#x442;&#x430;&#x43C;&#x438;. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43B; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x411;&#x414; &#x438; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x430; (&#x438;&#x43B;&#x438; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x43E;&#x432;). &#x423; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x430; &#x436;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x439; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x441;&#x43A;&#x438;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B; &#x432; &#x442;&#x43E;&#x43C; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x431;&#x43E;&#x442;&#x435;. &#x420;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x441;&#x43A;&#x438;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;, &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x43C;&#x438;&#x434;&#x43B;&#x432;&#x430;&#x440;&#x44B; &#x43E;&#x442; Telegraf.js</p><p><code>this.bot.use(Composer.acl([admin_id], adminBot));</code></p><p>&#x433;&#x434;&#x435; <code>adminBot</code>, &#x44D;&#x442;&#x43E; &#x443;&#x436;&#x435; &#x434;&#x440;&#x443;&#x433;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x431;&#x43E;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E; &#x442;&#x43E;&#x43C;&#x443; &#x436;&#x435; &#x43F;&#x440;&#x438;&#x43D;&#x446;&#x438;&#x43F;&#x443; &#x447;&#x442;&#x43E; &#x438; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x439; &#x431;&#x43E;&#x442; - &#x441;&#x432;&#x43E;&#x438; &#x441;&#x446;&#x435;&#x43D;&#x44B;, &#x441;&#x432;&#x43E;&#x438; middlwere, &#x441;&#x432;&#x43E;&#x438; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;.</p><pre><code class="language-javascript">let adminBot = new Composer();


adminBot.command(&quot;user&quot;, (ctx) =&gt; {
  ctx.scene.enter(&quot;mainScene&quot;);
});

....... &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438;, &#x43C;&#x438;&#x434;&#x43B;&#x432;&#x430;&#x440;&#x44B; &#x438; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x43A;&#x438;.

adminBot.on(message(&quot;text&quot;), mainGlobalMessageHandler);

module.exports = {
  adminBot,
};</code></pre><p>&#x410; &#x443;&#x436;&#x435; &#x443; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x43E;&#x43C;&#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44E;. &#x41F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44E; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442; &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E;&#x435; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x431;&#x43E;&#x442;&#x435; (&#x441; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x441;&#x43A;&#x440;&#x44B;&#x442;&#x44C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x435;)</p><p>&#x425;&#x43E;&#x442;&#x435;&#x43B;&#x43E;&#x441;&#x44C; &#x431;&#x44B; &#x435;&#x449;&#x435; &#x43F;&#x440;&#x438;&#x43A;&#x440;&#x443;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x431;&#x43E;&#x440; &#x43C;&#x435;&#x442;&#x440;&#x438;&#x43A; &#x432; Grafana &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; Prometheus, &#x43D;&#x43E; &#x431;&#x43E;&#x44E;&#x441;&#x44C; &#x434;&#x43B;&#x44F; &#x43C;&#x43E;&#x435;&#x433;&#x43E; VPS &#x441; 1 GB RAM &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x436;&#x438;&#x440;&#x43D;&#x43E;.</p><p>&#x41F;&#x43B;&#x44E;&#x441; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x439; &#x43F;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x441; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x442;&#x43A;&#x43E;&#x439;, &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x44B; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43D;&#x430;&#x431;&#x43E;&#x440; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x44B;&#x445; callbackQuery. &#x42D;&#x442;&#x43E;&#x442; &#x43D;&#x430;&#x431;&#x43E;&#x440; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x432; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x43C; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x431;&#x43A;&#x43E;&#x43C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x43D;&#x430; &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;. &#x42D;&#x442;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x43D;&#x430;&#x436;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43D;&#x430; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x438; &#x443;&#x436;&#x435; &#x43D;&#x435;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x431;&#x44B;&#x43B;&#x438; &#x440;&#x430;&#x43D;&#x435;&#x435; (&#x438;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x440;&#x435;&#x436;&#x438;&#x43C; &#x434;&#x443;&#x440;&#x430;&#x43A;&#x430;)</p><pre><code class="language-javascript">function createCallbackMarkup(buttonsArray) {
  let allowedReply = {};
  let keyboard = buttonsArray.map((item) =&gt; {
    return item.map((button) =&gt; {
      let text;
      let data;
      let hide = false;
      if (Array.isArray(button)) {
        [text, data, hide = false] = button;
      } else {
        ({ text, data, hide } = button);
      }
      allowedReply[data] = true;
      return Markup.button.callback(text, data, hide);
    });
  });
  return {
    keyboard,
    allowedReply,
  };
}</code></pre><pre><code class="language-javascript">let { keyboard, allowedReply } = createCallbackMarkup([
    [[&quot;&#x1F314; &#x412;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x43E;&#x448;&#x43B;&#x43E;&#x435;&quot;, controls.past]],
    [[&quot;&#x2728; &#x412;&#x430;&#x448;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435;&quot;, controls.present]],
    [[&quot;&#x1F52E; &#x412;&#x430;&#x448;&#x435; &#x431;&#x443;&#x434;&#x443;&#x449;&#x435;&#x435;&quot;, controls.future]],
    [[&quot;&#x41D;&#x435; &#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;&quot;, controls.cancel]],
  ]);
  setAllowedReply(ctx, allowedReply);
.
.
.
function setAllowedReply(ctx, reply) {
  ctx.session.allowedReply = reply;
}</code></pre><pre><code class="language-javascript">function withAllowedCb(handler) {
  return async (ctx, next) =&gt; {
    if (
      ctx.session.allowedReply &amp;&amp;
      ctx.callbackQuery &amp;&amp;
      ctx.callbackQuery.data
    ) {
      let action = ctx.callbackQuery.data;
      if (!ctx.session.allowedReply[action]) {
        return next();
      }
    }
    await handler(ctx, next);
  };
}

usersMainScene.onCallbackQuery(
    withAllowedCb(async (ctx, next) =&gt; {
      /// &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43E; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; callbackQuery &#x438;&#x437; &#x442;&#x435;&#x445;, &#x447;&#x442;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x435;&#x448;&#x435;&#x43D;&#x44B;
      clearAlloweReply(ctx)
    })
)</code></pre><!--kg-card-begin: markdown--><h5 id="upd">UPD</h5>
<p>&#x41F;&#x43E;&#x43A;&#x430; &#x43F;&#x438;&#x441;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E;, &#x43F;&#x43E;&#x43D;&#x44F;&#x43B; &#x447;&#x442;&#x43E; &#x43C;&#x435;&#x445;&#x430;&#x43D;&#x438;&#x43A;&#x430; &#x441; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439; &#x443;&#x436;&#x430;&#x441;&#x43D;&#x430;&#x44F;. &#x41D;&#x435;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44F; &#x43D;&#x430; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x441;&#x430;&#x43C;&#x430; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x430; &#x441;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x433;&#x43E; &#x43D;&#x430;&#x436;&#x430;&#x442;&#x438;&#x44F;, &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43D;&#x435;&#x435; &#x432;&#x44B;&#x43B;&#x435;&#x437;&#x430;&#x435;&#x442; &#x434;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x430;&#x44F; &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x430; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x430;. &#x417;&#x430;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x44F; &#x435;&#x435;, &#x43C;&#x44B; &#x43E;&#x43F;&#x44F;&#x442;&#x44C; &#x432;&#x438;&#x434;&#x438;&#x43C; reply &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x443;. &#x418; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x432; &#x435;&#x435; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x447;&#x430;&#x442; &#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x441; &#x431;&#x43E;&#x442;&#x43E;&#x43C;. &#x42D;&#x442;&#x43E; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43D;&#x435;&#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;, &#x43E;&#x441;&#x43E;&#x431;&#x435;&#x43D;&#x43D;&#x43E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x442; &#x431;&#x43E;&#x442;&#x430; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x437;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x446;&#x435;&#x43B;&#x44B;&#x439; &#x44D;&#x43A;&#x440;&#x430;&#x43D; &#x441;&#x43C;&#x430;&#x440;&#x442;&#x444;&#x43E;&#x43D;&#x430;.<br>
&#x42F; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x430;&#x43B;&#x441;&#x44F; &#x43E;&#x442; &#x43D;&#x435;&#x435; &#x438; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E; inline &#x43A;&#x43B;&#x430;&#x432;&#x438;&#x430;&#x442;&#x443;&#x440;&#x443; &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x438;.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://jem-space.ru/content/images/2024/02/--------------2024-02-21---19.26.39.png" class="kg-image" alt="&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; Telegram &#x431;&#x43E;&#x442;&#x430; &#x43D;&#x430; NodeJs + Telegraf.js" loading="lazy" width="530" height="268"></figure><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#xA0;&#x438; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x44F; &#x43F;&#x440;&#x438;&#x448;&#x435;&#x43B;. &#x427;&#x430;&#x441;&#x442;&#x44C; &#x438;&#x437; &#x43D;&#x438;&#x445;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x435;&#x43B;&#x43E;&#x441;&#x438;&#x43F;&#x435;&#x434;&#x430;&#x43C;&#x438;. &#x415;&#x441;&#x43B;&#x438; &#x437;&#x430;&#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x434;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x439; - &#x432;&#x435;&#x43B;&#x43A;&#x430;&#x43C; &#x432; &#x43C;&#x43E;&#x439; &#x442;&#x435;&#x43B;&#x435;&#x433;&#x440;&#x430;&#x43C; &#x43A;&#x430;&#x43D;&#x430;&#x43B; <a href="https://t.me/five_a_m">SleeplessTech</a>.</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x436;&#x443;, &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x432;&#x441;&#x451; &#x434;&#x435;&#x43F;&#x43B;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <a href="https://dokku.com/">Dokku</a>.</p>]]></content:encoded></item></channel></rss>