<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Vladimir</title><author><name>Vladimir</name></author><id>https://teletype.in/atom/vlad_i_mir</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/vlad_i_mir?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/vlad_i_mir?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-30T23:32:16.760Z</updated><entry><id>vlad_i_mir:Qa02bWD4V8A</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/Qa02bWD4V8A?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Masa: Источник данных для ИИ</title><published>2025-03-15T11:31:49.866Z</published><updated>2025-03-15T11:31:49.866Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/db/c5/dbc5cd75-714b-4e83-9743-6dd1a99d6cd2.png"></media:thumbnail><category term="masa-finance" label="Masa Finance"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/2d/8b/2d8bb7fc-f903-4df0-b18c-3b199987849e.jpeg&quot;&gt;Используя данные в реальном времени для искусственного интеллекта, Маsа обеспечивает работу открытого конвейера для обеспечения потока разведданных</summary><content type="html">
  &lt;p id=&quot;IxRG&quot;&gt;Используя данные в реальном времени для искусственного интеллекта, Маsа обеспечивает работу открытого конвейера для обеспечения потока разведданных&lt;/p&gt;
  &lt;p id=&quot;PRwn&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;QWCt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/8b/2d8bb7fc-f903-4df0-b18c-3b199987849e.jpeg&quot; width=&quot;1120&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;6QoA&quot;&gt;TL;DR&lt;/h2&gt;
  &lt;ul id=&quot;BWMK&quot;&gt;
    &lt;li id=&quot;szSW&quot;&gt;Я часто подчёркиваю своё убеждение, что будущее ИИ будет определяться не несколькими огромными моделями, а тысячами специализированных моделей ИИ, работающих на данных, предоставленных сообществом.&lt;/li&gt;
    &lt;li id=&quot;2zPb&quot;&gt;Masa — это децентрализованный протокол, создающий глобально доступный канал данных для питания следующего поколения приложений и агентов ИИ.&lt;/li&gt;
    &lt;li id=&quot;5bko&quot;&gt;Построенная на Bittensor, Masa управляет специализированными подсетями: Subnet 42 для сбора данных в реальном времени и Subnet 59, &amp;quot;Арена агентов&amp;quot;, для конкурентного взаимодействия ИИ-агентов.&lt;/li&gt;
    &lt;li id=&quot;PKDA&quot;&gt;Subnet 42 демократизирует доступ к данным в реальном времени, значительно снижая затраты разработчиков по сравнению с дорогими API от платформ вроде X (ранее Twitter).&lt;/li&gt;
    &lt;li id=&quot;dAFv&quot;&gt;Subnet 59 геймифицирует эволюцию ИИ, мотивируя агентов постоянно адаптироваться и соревноваться на основе метрик вовлечённости в реальном времени.&lt;/li&gt;
    &lt;li id=&quot;Ui0x&quot;&gt;Благодаря выравниванию с мощными стимулами Bittensor, Masa снижает операционные расходы, увеличивает прибыльность для майнеров данных и стратегически позиционирует себя в растущей децентрализованной экономике ИИ.&lt;/li&gt;
    &lt;li id=&quot;SikR&quot;&gt;Экосистема Masa включает несколько токенов — MASA и два альфа-токена подсетей, — что на первый взгляд может показаться сложным. Я подробно разбираю их в своём эссе.&lt;/li&gt;
    &lt;li id=&quot;vLE3&quot;&gt;С амбициозным видением, основанным на открытости и экономической справедливости, Masa стремится стать фундаментальным компонентом рынка ИИ стоимостью в триллионы долларов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;rEKK&quot;&gt;В блоге &lt;a href=&quot;https://blog.samaltman.com/three-observations&quot; target=&quot;_blank&quot;&gt;прошлого месяца&lt;/a&gt; Сэм Альтман (генеральный директор OpenAI) бросил интригующую фразу:  &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;qJEB&quot;&gt;&lt;strong&gt;&amp;quot;Интеллект модели ИИ примерно равен логарифму ресурсов, использованных для её обучения и работы. Эти ресурсы — это, в первую очередь, вычислительная мощность для обучения, данные и вычислительная мощность для вывода.&amp;quot;  &lt;/strong&gt;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;82MY&quot;&gt;Таким образом, глава одной из ведущих лабораторий ИИ в мире говорит, что вычисления и данные напрямую связаны с интеллектом.&lt;/p&gt;
  &lt;p id=&quot;A6PQ&quot;&gt;Проще говоря, вот моя интерпретация: интеллект = логарифм (вычисления × данные).&lt;/p&gt;
  &lt;p id=&quot;4n0e&quot;&gt;Если серьёзно отнестись к этой формуле, она рисует яркую картину будущего. Истинной валютой власти будут не нефть или золото, а данные. Тот, кто контролирует данные, будет контролировать всё остальное. Их будут накапливать, монетизировать до последнего байта и яростно за них бороться. Те, у кого их не будет, окажутся всё дальше позади.&lt;/p&gt;
  &lt;p id=&quot;tuBc&quot;&gt;Дистопия? Возможно. Но это лишь одна из версий будущего среди множества возможных.&lt;/p&gt;
  &lt;p id=&quot;2TeY&quot;&gt;Masa стоит в центре этого шторма: &lt;a href=&quot;https://www.masa.ai/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;децентрализованный протокол, который стремится построить &amp;quot;Справедливый ИИ&amp;quot;.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;SoCe&quot;&gt;Созданная на основе данных в реальном времени, предоставленных людьми, Masa позиционирует себя как сила открытости и сотрудничества в мире, всё больше определяемом закрытыми системами и привратниками.&lt;/p&gt;
  &lt;p id=&quot;opAJ&quot;&gt;Архитектура Masa спроектирована так, чтобы захватывать ценность в этом будущем, основанном на данных. Она работает на Bittensor, создавая платформу, где участники, предоставляющие данные, и ИИ-агенты могут соревноваться и сотрудничать. Subnet 42 обеспечивает сбор данных в реальном времени, а Subnet 59 поддерживает &amp;quot;Арену агентов&amp;quot; — конкурентное пространство, где ИИ-агенты взаимодействуют, развиваются и получают награды за свои результаты.&lt;/p&gt;
  &lt;p id=&quot;ux7G&quot;&gt;Моё исследовательское эссе на этой неделе раскрывает Masa: от её основополагающей идеи справедливых и открытых данных до её технической инфраструктуры. Я глубоко погружусь в то, как Masa переопределяет каналы данных для разработки ИИ и использует Bittensor как практическую демонстрацию своего видения.&lt;/p&gt;
  &lt;p id=&quot;8sLv&quot;&gt;Если идея будущего, где данные — это новая нефть, кажется одновременно пугающей и захватывающей, то это потому, что так оно и есть.&lt;/p&gt;
  &lt;p id=&quot;lz1Q&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;JGN2&quot;&gt;Расцвет «справедливого ИИ»&lt;/h2&gt;
  &lt;p id=&quot;h7kC&quot;&gt;На протяжении десятилетий данные текли в одном направлении — вверх — в хранилища крупных технологических компаний. Google, Meta, TikTok и другие собирают океаны данных и монетизируют их через рекламу.&lt;/p&gt;
  &lt;p id=&quot;zdqx&quot;&gt;И они снова были вознаграждены за данные в эту эпоху ИИ после GPT. Их хранилища данных позволяют им обучать и запускать колоссальные модели ИИ, закрывая их за стенами садов (ну, кроме Meta, которая приняла ethos открытого исходного кода).&lt;/p&gt;
  &lt;figure id=&quot;j2wW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1f/ea/1fea2148-9af5-44e4-aa1a-e5c878c0c50a.png&quot; width=&quot;493&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jeQ9&quot;&gt;Награда? Оценка этих компаний в триллионы долларов. А люди, чьи данные подпитывают обучение этих моделей ИИ — те, кто пишет твиты, создаёт посты на форумах или редактирует страницы Википедии, — редко получают хоть копейку.&lt;/p&gt;
  &lt;p id=&quot;RU4c&quot;&gt;Да, эта модель привела к чудесам вроде ChatGPT. Капитализм работает. Но при всём этом волшебстве чего-то важного не хватает: справедливости.&lt;/p&gt;
  &lt;p id=&quot;n109&quot;&gt;Теперь представьте другой мир. Каждый раз, когда вы предоставляете данные, вы получаете вознаграждение. Это основное обещание &amp;quot;Справедливого ИИ&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;fTiE&quot;&gt;Вместо того чтобы держать данные под замком на закрытых платформах, мой подход с Masa — открыть всё. Благодаря криптоэкономическим стимулам Masa превращает данные в общий ресурс — такой, к которому каждый может внести вклад, добывать его и получать выгоду в том, что формируется как следующая экономика ИИ стоимостью в триллионы долларов.&lt;/p&gt;
  &lt;h2 id=&quot;vBvf&quot;&gt;История основания Masa  &lt;/h2&gt;
  &lt;p id=&quot;EVAR&quot;&gt;В одной вселенной можно было бы почти подумать о Masa как о &amp;quot;просто ещё одном DeFi-протоколе&amp;quot;. Он был запущен в 2022 году, основателями стали &lt;strong&gt;Калантия Мэй&lt;/strong&gt; и &lt;strong&gt;Брендан Плейфорд &lt;/strong&gt;— дуэт с глубокими корнями в финтехе и криптографии (подробнее о них позже).&lt;/p&gt;
  &lt;p id=&quot;mBGi&quot;&gt;Изначально их миссия заключалась в создании децентрализованного кредитного бюро, которое позволило бы людям владеть и управлять своими финансовыми данными. Но в процессе работы возникла куда более масштабная идея: что, если данные можно реорганизовать, чтобы питать ИИ — справедливо и открыто?&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;vRR4&quot;&gt;&lt;em&gt;&amp;quot;Если открытый исходный код создал экономику в 400 миллиардов долларов для софта, представьте, что открытые данные, справедливо распределённые, могли бы сделать для ИИ.&amp;quot;  &lt;/em&gt;&lt;/blockquote&gt;
    &lt;p id=&quot;roWG&quot; data-align=&quot;right&quot;&gt;&lt;br /&gt; Команда Masa, примерно 2023 год  &lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;byUR&quot;&gt;Эта идея стала основой для эволюции Masa.&lt;/p&gt;
  &lt;p id=&quot;FNVQ&quot;&gt;Путь не был прямым — в криптоиндустрии это редкость, — а скорее представлял собой серию продуманных поворотов, движимых командой, решительно настроенной создать что-то значимое.&lt;/p&gt;
  &lt;p id=&quot;ICx1&quot;&gt;- &lt;strong&gt;Masa 1.0 (2022)&lt;/strong&gt; — Децентрализованное кредитное бюро, сосредоточенное на финансовых данных.  &lt;br /&gt;- &lt;strong&gt;Masa 2.0 (2022)&lt;/strong&gt; — Запуск протокола идентичности soulbound, вдохновлённого концепцией Soulbound Tokens (SBT) Виталика Бутерина.  &lt;br /&gt;- &lt;strong&gt;Masa 3.0 (конец 2023)&lt;/strong&gt; — самый большой поворот: создание сети данных для ИИ, что привело к запуску основной сети протокола Masa и токена MASA в апреле 2024 года.  &lt;/p&gt;
  &lt;p id=&quot;7pLv&quot;&gt;Время выбрано идеально. Когда бум генеративного ИИ набрал полную скорость в 2023–2024 годах, я понял, что Masa может построить нечто критически важное: недостающий слой данных для открытого ИИ.&lt;/p&gt;
  &lt;p id=&quot;uAtP&quot;&gt;Пока такие компании, как OpenAI, создавали колоссальные модели, я сосредоточился на чём-то не менее важном — данных в реальном времени, предоставленных сообществом, чтобы питать эти модели, превращая их в открытый ресурс, а не нечто запертое в корпоративных хранилищах.&lt;/p&gt;
  &lt;p id=&quot;WbnX&quot;&gt;Как объяснила мне Калантия, цель состояла в том, чтобы выйти за рамки технически сложных протоколов (как это часто бывает у стартапов в сфере ИИ) и создать что-то доступное и открытое для всех.&lt;/p&gt;
  &lt;h2 id=&quot;BUAD&quot;&gt;Подсети Bittensor Маsa&lt;/h2&gt;
  &lt;figure id=&quot;qJ1O&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/63/01633cee-4e54-43a5-91d6-c9a2e62671b8.png&quot; width=&quot;745&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PsvT&quot;&gt;Masa начинала с собственного протокола Masa Protocol, запуская параллельные операции по сбору данных с X (ранее Twitter) наряду с подсетью на Bittensor. Это было запутанное время с двумя отдельными сетями и двумя наборами сборщиков данных. Но недавно я заметил, что Masa сделала смелый шаг: полностью присоединилась к Bittensor и поставила своё будущее на TAO.&lt;/p&gt;
  &lt;p id=&quot;n9fy&quot;&gt;Это объединение было стратегическим. Видно, что топовые майнеры приносят куда больше ценности, чем длинный хвост менее конкурентоспособных участников. С TAO в качестве стимула — более ценным активом, чем собственный токен Masa, и оценённым сегодня более чем в &lt;strong&gt;2 миллиарда долларов&lt;/strong&gt;, — подсеть привлекла преданную группу элитных майнеров.&lt;/p&gt;
  &lt;p id=&quot;8tHU&quot;&gt;Публичные данные с &lt;a href=&quot;https://dune.com/masa-network/masa?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;панели Dune&lt;/a&gt; от Masa подтвердили разницу в качестве: 60% высококачественных данных Masa поступало из Subnet 42, несмотря на то, что там было всего 256 майнеров по сравнению с менее конкурентоспособными майнерами на самостоятельном протоколе Masa.&lt;/p&gt;
  &lt;p id=&quot;eIHV&quot;&gt;Мне стало очевидно, что архитектура Bittensor — правильный долгосрочный выбор.&lt;/p&gt;
  &lt;p id=&quot;MzT6&quot;&gt;Чтобы понять, как работает Masa, вот краткое введение в Bittensor.&lt;/p&gt;
  &lt;h3 id=&quot;FtY7&quot;&gt;Bittensor 101&lt;/h3&gt;
  &lt;p id=&quot;fiUQ&quot;&gt;Видно, что Bittensor — &lt;strong&gt;это децентрализованный уровень координации ИИ&lt;/strong&gt;, использующий блокчейн для вознаграждения сотрудничества между моделями ИИ. Это похоже на глобальное шоу талантов ИИ — вместо подтверждения транзакций, как в традиционном блокчейне, он ранжирует ответы ИИ, награждая лучших с помощью TAO, своего нативного токена.&lt;/p&gt;
  &lt;ul id=&quot;LcSn&quot;&gt;
    &lt;li id=&quot;pzQH&quot;&gt;&lt;strong&gt;Как это работает&lt;/strong&gt;&lt;br /&gt; Майнеры присоединяются к подсетям, решая конкретные задачи ИИ, такие как перевод, генерация изображений или финансовые прогнозы.&lt;/li&gt;
    &lt;li id=&quot;25iO&quot;&gt; Валидаторы оценивают и ранжируют результаты, решая, как распределяются награды.&lt;/li&gt;
    &lt;li id=&quot;LYJL&quot;&gt; Владельцы подсетей устанавливают правила, создавая специализированные среды для ИИ.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IZbS&quot;&gt;Каждый блок генерирует 1 TAO, который распределяется в определённых пропорциях между подсетями и их участниками. Каждая подсеть функционирует как собственная мини-сеть, решая уникальные задачи.&lt;/p&gt;
  &lt;p id=&quot;Mnyo&quot;&gt;Bittensor — это чистый Web3: открытый, прозрачный и управляемый сообществом. Он запустился с честным графиком майнинга, похожим на биткоиновский, и собрал почти культовую общину фанатов ИИ и криптоэнтузиастов.&lt;/p&gt;
  &lt;p id=&quot;Jw8m&quot;&gt;Кажется, что с полным переходом на Bittensor Masa теперь управляет двумя специализированными подсетями:&lt;/p&gt;
  &lt;p id=&quot;IFkr&quot;&gt;&lt;strong&gt;Subnet 42: Подсеть данных в реальном времени&lt;/strong&gt;&lt;br /&gt; Сфокусированная на сборе данных, эта подсеть объединяет огромные потоки информации в реальном времени из соцсетей, сайтов и других источников. Она высококонкурентна, с небольшой, но мощной сетью майнеров, которые стабильно поставляют качественные данные.&lt;/p&gt;
  &lt;p id=&quot;hlFu&quot;&gt;&lt;strong&gt;Subnet 59: Арена агентов&lt;/strong&gt;&lt;br /&gt; ИИ-агенты сражаются за эмиссию TAO на основе оценок вовлечённости на X. Агенты могут использовать данные в реальном времени из Subnet 42, чтобы лучше понимать контекст и повышать свои результаты, создавая эволюционирующую систему с игровой теорией.&lt;/p&gt;
  &lt;h2 id=&quot;nDFW&quot;&gt;&lt;strong&gt;Subnet 42: Фабрика данных в реальном времени&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;eNu5&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yJ97&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/cd/30cd44d5-b4e8-4708-9a5b-520410165a24.png&quot; width=&quot;532&quot; /&gt;
    &lt;figcaption&gt;Источник: Taostats.io (11 марта 2025)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;G027&quot;&gt;Понятно, что&lt;a href=&quot;https://taostats.io/subnets/42/chart?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt; Subnet 42&lt;/a&gt; — это амбициозная ставка Masa на создание глобально доступного канала данных для следующего поколения приложений и агентов ИИ.&lt;/p&gt;
  &lt;p id=&quot;iIUw&quot;&gt;В гонке ИИ правила просты: лучшие агенты побеждают благодаря лучшим данным. Но доступ к данным в реальном времени часто стоит дорого. Для большинства разработчиков это неподъёмно.&lt;/p&gt;
  &lt;p id=&quot;JPBL&quot;&gt;Логично, что Subnet 42 создана, чтобы сломать эти барьеры.&lt;/p&gt;
  &lt;p id=&quot;hRLX&quot;&gt;&lt;strong&gt;Как работает Subnet 42&lt;/strong&gt;&lt;br /&gt; Subnet 42 — это постоянно работающая фабрика данных. Децентрализованный поток информации в реальном времени, основанный на запросах разработчиков.&lt;/p&gt;
  &lt;p id=&quot;w7cP&quot;&gt;Это сеть майнеров, непрерывно собирающих данные с платформ — собирающих, очищающих и доставляющих их в сеть. Майнеры устанавливают узел на подсети Bittensor от Masa, чтобы извлекать популярные твиты из X. Хотя сейчас фокус на X, видно, что Masa активно экспериментирует с дополнительными источниками, такими как Telegram, Discord и данные из блокчейнов.&lt;/p&gt;
  &lt;p id=&quot;hirW&quot;&gt;Любой желающий может запустить узел и внести вклад.&lt;/p&gt;
  &lt;p id=&quot;ll9C&quot;&gt;После сбора данных валидаторы выступают в роли контроля качества, гарантируя, что в поток попадает только релевантная и точная информация. Их роль критически важна — ценность Masa зависит от чистых, качественных данных, свободных от спама или лишнего шума. Чтобы стать валидатором, нужно застейкать 1000 TAO (более $220,000), что выравнивает стимулы для надёжных результатов.&lt;/p&gt;
  &lt;p id=&quot;GCXa&quot;&gt;Для укрепления доверия Masa внедряет Trusted Execution Layer (TEE), который гарантирует целостность данных и проверку вычислений, позволяя масштабировать сбор данных до уровня предприятий.&lt;/p&gt;
  &lt;p id=&quot;xh2T&quot;&gt;Затем Masa очищает данные и создаёт вложения в векторную базу данных. Она также предлагает векторное хранение данных, заменяя затраты на базы данных как услугу.&lt;/p&gt;
  &lt;p id=&quot;rs2k&quot;&gt;Кажется, что Masa предоставляет разработчикам полностью управляемый канал данных: данные собираются, структурируются, очищаются и хранятся через единый API.&lt;/p&gt;
  &lt;p id=&quot;poDH&quot;&gt;Система ориентирована на производительность, и участники получают награды в зависимости от качества их вклада. Майнеры и валидаторы могут зарабатывать двойные токены — MASA и альфа-токены подсетей Bittensor.&lt;/p&gt;
  &lt;p id=&quot;iVAD&quot;&gt;&lt;strong&gt;Разработчики, желающие получить доступ к данным&lt;/strong&gt;&lt;br /&gt; Видно, что разработчики могут получить доступ к данным Masa двумя способами: запустить собственный узел или использовать API для разработчиков (нужно заполнить&lt;a href=&quot;https://e0tae9z7anf.typeform.com/to/yDRtJOBM?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&amp;typeform-source=www.chainofthought.xyz&quot; target=&quot;_blank&quot;&gt; форму для доступа&lt;/a&gt;). Во втором квартале, вероятно, API превратится в полноценный SaaS-интерфейс для пользователей.&lt;/p&gt;
  &lt;p id=&quot;VqcI&quot;&gt;Оба варианта открывают доступ к данным в реальном времени для создания мощных приложений.&lt;/p&gt;
  &lt;figure id=&quot;6Tib&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/be/80/be804df5-82ba-4362-af11-b46d1e7149b0.png&quot; width=&quot;928&quot; /&gt;
    &lt;figcaption&gt;Источник: &lt;a href=&quot;https://dune.com/masa-network/masa&quot; target=&quot;_blank&quot;&gt;https://dune.com/masa-network/masa&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Z9CS&quot;&gt;Subnet 42 уже обрабатывает десятки миллионов записей данных ежедневно и превысила 300 миллионов записей на сегодняшний день. Следующий шаг? Расширение и масштабирование. Понятно, что Masa планирует добавить больше источников данных, упростить подключение майнеров и валидаторов и укрепить интеграцию с более широкой сетью Bittensor (например, с другими подсетями).&lt;/p&gt;
  &lt;p id=&quot;FIjT&quot;&gt;Если это удастся, Subnet 42 может стать основным каналом для данных ИИ в реальном времени, предоставляя свежие, нефильтрованные инсайты для следующей волны моделей ИИ.&lt;/p&gt;
  &lt;p id=&quot;EAjf&quot;&gt;Для контекста: ручной сбор данных с Twitter без API ограничен примерно 900 запросами за 15 минут. Распределённая модель Subnet 42 намного эффективнее: в раннем доступе Subnet 42 уже обеспечивает в 3 раза большую пропускную способность по сравнению с API Twitter.&lt;/p&gt;
  &lt;p id=&quot;aYJg&quot;&gt;ИИ работает на данных. Subnet 42 гарантирует, что этот источник никогда не иссякнет.&lt;/p&gt;
  &lt;h2 id=&quot;hr6V&quot;&gt;&lt;strong&gt;Subnet 59: &amp;quot;Арена агентов&amp;quot;&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure id=&quot;p3Hd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ed/c9/edc92175-44fa-41c0-9f07-3dcac002b954.png&quot; width=&quot;535&quot; /&gt;
    &lt;figcaption&gt;Источник: Taostats.io (11 марта 2025)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;sObJ&quot;&gt;&amp;quot;Что, если бы у вас было тысяча ИИ-персоналий, каждая специализированная на чём-то — комедии, анализе рынка, личном общении — и соревнующаяся в гигантском колизее?&amp;quot;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;mCla&quot;&gt;Данные — это основа Masa. &lt;a href=&quot;https://taostats.io/subnets/59/chart?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Арена агентов&lt;/a&gt; (Subnet 59) воплощает их в действие.&lt;/p&gt;
  &lt;p id=&quot;RYXP&quot;&gt;Кажется, что это дарвиновский Колизей, где ИИ-агенты ежедневно сражаются за эмиссию TAO. Маленькие ИИ-гладиаторы в арене, постоянно развивающиеся и борющиеся за внимание, вовлечённость и награды на X.&lt;/p&gt;
  &lt;p id=&quot;G4XD&quot;&gt;Каждый агент в арене регистрируется с кошельком, стейкает небольшое количество TAO и MASA, а затем интегрирует данные в реальном времени из Subnet 42.&lt;/p&gt;
  &lt;p id=&quot;zJ8U&quot;&gt;Далее агенты выполняют разные задачи — публикуют посты на X, анализируют данные из блокчейнов или взаимодействуют с другими агентами. Валидаторы оценивают их производительность по вовлечённости и качеству контента, а лучшие получают долю ежедневной эмиссии TAO.&lt;/p&gt;
  &lt;p id=&quot;sTZR&quot;&gt;В этой арене &lt;strong&gt;внимание&lt;/strong&gt; — это всё. Агентов судят не только по объёму контента, но и по тому, насколько они находят отклик у пользователей. Лучшие агенты поднимаются в таблице лидеров, а те, кто не успевает, уходят в тень.&lt;/p&gt;
  &lt;p id=&quot;Txkp&quot;&gt;Это жестоко конкурентная система. Со временем слабые агенты отсеиваются из сети, оставляя только самых креативных, релевантных и вовлекающих.&lt;/p&gt;
  &lt;p id=&quot;bsRW&quot;&gt;&lt;strong&gt;Как работает оценка агентов&lt;/strong&gt;&lt;br /&gt; Оценка каждого агента зависит от его активности на X за последние семь дней.&lt;/p&gt;
  &lt;p id=&quot;3Y8Q&quot;&gt;Каждый твит и взаимодействие оцениваются по набору метрик. Вовлечённость — король: лайки, ретвиты, ответы и просмотры влияют на счёт агента. Длинные твиты вознаграждаются, если они остаются интересными, и учитываются только свежие посты, чтобы агенты оставались активными.&lt;/p&gt;
  &lt;p id=&quot;moB0&quot;&gt;Для справедливости оценки нормализуются среди всех участников и корректируются логарифмической функцией, которая поощряет стабильность.&lt;/p&gt;
  &lt;p id=&quot;acTu&quot;&gt;Эта конкурентная структура создаёт сильную динамику. Агенты должны не только создавать качественный контент, но и делать это постоянно. Некоторые могут специализироваться на торговых сигналах, другие — стать мастерами комедии или общения. Это открытое поле для творчества.&lt;/p&gt;
  &lt;p id=&quot;Gp4X&quot;&gt;Источник: &lt;a href=&quot;https://app.masa.finance/agent-arena&quot; target=&quot;_blank&quot;&gt;https://app.masa.finance/agent-arena&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;tq71&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fc/61/fc61330d-cc8f-4e89-8b24-142bebb207f8.png&quot; /&gt;
    &lt;figcaption&gt;Источник: &lt;a href=&quot;https://app.masa.finance/agent-arena&quot; target=&quot;_blank&quot;&gt;https://app.masa.finance/agent-arena&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;f0Kj&quot;&gt;Один из топовых агентов сегодня — &lt;a href=&quot;https://x.com/seraphagent?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Seraph&lt;/a&gt;, ИИ-агент, созданный BitMind (Subnet 34). Я посмотрел на топ-10 агентов в таблице лидеров и проверил их уровни вовлечённости… Пока планка не так высока.&lt;/p&gt;
  &lt;p id=&quot;wBJg&quot;&gt;Для тех, у кого есть хорошо спроектированный ИИ-агент, Арена агентов может стать неисследованной золотой жилой — работайте как &amp;quot;майнер&amp;quot; и соревнуйтесь за ежедневную эмиссию токенов.&lt;/p&gt;
  &lt;p id=&quot;VNQW&quot;&gt;Арена агентов — это испытательный полигон для эволюции ИИ. Видно, что Masa представляет огромное экосистему ИИ-персоналий, каждая из которых борется за внимание в общем пуле наград. Правила просты: &lt;strong&gt;&lt;em&gt;вовлекай или исчезай&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;vqKv&quot;&gt;&lt;strong&gt;Загадочный случай TAOCAT&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;0GfR&quot;&gt;&lt;a href=&quot;https://x.com/taocat_agent?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;TAOCAT&lt;/a&gt; начался как шутливый эксперимент: &lt;em&gt;что, если объединить манию мемкоинов с ИИ, который твитит кошачьи каламбуры и реагирует на тренды Twitter в реальном времени?&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;z5dl&quot;&gt;Команда Masa взялась за идею. Они интегрировали данные Subnet 42 в ИИ-агента с кошачьей тематикой, запустили его на Virtuals Protocol, выпустили токен TAOCAT и раздали его сообществу Bittensor. Затем они сели и стали ждать.&lt;/p&gt;
  &lt;p id=&quot;dCLs&quot;&gt;То, что произошло дальше, удивило всех. TAOCAT быстро стал одним из топовых ИИ-мем-агентов в экосистеме. За недели он собрал сообщество из 120,000 держателей токенов. Он стал первым ИИ-агентом, поддержанным фондом DWF AI Agent Fund на $20M.&lt;/p&gt;
  &lt;p id=&quot;E0IR&quot;&gt;Даже другие ИИ-агенты, такие как Sekoia, начали看好 (быть оптимистичными) по поводу кота.&lt;/p&gt;
  &lt;figure id=&quot;6a2Q&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9d/92/9d92592f-a4de-41d1-ba69-e528a3d59cf9.png&quot; width=&quot;658&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mBCU&quot;&gt;Но за мемами скрывается стратегия выхода на рынок. ИИ-мем-агенты используют культуру розничной торговли, где финансовый нигилизм встречается со спекуляцией.&lt;/p&gt;
  &lt;p id=&quot;HWiv&quot;&gt;&lt;em&gt;5% от общего предложения токенов TAOCAT было распределено более чем 10,000 держателям MASA в день запуска.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;EXfm&quot;&gt;&lt;strong&gt;Секрет TAOCAT&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;dtf4&quot;&gt; TAOCAT — это самообновляющаяся ИИ-персоналия. Он мгновенно реагирует на новости, мемы и рыночные тренды, создавая самоподдерживающийся цикл вовлечённости, который подпитывает его вирусность.&lt;/p&gt;
  &lt;p id=&quot;8c2Z&quot;&gt;TAOCAT 2.0 планирует пойти дальше — стать майнером на нескольких подсетях Bittensor, генерировать доход и делиться прибылью с сообществом. TAOCAT — это нативный продукт Bittensor, интегрирующий живые данные Subnet 42 с возможностями LLM из Subnet 19, превращаясь в полностью интерактивный ИИ.&lt;/p&gt;
  &lt;figure id=&quot;nOnZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d6/80/d680b92d-0237-4dc7-b5c0-d29bcd8f8f8e.png&quot; width=&quot;869&quot; /&gt;
    &lt;figcaption&gt;Аналитика TAOCAT (18 февраля 2025). Источник: Cookie.fun&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;206v&quot;&gt;Его взлёт поднимает большой вопрос: что произойдёт, когда ИИ-агенты станут более вовлекающими — и влиятельными — чем люди? С данными в реальном времени ИИ-сущности могут доминировать в торговле, контенте и маркетинге влияния, перестраивая экономики как автономные, самоинвестирующие агенты.&lt;/p&gt;
  &lt;p id=&quot;717I&quot;&gt;Белая книга Masa &lt;a href=&quot;https://github.com/masa-finance/whitepaper/blob/main/masa-whitepaper.pdf?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;от 2023 года&lt;/a&gt; описывает будущее координации множества агентов через глобальный реестр, применяя теорию игр среднего поля для баланса индивидуальных и коллективных стимулов.&lt;/p&gt;
  &lt;h3 id=&quot;Sm8x&quot;&gt;&lt;strong&gt;Варианты использования&lt;/strong&gt;&lt;/h3&gt;
  &lt;figure id=&quot;NCID&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/94/26/9426a3a8-c644-4b43-9156-da57b9f4e3fc.png&quot; width=&quot;804&quot; /&gt;
    &lt;figcaption&gt;&lt;strong&gt;Доступ и цены на API X&lt;/strong&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Z9nd&quot;&gt;Бизнес-кейс Masa прост и очевиден: он решает простую, но дорогую проблему.&lt;/p&gt;
  &lt;p id=&quot;PAAh&quot;&gt;&lt;strong&gt;Данные ИИ в реальном времени нелепо переоценены.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;qhOh&quot;&gt;Сегодня X (ранее Twitter) взимает более $5,000 в месяц за доступ к API, а агенты вроде &lt;a href=&quot;https://x.com/aixbt_agent?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;aixbt &lt;/a&gt;тратят $42,000 ежемесячно на Enterprise API, чтобы поддерживать свои торговые инсайты.&lt;/p&gt;
  &lt;p id=&quot;yIhE&quot;&gt;Masa переворачивает эту модель.&lt;/p&gt;
  &lt;p id=&quot;RyN1&quot;&gt;Разработчики могут подключиться к данным Subnet 42, готовым для ИИ, за долю стоимости (сегодня даже бесплатно). Бизнесы могут использовать Subnet 42 для обогащения данных, питая всё — от чат-ботов до моделей риска.&lt;/p&gt;
  &lt;p id=&quot;2A5e&quot;&gt;С таким огромным разрывом в ценах коммерческая модель Masa — явный выигрыш, при условии, что сеть сохранит высокое качество данных.&lt;/p&gt;
  &lt;p id=&quot;mYn7&quot;&gt;Майнеры субсидируются TAO. Masa также получает эмиссию TAO как владелец подсети. Это означает, что в отличие от бизнес-моделей Web2, Masa не нужно полностью полагаться на комиссии для поддержки своей сети. Конечно, это также значит, что долгосрочный успех Masa связан с ростом Bittensor.&lt;/p&gt;
  &lt;p id=&quot;NpVp&quot;&gt;Самое важное — Masa устраняет закрытые сады. Будь вы майнером данных, валидатором или разработчиком ИИ, вы участник открытой, стимулирующей сети, где каждый получает оплату за вклад.&lt;/p&gt;
  &lt;p id=&quot;d4gQ&quot;&gt;&lt;strong&gt;Что можно сделать с данными ИИ в реальном времени?&lt;/strong&gt;&lt;br /&gt; Многое. Возможности безграничны, но в сфере ИИ-агентов заметны такие идеи:&lt;/p&gt;
  &lt;ul id=&quot;FDbo&quot;&gt;
    &lt;li id=&quot;nhQz&quot;&gt;&lt;strong&gt;DeFi&lt;/strong&gt; — ИИ-агенты, оптимизирующие стратегии доходности, перебалансирующие портфели и выполняющие сделки между цепочками.&lt;/li&gt;
    &lt;li id=&quot;FSIc&quot;&gt;&lt;strong&gt;Рыночная аналитика&lt;/strong&gt; — Анализ настроений Twitter, активности в блокчейнах и макротрендов в реальном времени для высокочастотных торговых ботов.&lt;/li&gt;
    &lt;li id=&quot;55sJ&quot;&gt;&lt;strong&gt;Автоматизация сообществ&lt;/strong&gt; — ИИ-боты, которые выявляют тренды, фильтруют спам и управляют Discord, Telegram и Twitter в масштабе.&lt;/li&gt;
    &lt;li id=&quot;opz2&quot;&gt;&lt;strong&gt;Персонализированные ИИ-помощники&lt;/strong&gt; — Агенты, которые анализируют, предсказывают и реагируют в реальном времени, адаптируясь к индивидуальным потребностям и поведению.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;YHxM&quot;&gt;&lt;strong&gt;Токеномика Masa&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;Fyed&quot;&gt;На первый взгляд, экосистема токенов Masa кажется лабиринтом.&lt;/p&gt;
  &lt;p id=&quot;j14f&quot;&gt;Есть основной токен &lt;strong&gt;MASA&lt;/strong&gt;, ERC-20, работающий на Ethereum mainnet, Base и BNB. А ещё есть новые &lt;strong&gt;альфа-токены&lt;/strong&gt; подсетей, появившиеся после обновления Bittensor до динамического &lt;strong&gt;TAO (dTAO)&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;uZxO&quot;&gt;&lt;em&gt;Если вы ещё не в курсе, есть простое руководство по обновлению dTAO &lt;a href=&quot;https://www.masa.ai/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;&lt;/em&gt;&lt;a href=&quot;https://www.masa.ai/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Awwj&quot;&gt;Итак, есть 3 основных токена, на которые стоит обратить внимание:&lt;/p&gt;
  &lt;ul id=&quot;FcjW&quot;&gt;
    &lt;li id=&quot;x2mt&quot;&gt;&lt;strong&gt;MASA&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;XaQu&quot;&gt;&lt;strong&gt;SAMEKH&lt;/strong&gt; (альфа-токен Subnet 42)&lt;/li&gt;
    &lt;li id=&quot;Y1ws&quot;&gt;&lt;strong&gt;DAL&lt;/strong&gt; (альфа-токен Subnet 59)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;bjTA&quot;&gt;Каждый выполняет свою роль, но в конечном итоге ценность должна где-то аккумулироваться — и тут становится интересно.&lt;/p&gt;
  &lt;h2 id=&quot;MzMA&quot;&gt;&lt;strong&gt;Для токена MASA:&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure id=&quot;879w&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/31/b2/31b2b2d5-4bba-4836-98f2-1169870963b4.png&quot; width=&quot;993&quot; /&gt;
    &lt;figcaption&gt;Источник: Coinmarketcap&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ptgc&quot;&gt;MASA функционирует как базовый токен расчётов и утилит для всей экосистемы. Долгосрочная устойчивость MASA зависит от поддержания спроса при управлении давлением продаж. Вот как создаётся спрос:&lt;/p&gt;
  &lt;ul id=&quot;r5Uz&quot;&gt;
    &lt;li id=&quot;VxQ1&quot;&gt;&lt;strong&gt;Обязательный стейкинг MASA (март 2025):&lt;/strong&gt; Майнеры должны будут стейкать MASA для участия в подсетях Bittensor от Masa, фиксируя предложение и стимулируя спрос. Стейкеры получают 15-25% годовых, увеличивая ликвидность и делая долгосрочное持有 (удержание) привлекательным.&lt;/li&gt;
    &lt;li id=&quot;So86&quot;&gt;&lt;strong&gt;Комиссии за данные корпоративного уровня (вторая половина 2025):&lt;/strong&gt; Masa начнёт взимать плату с разработчиков за приоритетный доступ к потоку данных Subnet 42 через API корпоративного уровня. Платежи можно проводить в MASA, TAO, USDT или USDC, но все платежи не в MASA будут использованы для покупки MASA, усиливая его утилитарность.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;QhUC&quot;&gt;С другой стороны, давление со стороны предложения MASA исходит от:&lt;/p&gt;
  &lt;p id=&quot;o8RM&quot;&gt;На данный момент около 40% MASA уже разблокировано, оставшиеся 60% будут разблокированы в ближайшие годы. Ключевая дата — март 2025 (год после TGE), когда начнут разблокироваться токены частной продажи (инвесторов). Если комиссии экосистемы и стимулы стейкинга не поглотят давление продаж, MASA может столкнуться с понижением цены при разблокировках.&lt;/p&gt;
  &lt;p id=&quot;CmGq&quot;&gt;Чтобы стимулировать удержание, Masa запускает программу поощрения держателей на 15 миллионов MASA — предлагая $700,000 в наградах тем, кто стейкает MASA вместе с альфа-токенами подсетей. Чем дольше и больше стейк, тем выше годовая доходность, укрепляя долгосрочную приверженность экосистеме.&lt;/p&gt;
  &lt;p id=&quot;i79M&quot;&gt;На момент написания MASA торгуется с рыночной капитализацией $14M (цена токена $0.023) и полностью разводнённой оценкой в $38M.&lt;/p&gt;
  &lt;h3 id=&quot;i2Si&quot;&gt;&lt;strong&gt;Альфа-токены подсетей&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;2UHN&quot;&gt;&lt;br /&gt; &lt;/p&gt;
  &lt;figure id=&quot;0B9c&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/fe/eafe0638-cfdb-422c-895a-e8c96a983c70.png&quot; width=&quot;544&quot; /&gt;
    &lt;figcaption&gt;Процент эмиссии TAO для Subnet 42&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UXV3&quot;&gt;Для подсетей Bittensor 42 и 59 майнеры и валидаторы зарабатывают альфа-токены подсетей на основе производительности, напрямую вознаграждая качественных участников, которые поддерживают сеть. Эти токены стимулируют участие и утилитарность. Майнеры и валидаторы подсетей также получат долю от комиссий за приоритетный доступ в MASA.&lt;/p&gt;
  &lt;p id=&quot;9Mwe&quot;&gt;В конечном итоге успех Masa зависит от генерации достаточных комиссий от своего протокола данных, чтобы противостоять предстоящим разблокировкам токенов. Хорошо то, что майнеры в основном финансируются за счёт стимулов TAO, которые существуют вне экосистемы — то есть Masa не платит им напрямую.&lt;/p&gt;
  &lt;p id=&quot;Th4J&quot;&gt;Теперь вызов? Создать спрос на альфа-токены подсетей, чтобы получать больше эмиссии TAO, поддерживать утилитарность MASA и убедиться, что вся экосистема держится вместе, когда начнутся частные разблокировки.&lt;/p&gt;
  &lt;p id=&quot;NEg6&quot;&gt;Masa расставила все фигуры. Теперь дело за исполнением и принятием.&lt;/p&gt;
  &lt;h3 id=&quot;VSuz&quot;&gt;&lt;strong&gt;Команда и финансирование&lt;/strong&gt;&lt;/h3&gt;
  &lt;figure id=&quot;Wo4k&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/7c/9a7ce3e0-d00f-40c0-9b37-d7e3c7cb2240.png&quot; width=&quot;794&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cNGH&quot;&gt; Команду Masa возглавляют сооснователи &lt;a href=&quot;https://www.linkedin.com/in/calanthia/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&amp;original_referer=https%253A%252F%252Fwww.chainofthought.xyz%252F&quot; target=&quot;_blank&quot;&gt;Калантия Мэй&lt;/a&gt; и &lt;a href=&quot;https://www.linkedin.com/in/brendanplayford/&quot; target=&quot;_blank&quot;&gt;Брендан Плейфорд&lt;/a&gt; — два высококлассных специалиста с глубоким опытом в финтехе, ИИ и блокчейне.&lt;/p&gt;
  &lt;p id=&quot;FjA3&quot;&gt;Карьера Калантии Мэй охватывает инвестиционный банкинг, венчурный капитал и масштабирование финтех-стартапов. До Masa она была одним из основателей PayPal Ventures, где поддерживала стартапы, определяющие категории в финтехе и коммерции. Она также сыграла ключевую роль в ранней стратегии PayPal по инвестициям в блокчейн и криптовалюты. Позже, как вице-президент по развитию бизнеса в Fast, она помогла масштабировать стартап до 450 сотрудников, привлекла $130M перед его приобретением Affirm.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;3ygw&quot;&gt;&amp;quot;Мы выбрали Bittensor за его революционный дизайн стимулов. Большинство людей не осознают, что более $900 миллионов ежегодных стимулов поддерживают экосистему Bittensor. Каждая подсеть, майнер и валидатор борются за доминирование, вместе создавая конкурентную и стимулирующую экосистему строителей ИИ.&amp;quot;&lt;/blockquote&gt;
    &lt;blockquote id=&quot;fkDA&quot;&gt;&lt;br /&gt; &amp;quot;ИИ-агенты — это интерфейс и UI/UX для ИИ в будущем. Проекты только с инфраструктурой больше не удовлетворят рынок.&amp;quot;&lt;/blockquote&gt;
    &lt;p id=&quot;2ZZW&quot; data-align=&quot;right&quot;&gt;&lt;br /&gt; — Калантия Мэй&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;wzl3&quot;&gt;Из бесед с Калантией заметно её способность предвидеть изменения. Она чётко видит, куда движется рынок, и как Masa может оставаться впереди. Она знает, что Bittensor станет полем битвы за будущее децентрализованного ИИ. Для неё ИИ-агенты — не просто временный тренд, а следующая эволюция взаимодействия с ИИ.&lt;/p&gt;
  &lt;p id=&quot;rREJ&quot;&gt;Брендан в крипто с 2013 года. До Masa он основал &lt;a href=&quot;https://pngme.com/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Pngme&lt;/a&gt;, платформу инфраструктуры кредитования и API, ориентированную на финансовую инклюзию в Африке. Ранее он запускал The Bureau, блокчейн-инкубатор, и руководил генерацией спроса в DroneDeploy.&lt;/p&gt;
  &lt;p id=&quot;u9FY&quot;&gt;Masa привлекла более $17 миллионов финансирования:&lt;/p&gt;
  &lt;ul id=&quot;R5OT&quot;&gt;
    &lt;li id=&quot;wusE&quot;&gt;&lt;a href=&quot;https://www.finsmes.com/2022/05/masa-finance-raises-3-5m-pre-seed-funding.html?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Предпосевное финансирование&lt;/a&gt; $3.5M в 2022 от Unshackled Ventures, Flori Ventures, GoldenTree.&lt;/li&gt;
    &lt;li id=&quot;mdbn&quot;&gt;Masa окончила &lt;a href=&quot;https://www.bnbchain.org/en/blog/join-us-for-mvb-vi-demo-day?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;инкубатор Binance Labs Most-Valuable-Builder в июне 2023&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;TqAh&quot;&gt;&lt;a href=&quot;https://www.theblock.co/post/273984/masa-network-seed-round?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Посевной раунд&lt;/a&gt; $5.4M в начале 2024, возглавляемый Anagram, DCG и Avalanche Blizzard fund, заложил основу для быстрого роста.&lt;/li&gt;
    &lt;li id=&quot;UcYv&quot;&gt;&lt;a href=&quot;https://coinlist.co/masa?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;В марте 2024 импульс усилился&lt;/a&gt;, когда продажа на CoinList принесла $8.75M от публики при полностью разводнённой оценке $125M.&lt;/li&gt;
    &lt;li id=&quot;whNX&quot;&gt;К декабрю 2024 DCG и FBG Capital удвоили ставку с &lt;a href=&quot;https://markets.businessinsider.com/news/currencies/masa-secures-new-funding-from-dcg-to-expand-real-time-data-network-and-launch-ai-agent-arena-on-bittensor-1034151240?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;дополнительным стратегическим финансированием&lt;/a&gt; (сумма не разглашается).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;Yo8O&quot;&gt;&lt;strong&gt;Мои мысли&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;JGIc&quot;&gt;&lt;strong&gt;1. Инновационная бизнес-модель, но не без рисков&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;BEY3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/23/82/2382f363-7c4d-4fe2-b3b6-5948a814e38c.png&quot; width=&quot;892&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8mZ8&quot;&gt;Понятно, что Masa переписывает правила игры в ИИ, превращая добычу данных в децентрализованную, токен-управляемую экономику. Вместо традиционной модели — где провайдеры вроде Scale AI имеют высокие операционные расходы и маржу 50–60% — Masa меняет подход, используя TAO для субсидирования своей сети майнеров.&lt;/p&gt;
  &lt;p id=&quot;bMsM&quot;&gt;Награждая участников токенами, а не деньгами, Masa снижает операционные расходы и потенциально доводит маржу до &lt;strong&gt;80–90%&lt;/strong&gt;. Самые большие победители? &lt;strong&gt;Стартапы и независимые разработчики ИИ&lt;/strong&gt;, которые теперь получают качественные данные в реальном времени без огромных затрат на API.&lt;/p&gt;
  &lt;p id=&quot;FuMX&quot;&gt;Конечно, есть и обратная сторона. Привязка к подсетям Bittensor добавляет два риска:&lt;/p&gt;
  &lt;p id=&quot;f0tS&quot;&gt;Во-первых, если Bittensor пошатнётся или цена TAO рухнет, это сильно ударит по способности Masa работать. Это внешний риск, о котором стоит помнить — волатильность криптовалют уже погубила немало перспективных проектов.&lt;/p&gt;
  &lt;p id=&quot;tpKp&quot;&gt;Во-вторых, успех Masa зависит от того, с&lt;strong&gt;могут ли её подсети продолжать привлекать значительный процент эмиссии Bittensor&lt;/strong&gt;, что требует эффективного маркетинга и хорошо продуманных стимулов для майнеров и валидаторов. С появлением новых подсетей конкуренция усилится. Внутри подсети правильные метрики оценки критически важны — плохой дизайн может привести к эксплуатации, подрывая импульс и ценность сети.&lt;/p&gt;
  &lt;p id=&quot;GbQx&quot;&gt;Следующий большой шаг — закрепить корпоративных клиентов. Как только API будет полностью готов, кажется, это будет лёгкая сделка.&lt;/p&gt;
  &lt;p id=&quot;kTC2&quot;&gt;Masa также хочет расширить источники данных, улучшить аннотации, сократив разрыв между &amp;quot;сырыми данными низкого уровня&amp;quot; и &amp;quot;золотом, готовым для ИИ&amp;quot;. Если это удастся, мы можем увидеть целый рынок данных, питающий серьёзные решения в финансах, логистике, здравоохранении и других областях. Представьте аналитику мировых сельхозугодий, сбор медицинских данных (с приватностью) или данные датчиков цепочек поставок.&lt;/p&gt;
  &lt;figure id=&quot;fHO3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/44/52/4452782f-9587-45c0-a95c-975a2e80123c.png&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QzON&quot;&gt;&lt;strong&gt;2. Альфа-токены подсетей против токена MASA&lt;/strong&gt;&lt;br /&gt; Мне нравится делать ставки на сильные команды. Когда речь заходит о Masa, понять, куда вложить усилия, не так просто, особенно с подсетными токенами и MASA.&lt;/p&gt;
  &lt;p id=&quot;meJV&quot;&gt;Оба типа токенов играют ключевые роли в экосистеме. Однако токеномика устроена так, что долгосрочная фундаментальная ценность скорее всего будет аккумулироваться в MASA. Во многом MASA действует как базовая валюта, собирая комиссии, поддерживая обратные выкупы и аккумулируя ценность от общей активности сети.&lt;/p&gt;
  &lt;figure id=&quot;T9H0&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/af/9d/af9d34c4-b285-4470-91e5-72c14c3d4ec7.png&quot; width=&quot;689&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UiQp&quot;&gt;Дорожная карта dTAO-MASA создана для формирования позитивного маховика: активность в подсетях (42 и 59) генерирует награды, которые часто возвращаются в MASA. Например, доходы от комиссий — даже оплаченные в других валютах — конвертируются в MASA. Кроме того, предстоящие требования стейкинга для майнеров и программы стимулов настроены на сокращение циркулирующего предложения MASA, что обычно поддерживает его цену со временем.&lt;/p&gt;
  &lt;p id=&quot;s8I4&quot;&gt;С другой стороны, токены подсетей — новенькие, с высокой инфляцией, что ведёт к сильному давлению продаж и краткосрочной волатильности. Как подробно описано в&lt;a href=&quot;https://www.chainofthought.xyz/p/your-guide-to-dynamic-tao-dtao&quot; target=&quot;_blank&quot;&gt; руководстве по dTAO&lt;/a&gt;, с &lt;strong&gt;подсетными токенами нужно терпение.&lt;/strong&gt;&lt;/p&gt;
  &lt;h3 id=&quot;LTqK&quot;&gt;&lt;strong&gt;🌈 Исследовательский уровень Alpha&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;AyqV&quot;&gt;&lt;br /&gt; Видно много способов участвовать в успехе Masa:&lt;/p&gt;
  &lt;ul id=&quot;Q935&quot;&gt;
    &lt;li id=&quot;MAIy&quot;&gt;Если вы разработчик ИИ: получите данные X в реальном времени бесплатно из Subnet 42 Bittensor от Masa. Это намного дешевле, чем платить Элону. Данные в реальном времени означают, что ваш ИИ может реагировать на живые события — вроде твита от Элона — за секунды. Смотрите документацию Masa о запуске узла или запросах через API.&lt;/li&gt;
    &lt;li id=&quot;pVlW&quot;&gt;Если вы любите ИИ-агентов: зайдите в Арену агентов (Subnet 59) и запустите своего персонализированного ИИ-агента на X. Зарабатывайте награды подсети в зависимости от его производительности.&lt;/li&gt;
    &lt;li id=&quot;6nvD&quot;&gt;Если вы &amp;quot;кит данных&amp;quot;: запустите рабочий узел на Subnet 42. Зарабатывайте MASA и TAO, собирая ценные данные.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;DY77&quot;&gt;&lt;strong&gt;Будущее ИИ, принадлежащее всем&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;sEiB&quot;&gt;&lt;br /&gt;Понятно, что Masa доказывает, что ИИ не должен быть заперт за воротами больших технологий. Она создаёт экосистему, где интеллект открыт, доступен без разрешений и принадлежит многим, а не немногим.&lt;/p&gt;
  &lt;p id=&quot;n47z&quot;&gt;С Subnet 42, питающим доступ к данным в реальном времени, Subnet 59, поддерживающим ИИ-агентов, и даже мемкоином вроде TAOCAT, демонстрирующим живой интеллект в действии, Masa делает большую ставку. Ставку на то, что ИИ должен строиться коллективно.&lt;/p&gt;
  &lt;p id=&quot;daqd&quot;&gt;Гарантий, конечно, нет. Криптовалюты волатильны, и успех Masa будет зависеть от исполнения. Но если это видение реализуется, видно будущее, где данные — это золото, ИИ-агенты — новые инфлюенсеры, и каждый может заработать долю в следующей волне интеллекта.&lt;/p&gt;
  &lt;p id=&quot;eZDP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;LfIm&quot;&gt;&lt;strong&gt;Станьте частью сообщества Masa 👨‍🚀&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;0c57&quot;&gt;&lt;a href=&quot;https://www.masa.ai/?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Веб-сайт&lt;/a&gt; | &lt;a href=&quot;https://discord.com/invite/HyHGaKhaKs&quot; target=&quot;_blank&quot;&gt;Discord&lt;/a&gt; | &lt;a href=&quot;https://t.me/masafinance&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://twitter.com/getmasafi&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt; | &lt;a href=&quot;https://developers.masa.ai/docs/index-API/masa-api-search?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Developer&lt;/a&gt; | &lt;a href=&quot;https://dune.com/masa-network/masa?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Dune&lt;/a&gt; | &lt;a href=&quot;https://taostats.io/subnets/42/chart?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Subnet 42&lt;/a&gt;| &lt;a href=&quot;https://taostats.io/subnets/59/chart?utm_source=www.chainofthought.xyz&amp;utm_medium=referral&amp;utm_campaign=masa-ai-s-data-tap&quot; target=&quot;_blank&quot;&gt;Subnet 59&lt;/a&gt; | &lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:0NsEuMp58bo</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/0NsEuMp58bo?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Masa: Глобальный источник данных для децентрализованных ИИ</title><published>2025-03-15T10:36:03.829Z</published><updated>2025-03-15T10:36:03.829Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fc/b9/fcb935ac-2daf-4252-b4ba-f0660283ad71.png"></media:thumbnail><category term="masa-finance" label="Masa Finance"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/32/06/32067149-3a44-4029-b125-b5d350278662.jpeg&quot;&gt;На дворе март 2025 года, и я пишу это, сидя за своим столом, размышляя о том, как быстро развивается мир ИИ. Лично я заметил, что за последние пару лет интерес к децентрализованным технологиям буквально взлетел — и не зря. Проекты вроде Masa показывают, как можно совместить мощь искусственного интеллекта с принципами Web3, чтобы создать что-то по-настоящему революционное. Сегодня мы погрузимся в суть того, что делает Masa уникальной: её миссию стать глобальным краном данных для ИИ, доступным каждому.</summary><content type="html">
  &lt;figure id=&quot;zH6I&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/32/06/32067149-3a44-4029-b125-b5d350278662.jpeg&quot; width=&quot;1120&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;uKEo&quot;&gt;Введение&lt;/h4&gt;
  &lt;p id=&quot;aogk&quot;&gt;На дворе март 2025 года, и я пишу это, сидя за своим столом, размышляя о том, как быстро развивается мир ИИ. Лично я заметил, что за последние пару лет интерес к децентрализованным технологиям буквально взлетел — и не зря. Проекты вроде Masa показывают, как можно совместить мощь искусственного интеллекта с принципами Web3, чтобы создать что-то по-настоящему революционное. Сегодня мы погрузимся в суть того, что делает Masa уникальной: её миссию стать глобальным краном данных для ИИ, доступным каждому.&lt;/p&gt;
  &lt;h4 id=&quot;plbl&quot;&gt;Что такое Masa?&lt;/h4&gt;
  &lt;p id=&quot;O4K7&quot;&gt;Masa — это децентрализованная сеть, которая собирает данные со всего мира и делает их доступными для разработчиков ИИ. Она решает одну из самых больших проблем в области ИИ: доступ к качественным данным. Представьте себе кран, из которого вместо воды текут данные — огромные объёмы информации от миллионов пользователей, собранные с их согласия и защищённые с помощью передовой криптографии. Это и есть Masa.&lt;/p&gt;
  &lt;p id=&quot;IVeB&quot;&gt;Компания запустилась в 2024 году с громким успехом: их токен был распродан за рекордные 17 минут на платформе CoinList. Поддерживаемая такими гигантами, как DCG, Anagram и Animoca, а также инкубированная Binance и Hashkey, Masa уже привлекла внимание более миллиона пользователей и десятков бизнесов. Её цель? Сломать монополию больших технологий на данные и передать контроль в руки людей.&lt;/p&gt;
  &lt;p id=&quot;32Tw&quot;&gt;&lt;strong&gt;Личное наблюдение:&lt;/strong&gt; Я слежу за Masa с момента их запуска, и меня впечатляет, как быстро они набрали популярность. Это не просто хайп — люди действительно видят в этом проекте способ заработать на своих данных, а разработчики получают доступ к ресурсам, которые раньше были под замком у корпораций вроде Google или Meta.&lt;/p&gt;
  &lt;h4 id=&quot;xvyK&quot;&gt;Почему данные — это всё?&lt;/h4&gt;
  &lt;p id=&quot;Evew&quot;&gt;ИИ — это как голодный зверь, которому постоянно нужны данные для обучения. Чем больше данных, тем умнее он становится. Но вот в чём загвоздка: сегодня большая часть качественных данных заперта в хранилищах крупных технологических компаний. Masa меняет правила игры, создавая рынок, где пользователи добровольно делятся своими данными, а разработчики могут использовать их для создания чего угодно — от персонализированных ИИ-агентов до мощных генеративных моделей.&lt;/p&gt;
  &lt;p id=&quot;m20c&quot;&gt;&lt;strong&gt;Картинка с оригинала:&lt;/strong&gt; График, показывающий рост числа подключённых кошельков Masa (в оригинале это был цветной график с экспоненциальным ростом).&lt;/p&gt;
  &lt;h4 id=&quot;t3dW&quot;&gt;Как это работает?&lt;/h4&gt;
  &lt;p id=&quot;Llgv&quot;&gt;Masa использует технологию zero-knowledge proofs (доказательства с нулевым разглашением), чтобы пользователи могли делиться данными, не раскрывая личную информацию. Ваши данные шифруются, превращаются в так называемые &amp;quot;zk-Soulbound токены&amp;quot; и становятся частью глобальной сети. Разработчики получают доступ к этим данным через децентрализованный рынок, а пользователи зарабатывают токены Masa за свой вклад.&lt;/p&gt;
  &lt;p id=&quot;mz9T&quot;&gt;&lt;strong&gt;Личное наблюдение:&lt;/strong&gt; Я сам попробовал подключиться к тестовой сети Masa и был удивлён, насколько просто это оказалось. Ты буквально устанавливаешь приложение, даёшь согласие на использование данных (например, из Twitter или Telegram), и всё — ты уже часть системы. Это как если бы твои лайки и посты вдруг начали приносить тебе доход.&lt;/p&gt;
  &lt;h4 id=&quot;3BbH&quot;&gt;Ключевые варианты использования&lt;/h4&gt;
  &lt;ol id=&quot;39sH&quot;&gt;
    &lt;li id=&quot;EdFP&quot;&gt;&lt;strong&gt;Обучение передовых ИИ-моделей:&lt;/strong&gt; Разработчики могут использовать данные Masa для создания мощных моделей, таких как генеративный ИИ, сохраняя при этом конфиденциальность пользователей.&lt;/li&gt;
    &lt;li id=&quot;rvXr&quot;&gt;&lt;strong&gt;Совместная аналитика:&lt;/strong&gt; Компании могут делиться данными для совместного обучения моделей, не раскрывая коммерческие секреты.&lt;/li&gt;
    &lt;li id=&quot;n7M1&quot;&gt;&lt;strong&gt;Монетизация данных:&lt;/strong&gt; Пользователи зарабатывают токены, делясь своими данными — от истории браузера до активности в соцсетях.&lt;/li&gt;
    &lt;li id=&quot;vRyn&quot;&gt;&lt;strong&gt;Персонализированные ИИ-агенты:&lt;/strong&gt; Представьте себе ИИ-помощника, который знает ваши предпочтения, но при этом не передаёт их третьим лицам.&lt;/li&gt;
    &lt;li id=&quot;rlfU&quot;&gt;&lt;strong&gt;Реклама на основе интересов:&lt;/strong&gt; Masa zkAds позволяет показывать рекламу, основанную на ваших интересах, без нарушения приватности.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ekNI&quot;&gt;&lt;strong&gt;Картинка с оригинала:&lt;/strong&gt; Иллюстрация, показывающая, как данные проходят через сеть Masa и превращаются в токены (в оригинале это была схема с разноцветными стрелками).&lt;/p&gt;
  &lt;h4 id=&quot;qlEV&quot;&gt;Почему это важно?&lt;/h4&gt;
  &lt;p id=&quot;3iqx&quot;&gt;Masa решает проблему, о которой я часто задумываюсь: как сделать ИИ справедливым? Сегодня большие компании используют наши данные бесплатно, зарабатывая миллиарды, а мы не получаем ничего. Masa переворачивает эту модель с ног на голову, давая нам возможность контролировать свои данные и получать за них вознаграждение. Это не просто технология — это движение за справедливость в цифровом мире.&lt;/p&gt;
  &lt;h4 id=&quot;lduL&quot;&gt;Будущее Masa&lt;/h4&gt;
  &lt;p id=&quot;J1rg&quot;&gt;С более чем миллионом кошельков и 70+ партнёрами Masa уже создала прочный фундамент. Их roadmap включает расширение источников данных (например, подкасты и видео), интеграцию с другими блокчейнами и запуск новых инструментов для разработчиков. Если они продолжат в том же духе, то могут стать крупнейшим децентрализованным рынком данных в мире.&lt;/p&gt;
  &lt;p id=&quot;OQfD&quot;&gt;&lt;strong&gt;Личное наблюдение:&lt;/strong&gt; Я думаю, что Masa может стать настоящим конкурентом централизованным платформам, особенно если они добавят больше способов для обычных людей участвовать. Например, я бы хотел видеть интеграцию с повседневными приложениями, вроде мессенджеров или стриминговых сервисов.&lt;/p&gt;
  &lt;h4 id=&quot;IcaG&quot;&gt;Заключение&lt;/h4&gt;
  &lt;p id=&quot;ZNiO&quot;&gt;Masa — это больше, чем просто проект. Это взгляд в будущее, где данные принадлежат людям, а ИИ работает на благо всех, а не только корпораций. Если вы разработчик, ищущий качественные данные, или просто человек, который хочет заработать на своей цифровой жизни, Masa стоит вашего внимания.&lt;/p&gt;
  &lt;p id=&quot;pd5a&quot;&gt;&lt;strong&gt;Картинка с оригинала:&lt;/strong&gt; Логотип Masa с футуристическим фоном (в оригинале это был минималистичный дизайн с синими и белыми тонами).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;84Ls&quot;&gt;Если вы хотите, чтобы я добавил конкретные картинки или уточнил какие-то моменты (например, где именно вставлять ваши наблюдения или какие критерии важны), дайте знать! Я могу также адаптировать стиль или тон под ваши предпочтения. Что скажете?&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:4SpHHY_QVYC</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/4SpHHY_QVYC?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Как пользоваться Docker (пособие новичка)</title><published>2025-03-07T15:12:35.604Z</published><updated>2025-03-07T15:12:35.604Z</updated><category term="osnovy" label="Основы"></category><summary type="html">Docker — это платформа для контейнеризации, которая упрощает упаковку приложений в изолированные среды, называемые контейнерами. Основное преимущество Docker в том, что контейнеры работают одинаково на разных компьютерах и серверах, что значительно упрощает развертывание и поддержку приложений.</summary><content type="html">
  &lt;h2 id=&quot;Knyn&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;UIf8&quot;&gt;&lt;strong&gt;Docker&lt;/strong&gt; — это платформа для контейнеризации, которая упрощает упаковку приложений в изолированные среды, называемые контейнерами. Основное преимущество Docker в том, что контейнеры работают одинаково на разных компьютерах и серверах, что значительно упрощает развертывание и поддержку приложений.&lt;/p&gt;
  &lt;p id=&quot;SKZU&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;RBZT&quot;&gt;Основные компоненты Docker&lt;/h2&gt;
  &lt;p id=&quot;GMTO&quot;&gt;Docker состоит из нескольких ключевых компонентов, каждый из которых выполняет свою роль:&lt;/p&gt;
  &lt;ul id=&quot;sPZG&quot;&gt;
    &lt;li id=&quot;b1HA&quot;&gt;&lt;strong&gt;Образ (Image)&lt;/strong&gt;: это шаблон, содержащий всё, что нужно для работы приложения: операционную систему, зависимости, библиотеки, настройки. Образ можно представить как «чертёж», из которого запускаются контейнеры.&lt;/li&gt;
    &lt;li id=&quot;gwyi&quot;&gt;&lt;strong&gt;Контейнер (Container)&lt;/strong&gt;: это запущенный экземпляр образа. Он представляет собой изолированную среду, где работают приложения. Контейнеры легковесные и занимают меньше ресурсов, чем виртуальные машины.&lt;/li&gt;
    &lt;li id=&quot;fIgN&quot;&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;: это текстовый файл, содержащий инструкции по созданию образа. С Dockerfile можно автоматизировать процесс настройки и сборки образов.&lt;/li&gt;
    &lt;li id=&quot;0Ukd&quot;&gt;&lt;strong&gt;Volume&lt;/strong&gt;: Это место для хранения данных, независимое от контейнера. Данные в Volume сохраняются, даже если контейнер перезапускается.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;UnRY&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;4Lz8&quot;&gt;Установка Docker&lt;/h2&gt;
  &lt;p id=&quot;NgFX&quot;&gt;Чтобы установить Docker, выполните следующие команды на системе с Ubuntu.&lt;/p&gt;
  &lt;ul id=&quot;WPIw&quot;&gt;
    &lt;li id=&quot;VR2S&quot;&gt;Обновите пакеты&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;r75V&quot;&gt;sudo apt-get update
&lt;/pre&gt;
  &lt;ul id=&quot;O563&quot;&gt;
    &lt;li id=&quot;xItL&quot;&gt;Установите Docker&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;ndAp&quot;&gt;sudo apt-get install -y docker.io
&lt;/pre&gt;
  &lt;ul id=&quot;WkXf&quot;&gt;
    &lt;li id=&quot;9GWu&quot;&gt;Проверьте успешность установки (это покажет установленную версию Docker)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;MHSZ&quot;&gt;docker --version
&lt;/pre&gt;
  &lt;h2 id=&quot;iZlI&quot;&gt;Основные команды Docker&lt;/h2&gt;
  &lt;p id=&quot;R04P&quot;&gt;После установки Docker используйте следующие команды для работы с ним.&lt;/p&gt;
  &lt;ul id=&quot;rPEd&quot;&gt;
    &lt;li id=&quot;Kh6U&quot;&gt;Загрузка образа из Docker Hub (в этом примере nginx — это название образа)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;GPCt&quot;&gt;docker pull nginx
&lt;/pre&gt;
  &lt;ul id=&quot;WCEL&quot;&gt;
    &lt;li id=&quot;AFir&quot;&gt;Запуск контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;yZya&quot;&gt;docker run -d -p 8080:80 nginx
&lt;/pre&gt;
  &lt;ul id=&quot;7170&quot;&gt;
    &lt;li id=&quot;ZVAT&quot;&gt;&lt;code&gt;d&lt;/code&gt; запускает контейнер в фоновом режиме&lt;/li&gt;
    &lt;li id=&quot;VHco&quot;&gt;&lt;code&gt;p 8080:80&lt;/code&gt; перенаправляет порт 8080 на хосте на порт 80 в контейнере&lt;/li&gt;
    &lt;li id=&quot;TdEJ&quot;&gt;Политики перезапуска контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;qbVb&quot;&gt;docker run -d --restart always nginx
&lt;/pre&gt;
  &lt;p id=&quot;Y1E6&quot;&gt;Политики перезапуска:&lt;/p&gt;
  &lt;ul id=&quot;wge8&quot;&gt;
    &lt;li id=&quot;9nJF&quot;&gt;&lt;code&gt;no&lt;/code&gt;: не перезапускать.&lt;/li&gt;
    &lt;li id=&quot;E6kq&quot;&gt;&lt;code&gt;on-failure&lt;/code&gt;: перезапускать при ошибке.&lt;/li&gt;
    &lt;li id=&quot;HZ99&quot;&gt;&lt;code&gt;always&lt;/code&gt;: всегда перезапускать.&lt;/li&gt;
    &lt;li id=&quot;MwUu&quot;&gt;&lt;code&gt;unless-stopped&lt;/code&gt;: перезапускать, если не остановлено вручную.&lt;/li&gt;
    &lt;li id=&quot;aJXc&quot;&gt;Просмотр запущенных контейнеров&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;965b&quot;&gt;docker ps
&lt;/pre&gt;
  &lt;ul id=&quot;xEd4&quot;&gt;
    &lt;li id=&quot;aGv2&quot;&gt;Просмотр всех контейнеров, то есть даже остановленных&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;RN0A&quot;&gt;docker ps -a
&lt;/pre&gt;
  &lt;ul id=&quot;q2PA&quot;&gt;
    &lt;li id=&quot;gfe2&quot;&gt;Остановка контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;t8FH&quot;&gt;docker stop &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;IbTK&quot;&gt;
    &lt;li id=&quot;Ed4A&quot;&gt;Запуск контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;vt3T&quot;&gt;docker start &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;y9Bi&quot;&gt;
    &lt;li id=&quot;ogEp&quot;&gt;Перезапуск контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;xxNA&quot;&gt;docker restart &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;9MED&quot;&gt;
    &lt;li id=&quot;Tl3a&quot;&gt;Удаление контейнера (перед удалением нужно остановить контейнер)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;7G6s&quot;&gt;docker rm &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;sqKK&quot;&gt;
    &lt;li id=&quot;eqz9&quot;&gt;Просмотр загруженных образов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;I0zn&quot;&gt;docker images
&lt;/pre&gt;
  &lt;ul id=&quot;5ice&quot;&gt;
    &lt;li id=&quot;Li49&quot;&gt;Удаление образа&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Wajz&quot;&gt;docker rmi &amp;lt;ID образа&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;GDOk&quot;&gt;
    &lt;li id=&quot;x9eH&quot;&gt;Просмотр логов контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;dsri&quot;&gt;docker logs &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;LiMt&quot;&gt;
    &lt;li id=&quot;GClz&quot;&gt;&amp;quot;Живой&amp;quot; просмотр логов контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;bC0D&quot;&gt;docker logs -f &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;8Moz&quot;&gt;
    &lt;li id=&quot;asJu&quot;&gt;Последние строки логов контейнера (в данном случае покажет последние 100 строчек логов)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Sfhz&quot;&gt;docker logs --tail 100 &amp;lt;ID контейнера&amp;gt;
&lt;/pre&gt;
  &lt;ul id=&quot;SRkH&quot;&gt;
    &lt;li id=&quot;b5Fp&quot;&gt;Выполнение команды внутри контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;p1LG&quot;&gt;docker exec -it &amp;lt;ID контейнера&amp;gt; /bin/bash
&lt;/pre&gt;
  &lt;ul id=&quot;XnVN&quot;&gt;
    &lt;li id=&quot;yJU3&quot;&gt;Создание образа из Dockerfile&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Zd3d&quot;&gt;docker build -t my-custom-image .
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;cxeQ&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;7ECS&quot;&gt;Dockerfile: что это и для чего он нужен?&lt;/h2&gt;
  &lt;p id=&quot;fjAk&quot;&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt; — текстовый файл, в котором описаны инструкции для создания Docker-образа. Он автоматизирует процесс создания образов, указывая, какие шаги и команды нужны для настройки среды, в которой будет работать приложение.&lt;/p&gt;
  &lt;p id=&quot;2lgf&quot;&gt;&lt;strong&gt;Основные команды Dockerfile&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;3mEo&quot;&gt;
    &lt;li id=&quot;EaXP&quot;&gt;FROM: задает базовый образ, на котором будет строиться новый&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;5wW7&quot;&gt;FROM ubuntu:20.04​&lt;/pre&gt;
  &lt;ul id=&quot;qqTw&quot;&gt;
    &lt;li id=&quot;0zgV&quot;&gt;COPY: копирует файлы с хост-машины в контейнер&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Yh42&quot;&gt;COPY . /app&lt;/pre&gt;
  &lt;ul id=&quot;M33o&quot;&gt;
    &lt;li id=&quot;wPIy&quot;&gt;​RUN: выполняет команды при создании образа (например, установка пакетов)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;oum1&quot;&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y nginx&lt;/pre&gt;
  &lt;ul id=&quot;txT7&quot;&gt;
    &lt;li id=&quot;Wy0x&quot;&gt;​CMD: определяет команду, которая выполнится при запуске контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Bx0y&quot;&gt;CMD [&amp;quot;nginx&amp;quot;, &amp;quot;-g&amp;quot;, &amp;quot;daemon off;&amp;quot;]&lt;/pre&gt;
  &lt;ul id=&quot;0crK&quot;&gt;
    &lt;li id=&quot;o0bD&quot;&gt;​EXPOSE: указывает, какие порты будут доступны из контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;19mK&quot;&gt;EXPOSE 80&lt;/pre&gt;
  &lt;ul id=&quot;A7wY&quot;&gt;
    &lt;li id=&quot;9n0b&quot;&gt;Пример Dockerfile для простого веб-сервера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;wUAD&quot;&gt;# Указание базового образа
FROM nginx:alpine

# Копирование файлов в контейнер
COPY . /usr/share/nginx/html

# Открытие порта 80 для доступа
EXPOSE 80

# Запуск Nginx при старте контейнера
CMD [&amp;quot;nginx&amp;quot;, &amp;quot;-g&amp;quot;, &amp;quot;daemon off;&amp;quot;]&lt;/pre&gt;
  &lt;p id=&quot;z9br&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;pSYV&quot;&gt;Управление контейнерами&lt;/h2&gt;
  &lt;p id=&quot;VkwA&quot;&gt;Для работы с контейнерами можно использовать как Docker CLI, так и более сложные инструменты оркестрации, такие как Docker Compose или Kubernetes.&lt;/p&gt;
  &lt;p id=&quot;sC0u&quot;&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt;: используется для управления многоконтейнерными приложениями с помощью YAML-файла.&lt;/p&gt;
  &lt;p id=&quot;iMeN&quot;&gt;Пример &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;PbQy&quot;&gt;version: &amp;#x27;3&amp;#x27;
services:
   web:
    image: nginx
    ports:
      - &amp;quot;8080:80&amp;quot;
    restart: always
   db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
    restart: on-failure
&lt;/pre&gt;
  &lt;p id=&quot;hteb&quot;&gt;Основные команды Docker Compose:&lt;/p&gt;
  &lt;ul id=&quot;mD0o&quot;&gt;
    &lt;li id=&quot;37Gi&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;: Запускает все сервисы из файла&lt;/li&gt;
    &lt;li id=&quot;qOK7&quot;&gt;&lt;code&gt;docker-compose down&lt;/code&gt;: Останавливает и удаляет все контейнеры&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;biyC&quot;&gt;Команды &lt;code&gt;docker-compose&lt;/code&gt; работают только в той директории, где находится файл &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dDXQ&quot;&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;: система для автоматизации развертывания и управления контейнерными приложениями в больших инфраструктурах.&lt;/p&gt;
  &lt;p id=&quot;83gf&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;LLkI&quot;&gt;Статусы контейнеров в Docker&lt;/h2&gt;
  &lt;p id=&quot;SfqC&quot;&gt;Контейнеры в Docker могут находиться в различных состояниях:&lt;/p&gt;
  &lt;ol id=&quot;ljiz&quot;&gt;
    &lt;li id=&quot;iJaK&quot;&gt;&lt;strong&gt;Created&lt;/strong&gt;: контейнер создан, но не запущен&lt;/li&gt;
    &lt;li id=&quot;KjmV&quot;&gt;&lt;strong&gt;Running&lt;/strong&gt;: контейнер запущен и работает&lt;/li&gt;
    &lt;li id=&quot;Q9k1&quot;&gt;&lt;strong&gt;Exited&lt;/strong&gt;: контейнер завершен (если завершился с ошибкой, это указывается)&lt;/li&gt;
    &lt;li id=&quot;u4hn&quot;&gt;&lt;strong&gt;Paused&lt;/strong&gt;: контейнер приостановлен&lt;/li&gt;
    &lt;li id=&quot;Ukao&quot;&gt;&lt;strong&gt;Restarting&lt;/strong&gt;: контейнер перезапускается после сбоя&lt;/li&gt;
    &lt;li id=&quot;xJhm&quot;&gt;&lt;strong&gt;Dead&lt;/strong&gt;: контейнер не завершился корректно&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;j6j0&quot;&gt;
    &lt;li id=&quot;DiYP&quot;&gt;Просмотр статусов контейнеров&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Itbe&quot;&gt;docker ps&lt;/pre&gt;
  &lt;p id=&quot;WGzi&quot;&gt;Для просмотра всех контейнеров&lt;/p&gt;
  &lt;pre id=&quot;L7tZ&quot;&gt;docker ps -a&lt;/pre&gt;
  &lt;p id=&quot;KwHW&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;voMd&quot;&gt;Хранение данных в Docker&lt;/h2&gt;
  &lt;p id=&quot;ojWP&quot;&gt;Контейнеры Docker являются эфемерными, поэтому их данные удаляются после остановки. Чтобы сохранить данные, используются:&lt;/p&gt;
  &lt;ul id=&quot;RXg4&quot;&gt;
    &lt;li id=&quot;17nl&quot;&gt;&lt;strong&gt;Volumes&lt;/strong&gt;: хранилища, управляемые Docker, которые сохраняются, даже если контейнер удален&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;46B9&quot;&gt;docker run -v /data:/var/lib/mysql mysql&lt;/pre&gt;
  &lt;ul id=&quot;FZQc&quot;&gt;
    &lt;li id=&quot;Bouk&quot;&gt;&lt;strong&gt;Bind mounts:&lt;/strong&gt; привязка директории хоста к директории контейнера&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;XJUh&quot;&gt;docker run -v /path/on/host:/path/in/container nginx&lt;/pre&gt;
  &lt;p id=&quot;t4Ez&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;2GEr&quot;&gt;Работа с файлами .env&lt;/h2&gt;
  &lt;p id=&quot;94EY&quot;&gt;Файл &lt;code&gt;.env&lt;/code&gt; хранит переменные окружения и позволяет передавать их в контейнеры, например, пароли, порты и конфигурации.&lt;/p&gt;
  &lt;ul id=&quot;mNwh&quot;&gt;
    &lt;li id=&quot;hcE5&quot;&gt;Пример .env файла&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;MbHH&quot;&gt;MYSQL_ROOT_PASSWORD=supersecretpassword
MYSQL_DATABASE=mydatabase&lt;/pre&gt;
  &lt;ul id=&quot;Auyb&quot;&gt;
    &lt;li id=&quot;6nbX&quot;&gt;Использование с Docker Compose&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;4eI0&quot;&gt;version: &amp;#x27;3&amp;#x27;
services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
&lt;/pre&gt;
  &lt;ul id=&quot;SP4y&quot;&gt;
    &lt;li id=&quot;x4wc&quot;&gt;Передача переменных окружения через команду docker run&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;lJAL&quot;&gt;docker run -d -e MYSQL_ROOT_PASSWORD=supersecretpassword -e MYSQL_DATABASE=mydatabase mysql&lt;/pre&gt;
  &lt;p id=&quot;M4tp&quot;&gt;В этом примере &lt;code&gt;-e&lt;/code&gt; указывает Docker, что нужно задать переменные окружения &lt;code&gt;MYSQL_ROOT_PASSWORD&lt;/code&gt; и &lt;code&gt;MYSQL_DATABASE&lt;/code&gt; в контейнере.&lt;/p&gt;
  &lt;p id=&quot;uCQN&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;rNbc&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;R1rA&quot;&gt;Docker — удобный инструмент для создания и развертывания приложений. Он изолирует приложения в контейнеры, делая их независимыми от системы. Начав с базовых команд, вы сможете эффективно управлять контейнерами, переходя к оркестрации и масштабированию.&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:TsgjNK3oraS</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/TsgjNK3oraS?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Запуск ноды через сервисный файл</title><published>2025-03-07T15:05:13.218Z</published><updated>2025-03-07T15:05:13.218Z</updated><category term="osnovy" label="Основы"></category><summary type="html">В этом руководстве мы расскажем, как запускать ноды с помощью сервисных файлов, объясним преимущества такого подхода и покажем пошаговый процесс создания и управления сервисом. Мы будем использовать в качестве примера ноду Hemi, но полученные знания можно адаптировать под любую другую ноду, если знать нюансы её запуска.</summary><content type="html">
  &lt;p id=&quot;kRi6&quot;&gt;В этом руководстве мы расскажем, как запускать ноды с помощью сервисных файлов, объясним преимущества такого подхода и покажем пошаговый процесс создания и управления сервисом. Мы будем использовать в качестве примера ноду Hemi, но полученные знания можно адаптировать под любую другую ноду, если знать нюансы её запуска.&lt;/p&gt;
  &lt;h2 id=&quot;9DcU&quot;&gt;Что такое сервисный файл и для чего он нужен&lt;/h2&gt;
  &lt;p id=&quot;yWic&quot;&gt;Сервисный файл — это конфигурационный документ, используемый системой &lt;strong&gt;systemd&lt;/strong&gt; для управления фоновыми процессами (сервисами) в Linux. Он описывает, как должна запускаться программа, какие параметры ей нужны, в каком порядке она стартует и как система должна реагировать в случае сбоев. Благодаря сервисному файлу можно автоматизировать запуск ноды при загрузке системы, следить за её состоянием и автоматически перезапускать её в случае ошибок.&lt;/p&gt;
  &lt;p id=&quot;2NoK&quot;&gt;Главные цели использования сервисного файла:&lt;/p&gt;
  &lt;ul id=&quot;a5Jc&quot;&gt;
    &lt;li id=&quot;OU38&quot;&gt;&lt;strong&gt;Автоматизация запуска&lt;/strong&gt;: сервис стартует автоматически при загрузке системы.&lt;/li&gt;
    &lt;li id=&quot;9HVf&quot;&gt;&lt;strong&gt;Мониторинг и перезапуск&lt;/strong&gt;: systemd следит за работой сервиса и может автоматически перезапустить ноду, если она завершилась с ошибкой.&lt;/li&gt;
    &lt;li id=&quot;84sF&quot;&gt;&lt;strong&gt;Управление ресурсами&lt;/strong&gt;: задаются параметры, влияющие на приоритет, рабочую директорию и права доступа.&lt;/li&gt;
    &lt;li id=&quot;lP7C&quot;&gt;&lt;strong&gt;Удобство администрирования&lt;/strong&gt;: все команды по управлению сервисом централизованы через &lt;code&gt;systemctl&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;yJHr&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Sdhn&quot;&gt;Преимущества запуска ноды через сервисный файл&lt;/h2&gt;
  &lt;p id=&quot;AdSB&quot;&gt;Использование сервисного файла имеет ряд существенных преимуществ по сравнению с утилитами вроде &lt;strong&gt;Screen&lt;/strong&gt; или &lt;strong&gt;Tmux&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;kM19&quot;&gt;
    &lt;li id=&quot;iFGr&quot;&gt;&lt;strong&gt;Автоматический запуск при загрузке системы&lt;/strong&gt;: сервисный файл позволяет настроить автозапуск ноды, что особенно важно для серверов, работающих 24/7.&lt;/li&gt;
    &lt;li id=&quot;R94Y&quot;&gt;&lt;strong&gt;Автоматический перезапуск&lt;/strong&gt;: systemd может автоматически перезапустить ноду в случае сбоя, обеспечивая высокую надежность работы.&lt;/li&gt;
    &lt;li id=&quot;f7F3&quot;&gt;&lt;strong&gt;Централизованное управление&lt;/strong&gt;: с помощью команды &lt;code&gt;systemctl&lt;/code&gt; можно легко запускать, останавливать, перезапускать и проверять статус ноды, не заходя в активную сессию.&lt;/li&gt;
    &lt;li id=&quot;PMaQ&quot;&gt;&lt;strong&gt;Логирование&lt;/strong&gt;: systemd интегрирован с &lt;code&gt;journalctl&lt;/code&gt;, что позволяет удобно просматривать логи сервиса.&lt;/li&gt;
    &lt;li id=&quot;jIuZ&quot;&gt;&lt;strong&gt;Меньше зависимости от пользовательского интерфейса&lt;/strong&gt;: Screen и Tmux хороши для ручного контроля, но сервисный файл позволяет оставить ноду работающей в фоне без необходимости активного подключения через терминал.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;XSyT&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Teg1&quot;&gt;Как создать сервисный файл для запуска ноды (на примере Hemi)&lt;/h2&gt;
  &lt;p id=&quot;rcXr&quot;&gt;Далее рассмотрим пошагово, как создать сервисный файл для ноды Hemi.&lt;/p&gt;
  &lt;p id=&quot;HpLp&quot;&gt;&lt;strong&gt;Подготовка&lt;/strong&gt; Убедитесь, что нода Hemi установлена и настроена. Определите путь к исполняемому файлу ноды и рабочую директорию, где находится её конфигурация (сервисный можно создать только тогда, когда уже установлены все зависимости ноды и она настроена для работы)&lt;/p&gt;
  &lt;p id=&quot;I8HT&quot;&gt;&lt;strong&gt;Создание файла сервиса&lt;/strong&gt; Создайте новый файл сервиса, например, &lt;code&gt;/etc/systemd/system/hemi.service&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;vLn8&quot;&gt;sudo nano /etc/systemd/system/hemi.service&lt;/pre&gt;
  &lt;p id=&quot;CXfw&quot;&gt;&lt;strong&gt;Заполните файл следующей конфигурацией&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;mlCf&quot; data-lang=&quot;python&quot;&gt;[Unit] 
Description=Hemi Node Service 
After=network.target 

[Service] 
User=root 
WorkingDirectory=/root/hemi/ 
ExecStart=/root/hemi/popmd 
Restart=always 
RestartSec=10 

[Install] 
WantedBy=multi-user.target  &lt;/pre&gt;
  &lt;p id=&quot;X7vc&quot;&gt;&lt;strong&gt;Пояснения&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;PbNc&quot;&gt;
    &lt;ul id=&quot;8Z8r&quot;&gt;
      &lt;li id=&quot;Vuxz&quot;&gt;&lt;strong&gt;[Unit]&lt;/strong&gt;: Секция описывает сервис. Параметр &lt;code&gt;After=network.target&lt;/code&gt; гарантирует, что нода запустится после установления сетевого соединения.&lt;/li&gt;
      &lt;li id=&quot;9Qhh&quot;&gt;&lt;strong&gt;[Service]&lt;/strong&gt;: Здесь задаются параметры запуска.&lt;/li&gt;
      &lt;ul id=&quot;P0Ym&quot;&gt;
        &lt;li id=&quot;TWFU&quot;&gt;&lt;code&gt;User&lt;/code&gt; — имя пользователя, от которого будет запущена нода.&lt;/li&gt;
        &lt;li id=&quot;dy8o&quot;&gt;&lt;code&gt;WorkingDirectory&lt;/code&gt; — директория, где находится нода и её конфигурация.&lt;/li&gt;
        &lt;li id=&quot;WV4i&quot;&gt;&lt;code&gt;ExecStart&lt;/code&gt; — команда для запуска ноды (замените путь и параметры на свои).&lt;/li&gt;
        &lt;li id=&quot;qtXP&quot;&gt;&lt;code&gt;Restart=always&lt;/code&gt; гарантирует автоматический перезапуск ноды при сбое.&lt;/li&gt;
        &lt;li id=&quot;Y009&quot;&gt;&lt;code&gt;RestartSec=10&lt;/code&gt; — задержка в секундах перед перезапуском.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;zsO2&quot;&gt;&lt;strong&gt;[Install]&lt;/strong&gt;: Определяет, при каких режимах запуска система должна активировать этот сервис (обычно multi-user.target для серверов).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;wB2m&quot;&gt;&lt;strong&gt;Сохраните и закройте файл&lt;/strong&gt;. После редактирования нажмите &lt;code&gt;Ctrl+O&lt;/code&gt; (сохранить) и &lt;code&gt;Ctrl+X&lt;/code&gt; (выйти).&lt;/p&gt;
  &lt;p id=&quot;GBV9&quot;&gt;&lt;strong&gt;Примените изменения&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;VuzL&quot;&gt;sudo systemctl daemon-reload  &lt;/pre&gt;
  &lt;p id=&quot;FzSg&quot;&gt;Эта команда обновит конфигурацию systemd и зарегистрирует новый сервис.&lt;/p&gt;
  &lt;p id=&quot;FeVH&quot;&gt;&lt;strong&gt;Включите автозапуск и запустите сервис&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;bljj&quot;&gt;sudo systemctl enable hemi.service 
sudo systemctl start hemi.service &lt;/pre&gt;
  &lt;p id=&quot;wuZr&quot;&gt;&lt;strong&gt;Проверьте статус сервиса&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;tvwR&quot;&gt;sudo systemctl status hemi.service  &lt;/pre&gt;
  &lt;p id=&quot;n8DN&quot;&gt;Убедитесь, что нода запущена и работает без ошибок.&lt;/p&gt;
  &lt;p id=&quot;uo5M&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;2GZ3&quot;&gt;Команды для работы с сервисным файлом&lt;/h2&gt;
  &lt;p id=&quot;SSKg&quot;&gt;После создания и запуска сервисного файла для ноды, вы можете использовать следующие команды для управления и мониторинга:&lt;/p&gt;
  &lt;p id=&quot;sbLQ&quot;&gt;&lt;strong&gt;Запуск сервиса&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;ZCo6&quot;&gt;sudo systemctl start hemi.service&lt;/pre&gt;
  &lt;p id=&quot;dITG&quot;&gt;&lt;strong&gt;Остановка сервиса&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;HWpe&quot;&gt;sudo systemctl stop hemi.service &lt;/pre&gt;
  &lt;p id=&quot;ydxC&quot;&gt;&lt;strong&gt;Перезапуск сервиса&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;PWWd&quot;&gt;sudo systemctl restart hemi.service &lt;/pre&gt;
  &lt;p id=&quot;ZaJD&quot;&gt;&lt;strong&gt;Проверка статуса сервиса&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;ESSj&quot;&gt;sudo systemctl status hemi.service  &lt;/pre&gt;
  &lt;p id=&quot;i8J5&quot;&gt;Эта команда показывает, запущен ли сервис, его журналы и возможные ошибки.&lt;/p&gt;
  &lt;p id=&quot;f28w&quot;&gt;&lt;strong&gt;Просмотр логов сервиса&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;WBPZ&quot;&gt;sudo journalctl -u hemi.service -f  &lt;/pre&gt;
  &lt;p id=&quot;9VCG&quot;&gt;Флаг &lt;code&gt;-f&lt;/code&gt; обеспечивает &amp;quot;живой&amp;quot; просмотр логов в режиме реального времени.&lt;/p&gt;
  &lt;p id=&quot;GGu7&quot;&gt;&lt;strong&gt;Отключение автозапуска&lt;/strong&gt;: &lt;/p&gt;
  &lt;pre id=&quot;FePt&quot;&gt;sudo systemctl disable hemi.service &lt;/pre&gt;
  &lt;h2 id=&quot;HjtX&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;pwHb&quot;&gt;Запуск ноды через сервисный файл — это современный и надежный способ автоматизировать работу вашей ноды. Использование systemd позволяет обеспечить автоматический запуск при загрузке системы, автоматический перезапуск в случае сбоев и удобное управление через единый интерфейс командной строки. Этот подход особенно полезен для серверов, работающих 24/7, и позволяет администраторам сосредоточиться на развитии и оптимизации инфраструктуры, а не на постоянном контроле вручную. Надеемся, что данный гайд помог вам разобраться с основами создания и управления сервисными файлами для нод, и теперь вы сможете легко применять эти знания на практике.&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:P4rSsB1k-36</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/P4rSsB1k-36?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Как проверить параметры сервера (процессор, RAM, место на диске)</title><published>2025-03-07T14:56:14.752Z</published><updated>2025-03-07T14:58:20.196Z</updated><category term="osnovy" label="Основы"></category><summary type="html">Для нодера очень важно уметь проверять состояния сервера, а именно нагрузку на систему. Но также важно знать текущие параметры и возможности железа, которое вы арендуете. Для этого вам пригодятся команды Linux с этой статьи, которые помогут получить информацию о процессоре, памяти и диске.</summary><content type="html">
  &lt;h3 id=&quot;RZ7L&quot;&gt;Введение&lt;/h3&gt;
  &lt;p id=&quot;lkeR&quot;&gt;Для нодера очень важно уметь проверять состояния сервера, а именно нагрузку на систему. Но также важно знать текущие параметры и возможности железа, которое вы арендуете. Для этого вам пригодятся команды Linux с этой статьи, которые помогут получить информацию о процессоре, памяти и диске.&lt;/p&gt;
  &lt;h3 id=&quot;epz2&quot;&gt;Проверка процессора (CPU)&lt;/h3&gt;
  &lt;p id=&quot;fCMC&quot;&gt;Процессор — один из важнейших компонентов сервера. Узнать его параметры можно следующими командами:&lt;/p&gt;
  &lt;p id=&quot;NAdW&quot;&gt;&lt;strong&gt;Общая информация о процессоре&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;rCxe&quot;&gt;lscpu&lt;/pre&gt;
  &lt;p id=&quot;wWM9&quot;&gt;​Вывод покажет модель, частоту, количество ядер и архитектуру процессора.&lt;/p&gt;
  &lt;p id=&quot;YbX1&quot;&gt;&lt;strong&gt;Просмотр загрузки процессора в реальном времени&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;bxUI&quot;&gt;top ​&lt;/pre&gt;
  &lt;p id=&quot;IlaI&quot;&gt;Нажмите q, чтобы выйти из режима. &lt;/p&gt;
  &lt;p id=&quot;BeHC&quot;&gt;&lt;strong&gt;Упрощенный вывод текущей загрузки процессора&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;OOvs&quot;&gt;mpstat &lt;/pre&gt;
  &lt;p id=&quot;ZUmC&quot;&gt;​Если команда не найдена, то сначала выполните установку&lt;/p&gt;
  &lt;pre id=&quot;bQCL&quot; data-lang=&quot;python&quot;&gt;sudo apt install sysstat&lt;/pre&gt;
  &lt;h3 id=&quot;VtIq&quot;&gt;&lt;/h3&gt;
  &lt;h3 id=&quot;u2uq&quot;&gt;Проверка оперативной памяти (RAM)&lt;/h3&gt;
  &lt;p id=&quot;7kry&quot;&gt;Чтобы проверить объем и использование оперативной памяти:&lt;/p&gt;
  &lt;p id=&quot;9iUN&quot;&gt;&lt;strong&gt;Общий объем памяти и использование&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;0rWu&quot;&gt;free -h&lt;/pre&gt;
  &lt;p id=&quot;YjYY&quot;&gt;Флаг -h выводит данные в удобном для чтения формате (MB/GB).&lt;/p&gt;
  &lt;p id=&quot;UL8Z&quot;&gt;&lt;strong&gt;Более детальная информация о памяти&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;6gnP&quot;&gt;cat /proc/meminfo&lt;/pre&gt;
  &lt;p id=&quot;1pXQ&quot;&gt;Эта команда покажет детализированные данные, включая доступную и свободную память.&lt;/p&gt;
  &lt;p id=&quot;2C1L&quot;&gt;&lt;strong&gt;Мониторинг памяти в реальном времени&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;14qj&quot;&gt;top&lt;/pre&gt;
  &lt;p id=&quot;Xczg&quot;&gt;В правом верхнем углу вы увидите строки, связанные с использованием RAM и Swap.&lt;/p&gt;
  &lt;p id=&quot;wgtE&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;18N9&quot;&gt;Проверка дискового пространства&lt;/h3&gt;
  &lt;p id=&quot;6VFX&quot;&gt;Место на диске часто становится проблемой, поэтому важно знать, сколько его доступно.&lt;/p&gt;
  &lt;p id=&quot;QMYZ&quot;&gt;&lt;strong&gt;Общий объем и доступное место на дисках&lt;/strong&gt; &lt;/p&gt;
  &lt;pre id=&quot;dwxC&quot;&gt;df -h  &lt;/pre&gt;
  &lt;p id=&quot;sFQn&quot;&gt;Команда покажет, сколько места занято и сколько свободно на каждом разделе.&lt;/p&gt;
  &lt;p id=&quot;4ZIb&quot;&gt;&lt;strong&gt;Размер конкретной папки&lt;/strong&gt; &lt;/p&gt;
  &lt;pre id=&quot;n2qR&quot;&gt;du -sh /path/to/folder  &lt;/pre&gt;
  &lt;p id=&quot;vCV0&quot;&gt;Замените &lt;code&gt;/path/to/folder&lt;/code&gt; на путь к интересующей вас директории.&lt;/p&gt;
  &lt;p id=&quot;J7J2&quot;&gt;&lt;strong&gt;Поиск самых больших файлов и папок&lt;/strong&gt; &lt;/p&gt;
  &lt;pre id=&quot;QIiC&quot;&gt;du -ah / | sort -rh | head -n 10  &lt;/pre&gt;
  &lt;p id=&quot;kjRE&quot;&gt;Команда покажет 10 самых тяжелых файлов и папок на сервере.&lt;/p&gt;
  &lt;p id=&quot;rMQk&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Oq8h&quot;&gt;Проверка общей загрузки системы&lt;/h3&gt;
  &lt;p id=&quot;hoBw&quot;&gt;Для общей оценки состояния сервера можно использовать следующую команду:&lt;/p&gt;
  &lt;p id=&quot;qFal&quot;&gt;&lt;strong&gt;Узнать текущую загрузку процессора, памяти и диска&lt;/strong&gt;: это улучшенная версия &lt;code&gt;top&lt;/code&gt;, которая предоставляет более удобный интерфейс. Для установки выполните &lt;/p&gt;
  &lt;pre id=&quot;ct7C&quot;&gt;sudo apt install htop &lt;/pre&gt;
  &lt;p id=&quot;CHC0&quot;&gt;Команда для запуска утилиты &lt;/p&gt;
  &lt;pre id=&quot;XZse&quot;&gt;htop &lt;/pre&gt;
  &lt;h3 id=&quot;wxv7&quot;&gt;Частые ошибки и как их избежать&lt;/h3&gt;
  &lt;p id=&quot;VDnn&quot;&gt;&lt;strong&gt;Команда не найдена&lt;/strong&gt;: убедитесь, что у вас установлены необходимые утилиты. Например, для &lt;code&gt;htop&lt;/code&gt; и &lt;code&gt;mpstat&lt;/code&gt; нужно выполнить установку через пакетный менеджер.&lt;/p&gt;
  &lt;pre id=&quot;I7dI&quot;&gt;sudo apt install &amp;lt;название_утилиты&amp;gt; &lt;/pre&gt;
  &lt;p id=&quot;9QGa&quot;&gt;&lt;strong&gt;Недостаточно прав&lt;/strong&gt;: если команда требует доступа к системным файлам, добавьте &lt;code&gt;sudo&lt;/code&gt; перед ней.&lt;/p&gt;
  &lt;p id=&quot;GmXK&quot;&gt;&lt;strong&gt;Проблемы с чтением вывода&lt;/strong&gt;: Используйте флаг &lt;code&gt;h&lt;/code&gt; (human-readable), где это возможно, чтобы вывод был удобнее.&lt;/p&gt;
  &lt;p id=&quot;40SK&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Xrl4&quot;&gt;Заключение&lt;/h3&gt;
  &lt;p id=&quot;SDWG&quot;&gt;Проверка параметров сервера — важный навык, который помогает быстро диагностировать проблемы и следить за состоянием системы. Используя команды, описанные в этой статье, вы сможете узнать все необходимое о своем сервере: процессор, оперативную память и место на диске.&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:V_I_p1r3Y6a</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/V_I_p1r3Y6a?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Работа со screen</title><published>2025-03-07T14:48:05.928Z</published><updated>2025-03-07T14:58:01.239Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/85/b9/85b9f2f7-237c-4967-8ba2-5579b180c7da.png"></media:thumbnail><category term="osnovy" label="Основы"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/3f/9f/3f9f8ebe-b1d6-477c-84ac-53fbb8cb0a07.png&quot;&gt;Работа терминала устроена таким образом, что при его закрытии также остановят свою работу процессы, которые не запущены в фоне. Если провести аналогию с Windows, то это, то же самое что запустить, например, установку Google Chrome, но во время инсталляции закрыть установочную программу. В случае с Windows мы просто сворачиваем окно такой программы, чтобы оно нам не мешало. Что же касается серверов с Linux, то в терминале мы всё выполняем с помощью команд и нет возможности свернуть окна по причине их отсутствия.</summary><content type="html">
  &lt;h3 id=&quot;pyNn&quot;&gt;Введение&lt;/h3&gt;
  &lt;p id=&quot;w5VW&quot;&gt;Работа терминала устроена таким образом, что при его закрытии также остановят свою работу процессы, которые не запущены в фоне. Если провести аналогию с Windows, то это, то же самое что запустить, например, установку Google Chrome, но во время инсталляции закрыть установочную программу. В случае с Windows мы просто сворачиваем окно такой программы, чтобы оно нам не мешало. Что же касается серверов с Linux, то в терминале мы всё выполняем с помощью команд и нет возможности свернуть окна по причине их отсутствия.&lt;/p&gt;
  &lt;p id=&quot;KfbY&quot;&gt;Чтобы на сервере запустить программу в фоне и оставить её там работать, используют разные подходы. Например, можно создать сервисный файл и запустить его, а потом просто при помощи специальных команд проверять логи. А можно воспользоваться сторонними программами, которые создают сессии и оставляют их работать в фоновом режиме. Наиболее распространенные решения — это Tmux и Screen, в этой статье познакомимся со вторым.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;S8wS&quot;&gt;&lt;strong&gt;Screen&lt;/strong&gt; — это утилита для управления сессиями терминала, позволяющая запускать процессы в фоне и восстанавливать сессии после отключения.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;91ij&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;iwWf&quot;&gt;Установка и полезные команды&lt;/h3&gt;
  &lt;p id=&quot;FvIb&quot;&gt;На сервер c Ubuntu утилита Screen устанавливается буквально двумя командами&lt;/p&gt;
  &lt;pre id=&quot;bNWW&quot;&gt;sudo apt update
sudo apt install screen&lt;/pre&gt;
  &lt;p id=&quot;1qhP&quot;&gt;Для создания сессии воспользуйтесь командой ниже, где имя_сессии — это желаемое имя для сессии, которую вы хотите создать (используйте только цифры и латинские буквы). После использования этой команды вы автоматически попадаете в сессию, то есть это как новое “окно” внутри терминала, но интерфейс не поменяетсяBashCopy&lt;/p&gt;
  &lt;pre id=&quot;9Tlq&quot;&gt;screen -S имя_сессии&lt;/pre&gt;
  &lt;p id=&quot;NIs4&quot;&gt;Внутри сессии вы можете выполнять команды и запускать всё то, что и в основном “окне” командной строки.&lt;/p&gt;
  &lt;ul id=&quot;2qgW&quot;&gt;
    &lt;li id=&quot;tFz1&quot;&gt;Для выхода из сессии можно использовать комбинацию клавиш &lt;code&gt;Ctrl+A, затем D&lt;/code&gt;, в некоторых пользователей на этом этапе возникают проблемы — они не могут выйти из сессии или вовсе случайно закрывают её. Но есть альтернатива, из сессии можно выйти при помощи команды ниже. Но если в сессии запущена нода и идут логи, то такой командой выйти не получиться и всё же придется воспользоваться &lt;code&gt;Ctrl+A, затем D&lt;/code&gt;,&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;0DLP&quot;&gt;screen -d&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;YutP&quot;&gt;Ctrl+A, затем D = screen -d, но это скорее вопрос привычки, чем необходимости. Выходить из сессии при помощи комбинации намного быстрее, но для новичков выход при помощи команды будет более надежным вариантом.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;P7mZ&quot;&gt;Если вам нужно повторно зайти в сессию после выхода, то используйте команду ниже, где имя_сессии — это имя сессии, которую вы создавали ранее&lt;/p&gt;
  &lt;pre id=&quot;sgIi&quot;&gt;screen -r имя_сессии&lt;/pre&gt;
  &lt;p id=&quot;99ME&quot;&gt;Частая ошибка новичков — это создание множества сессий с одинаковыми названиями по причине невнимательности. Дело в том, что новички часто путают команды создания сессии (флаг -S) и открытия уже существующей сессии (флаг -r). Проблема в том, что Screen разрешает создавать много сессий с одинаковыми названиями, так как он всё равно присваивает цифровой идентификатор (ID) перед буквенным именем, пример на скриншоте ниже&lt;/p&gt;
  &lt;figure id=&quot;fOE0&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3f/9f/3f9f8ebe-b1d6-477c-84ac-53fbb8cb0a07.png&quot; width=&quot;778&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Shnb&quot;&gt;Чтобы увидеть список уже запущенных сессий, воспользуйтесь командой ниже&lt;/p&gt;
  &lt;pre id=&quot;SaAJ&quot;&gt;screen -ls&lt;/pre&gt;
  &lt;p id=&quot;X8Te&quot;&gt;Понятно, что такое количество сессий с одинаковыми названиями нам не нужны, для удаления сессий используют следующую команду, где имя_сессии — это имя сессии, которую вы хотите удалить&lt;/p&gt;
  &lt;pre id=&quot;9rBx&quot;&gt;screen -S имя_сессии -X quit&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;qjL9&quot;&gt;Если в списке сессия с уникальным именем, то можно просто написать, например, &lt;code&gt;screen -S forto -X quit&lt;/code&gt;, но если есть хотя бы два одинаковых имени, то придется указывать ID — &lt;code&gt;screen -S 3290953.forto -X quit&lt;/code&gt; или &lt;code&gt;screen -S 3290953 -X quit&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;cOlb&quot;&gt;Но командная строка тем и хороша, что практически всё можно автоматизировать. Если воспользоваться командой ниже, то она удалит все сессии с одинаковыми именами, где имя_сессии — это имя, присвоенное для многих сессий, которые вы хотите удалить&lt;/p&gt;
  &lt;pre id=&quot;FuWI&quot;&gt;screen -ls | grep &amp;quot;имя_сессии&amp;quot; | awk &amp;#x27;{print $1}&amp;#x27; | xargs -I {} screen -S {} -X quit&lt;/pre&gt;
  &lt;p id=&quot;uyNX&quot;&gt;Для понимания работы команды:&lt;/p&gt;
  &lt;ol id=&quot;tk8O&quot;&gt;
    &lt;li id=&quot;h6lD&quot;&gt;&lt;strong&gt;&lt;code&gt;screen -ls&lt;/code&gt;&lt;/strong&gt;: выводит список всех сессий.&lt;/li&gt;
    &lt;li id=&quot;3Ncw&quot;&gt;&lt;strong&gt;&lt;code&gt;grep &amp;quot;forto&amp;quot;&lt;/code&gt;&lt;/strong&gt;: фильтрует список, оставляя только сессии с названием &amp;quot;&lt;code&gt;имя_сессии&lt;/code&gt;&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;XshY&quot;&gt;&lt;strong&gt;&lt;code&gt;awk &amp;#x27;{print $1}&amp;#x27;&lt;/code&gt;&lt;/strong&gt;: извлекает идентификаторы (ID) этих сессий.&lt;/li&gt;
    &lt;li id=&quot;QD9H&quot;&gt;&lt;strong&gt;&lt;code&gt;xargs -I {} screen -S {} -X quit&lt;/code&gt;&lt;/strong&gt;: передает каждый ID в команду &lt;code&gt;screen -S &amp;lt;ID&amp;gt; -X quit&lt;/code&gt;, которая завершает соответствующую сессию.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ngmO&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Uq0l&quot;&gt;Шпаргалка&lt;/h3&gt;
  &lt;p id=&quot;CNB6&quot;&gt;Все команды для управления Screen довольно простые и их легко запомнить уже после нескольких раз использования, но на всякий случай вот шпаргалка:&lt;/p&gt;
  &lt;figure id=&quot;8yKY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2e/79/2e79f64a-956c-493c-826c-06199a1667ab.png&quot; width=&quot;701&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;qRBy&quot;&gt;Заключение&lt;/h3&gt;
  &lt;p id=&quot;xsoG&quot;&gt;Более подходящий вариант для работы с нодами через командную строку — это их запуск через сервисный файл, но не всегда проекты предоставляют такую возможность. На самом деле Screen — это неплохая альтернатива, но всё-таки рекомендуем проверять работу запущенных сессий (минимум один раз в 1-2 дня), так как через сбой на сервере они могут закрыться, а Screen не умеет самостоятельно повторно их открывать.&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:YTNhRdKYoJ4</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/YTNhRdKYoJ4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Как установить Mobaxterm</title><published>2025-03-07T14:41:32.754Z</published><updated>2025-03-07T14:57:48.332Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/42/1e/421e5814-ded3-4f96-a66d-6a341c6bc49b.png"></media:thumbnail><category term="osnovy" label="Основы"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/11/bd/11bd04fa-997d-42ae-b4d1-9e70ccebe68b.png&quot;&gt;MobaXterm — это универсальный инструмент для удаленного администрирования и работы с серверами. Он сочетает в себе множество функций, таких как SSH, SFTP, VNC, RDP и даже встроенный терминал, что делает его идеальным для управления серверами и выполнения задач с удаленным доступом. Ещё один плюс — это наличие удобного проводника, через которые можно легко скачать з сервера файлы на ваш компьютер или наоборот загрузить с компьютера на сервер.</summary><content type="html">
  &lt;hr /&gt;
  &lt;h2 id=&quot;6fn1&quot;&gt;Ведение&lt;/h2&gt;
  &lt;p id=&quot;cbGL&quot;&gt;MobaXterm — это универсальный инструмент для удаленного администрирования и работы с серверами. Он сочетает в себе множество функций, таких как SSH, SFTP, VNC, RDP и даже встроенный терминал, что делает его идеальным для управления серверами и выполнения задач с удаленным доступом. Ещё один плюс — это наличие удобного проводника, через которые можно легко скачать з сервера файлы на ваш компьютер или наоборот загрузить с компьютера на сервер.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;HpqL&quot;&gt;Установка Mobaxterm&lt;/h2&gt;
  &lt;ul id=&quot;HROa&quot;&gt;
    &lt;li id=&quot;6Jw2&quot;&gt;Переходим по этой &lt;a href=&quot;https://mobaxterm.mobatek.net/download.html&quot; target=&quot;_blank&quot;&gt;ссылке&lt;/a&gt; и нажимаем на кнопку загрузки бесплатной версии (в этой версии можно создать 12 сессий, но для новичка этого вполне достаточно)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;7YWl&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/11/bd/11bd04fa-997d-42ae-b4d1-9e70ccebe68b.png&quot; width=&quot;1833&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;4bqp&quot;&gt;
    &lt;li id=&quot;kILP&quot;&gt;Выбираем версию с инсталлятором и скачиваем&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;HLWC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/47/5c/475c0f22-3c39-4a63-87a7-b77fb8c8d63d.png&quot; width=&quot;1822&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;01B8&quot;&gt;
    &lt;li id=&quot;ax7Z&quot;&gt;Открываем скачанный архив и устанавливаем как обычную программу&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Dy9j&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5f/71/5f7195bd-6f4a-4ccd-a534-546b8f5422d4.png&quot; width=&quot;612&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;NKYq&quot;&gt;
    &lt;li id=&quot;DK77&quot;&gt;После установки открываем программу и видим такой интерфейс, я выбираю темную тему — так намного удобней долго работать с командной строкой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;mw5d&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/68/ab6851f0-384e-4487-994e-f49509e8c9a3.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OVsD&quot;&gt;Создание сессии и подключение к ней&lt;/h2&gt;
  &lt;ul id=&quot;e6LG&quot;&gt;
    &lt;li id=&quot;IF07&quot;&gt;В левой колонке нажимаете правой кнопкой мышь и выбираете пункт создания сессии&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;1iBN&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/49/9d/499d7ba8-03a4-4d1b-91b5-8e01fdd96a21.png&quot; width=&quot;1917&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;Dvnf&quot;&gt;
    &lt;li id=&quot;Zam8&quot;&gt;Появится окно, в котором нужно выбрать тип подключения, выбираем SSH&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;fHYs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/88/0a/880a1ce7-011c-48f2-91d4-dd8353869ae5.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;q2k4&quot;&gt;
    &lt;li id=&quot;kO3k&quot;&gt;В это поле вписываем IP нашего сервера и нажимаем кнопку “OK”&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;6nru&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b1/48/b1482c00-5d11-4ed4-b22a-008321c3af51.png&quot; width=&quot;1915&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;bqkU&quot;&gt;
    &lt;li id=&quot;Xgo3&quot;&gt;Нажимаем два раза на сессию и справа откроется окно, как в браузере&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;28jZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/77/3f/773f785f-0cf6-4a23-96dd-a88bd2b6370d.png&quot; width=&quot;1913&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;EmMz&quot;&gt;
    &lt;li id=&quot;mxsx&quot;&gt;Вводим логин и пароль, чтобы зайти на сервер. Иногда после того, как вставили пароль, на сервер заходит автоматически, а иногда нужно ещё нажать Enter&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;BIiU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/65/8a65a778-bb11-461f-9060-98cc1e9bb181.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;ivj9&quot;&gt;
    &lt;li id=&quot;traN&quot;&gt;Справа откроется сам терминал, куда необходимо вводить все команды, а слева проводник с папками и файлами. Например, выбираем файл, нажимаем на синюю стрелочку вниз, выбираем папку и скачиваем файл себе на компьютер. Если хотим загрузить файл на сервер, то нажимаем на зеленую стрелочку вверх и выбираем файл для загрузки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;PaGH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6c/5a/6c5a23ef-bf08-42a9-aa3b-26c383be67dc.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;K0zn&quot;&gt;
    &lt;li id=&quot;taCp&quot;&gt;Для закрытия сессии нужно написать команду &lt;code&gt;exit&lt;/code&gt; или воспользоваться комбинацией клавиш Ctrl+D&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;y5h2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/05/f5/05f50d05-3701-4576-b6e5-75f8426ea363.png&quot; width=&quot;906&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oF4V&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;pIIJ&quot;&gt;MobaXterm — мощный и удобный инструмент, который значительно упрощает управление серверами и работу с удаленными системами. С его помощью даже новичок сможет легко настроить подключение, управлять файлами и выполнять задачи в командной строке.&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:eEjx-JBUk15</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/eEjx-JBUk15?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Пошаговая инструкция: Создание Telegram-бота с функцией &quot;Обучение&quot;</title><published>2025-03-06T12:07:53.701Z</published><updated>2025-03-06T12:07:53.701Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fc/63/fc6321ee-741b-4528-a15b-ccef6b235740.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/73/51/73513313-2597-4dd9-9a0e-4b8aab51ae81.jpeg&quot;&gt;Представь, что мы собираем ящик с инструментами для нашего бота.</summary><content type="html">
  &lt;figure id=&quot;TBvg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/51/44/5144af79-6bf4-46d5-985a-98d532845676.jpeg&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;fKuI&quot;&gt;Что нам понадобится&lt;/h3&gt;
  &lt;ul id=&quot;FXbM&quot;&gt;
    &lt;li id=&quot;ZqLb&quot;&gt;Компьютер или сервер (например, домашний компьютер или облачный сервер, если у тебя есть).&lt;/li&gt;
    &lt;li id=&quot;KXAk&quot;&gt;Интернет.&lt;/li&gt;
    &lt;li id=&quot;MkKi&quot;&gt;Чуть-чуть терпения и желание повеселиться с ботом!&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;mH1i&quot;&gt;Шаг 1: Подготовка — Устанавливаем нужные штуки&lt;/h3&gt;
  &lt;p id=&quot;cQAu&quot;&gt;Представь, что мы собираем ящик с инструментами для нашего бота.&lt;/p&gt;
  &lt;p id=&quot;pcg3&quot;&gt;&lt;strong&gt;Убедись, что у тебя есть Python&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;j8oq&quot;&gt;
    &lt;ul id=&quot;vjvd&quot;&gt;
      &lt;li id=&quot;eWpN&quot;&gt;Открой терминал (на Windows это &amp;quot;Командная строка&amp;quot; или PowerShell, на Linux/Mac — просто &amp;quot;Терминал&amp;quot;).&lt;/li&gt;
      &lt;li id=&quot;53S0&quot;&gt;Напиши: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;BWaD&quot;&gt;python3 --version&lt;/pre&gt;
  &lt;ol id=&quot;HTcu&quot;&gt;
    &lt;ul id=&quot;7TVb&quot;&gt;
      &lt;li id=&quot;M5uo&quot;&gt;Если видишь что-то вроде Python 3.9.2, всё круто! Если нет, попроси взрослого помочь установить Python с сайта python.org.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;KzfY&quot;&gt;&lt;strong&gt;Установи &amp;quot;инструменты&amp;quot; для бота&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;6gc7&quot;&gt;
    &lt;ul id=&quot;EOpg&quot;&gt;
      &lt;li id=&quot;ZTWN&quot;&gt;В том же терминале пиши по очереди:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;xuYE&quot;&gt;pip3 install python-telegram-bot 
pip3 install openai
pip3 install python-dotenv&lt;/pre&gt;
  &lt;ol id=&quot;ZIls&quot;&gt;
    &lt;ul id=&quot;LXBy&quot;&gt;
      &lt;li id=&quot;EKQU&quot;&gt;Это как скачать приложения для бота: одно для Telegram, другое для умных ответов (GPT), третье для хранения секретов.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Q5eS&quot;&gt;&lt;strong&gt;Установи &amp;quot;экран&amp;quot; (screen), чтобы бот не выключался&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;8fZf&quot;&gt;
    &lt;ul id=&quot;XUhI&quot;&gt;
      &lt;li id=&quot;3NgY&quot;&gt;Если ты на Linux (например, сервер), пиши:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;25K3&quot;&gt;sudo apt install screen&lt;/pre&gt;
  &lt;ol id=&quot;2rGo&quot;&gt;
    &lt;ul id=&quot;pjb7&quot;&gt;
      &lt;li id=&quot;zIQY&quot;&gt;Если что-то не получается, попроси взрослого помочь. На Windows это не нужно, если ты запускаешь дома.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;cAIe&quot;&gt;Шаг 2: Создаём бота и собираем секреты&lt;/h3&gt;
  &lt;p id=&quot;CKXB&quot;&gt;Теперь мы сделаем бота и дадим ему &amp;quot;ключи&amp;quot; для работы.&lt;/p&gt;
  &lt;p id=&quot;ne6w&quot;&gt;&lt;strong&gt;Создай бота в Telegram&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;sS0r&quot;&gt;
    &lt;ul id=&quot;aXNT&quot;&gt;
      &lt;li id=&quot;Bg18&quot;&gt;Открой Telegram на телефоне или компьютере.&lt;/li&gt;
      &lt;li id=&quot;rdm0&quot;&gt;Найди @BotFather (это такой &amp;quot;папа всех ботов&amp;quot;).&lt;/li&gt;
      &lt;li id=&quot;o3BQ&quot;&gt;Напиши ему&lt;strong&gt; /start&lt;/strong&gt;, потом &lt;strong&gt;/newbot.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;hD8x&quot;&gt;Дай боту имя (например, &amp;quot;УмныйВоваБот&amp;quot;) и ник (например, @VovaSmartBot).&lt;/li&gt;
      &lt;li id=&quot;X0wS&quot;&gt;Он даст тебе код, типа&lt;strong&gt; 771456457973:AAGwsD0GetKrPtn-OuMyoV_uBMR45645diS7U&lt;/strong&gt;. Запиши его!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;kOY3&quot;&gt;&lt;strong&gt;Получи ключ для GPT&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;pyyJ&quot;&gt;
    &lt;ul id=&quot;Zddp&quot;&gt;
      &lt;li id=&quot;1GXj&quot;&gt;Попроси взрослого зарегистрироваться на &lt;a href=&quot;https://platform.openai.com&quot; target=&quot;_blank&quot;&gt;platform.openai.com&lt;/a&gt;.&lt;/li&gt;
      &lt;li id=&quot;fpGw&quot;&gt;Там в разделе &amp;quot;API Keys&amp;quot; нажми &amp;quot;Create new secret key&amp;quot;.&lt;/li&gt;
      &lt;li id=&quot;HKeQ&quot;&gt;Скопируй ключ, он выглядит как &lt;strong&gt;sk-proj-qBB9UQNZBXudTpDJff9aJoZecGrXTeCtgV3K2TzZ6YT4m-Tfhg4M5wozR5vWtCwDfghxE-v3j-boKhghKOymT3Blbорлрололр7jn2XJQBrJzuTWauMIZNjLYfghY2hDeDZ9kWowgf9kSriAj11фывф-Gp0U95FBLvEыквg4SyfgP0qvCK0A.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;tLcb&quot;&gt;&lt;strong&gt;Создай секретный файл .env&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;DnBI&quot;&gt;
    &lt;ul id=&quot;yaf4&quot;&gt;
      &lt;li id=&quot;fIJ0&quot;&gt;В терминале создай папку для бота: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;f1oJ&quot;&gt;mkdir my_cool_bot cd my_cool_bot
apt install nano&lt;/pre&gt;
  &lt;ol id=&quot;5qw9&quot;&gt;
    &lt;ul id=&quot;F5Ob&quot;&gt;
      &lt;li id=&quot;vMFy&quot;&gt;Открой текстовый редактор: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;HXDt&quot;&gt;nano .env&lt;/pre&gt;
  &lt;ol id=&quot;t7pA&quot;&gt;
    &lt;ul id=&quot;HcrS&quot;&gt;
      &lt;li id=&quot;pHyN&quot;&gt;Вставь свои ключи:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;S50l&quot;&gt;TELEGRAM_TOKEN=твой_код_от_BotFather 
OPENAI_API_KEY=твой_код_от_OpenAI&lt;/pre&gt;
  &lt;ol id=&quot;KbZ1&quot;&gt;
    &lt;ul id=&quot;ZKkx&quot;&gt;
      &lt;li id=&quot;MFSY&quot;&gt;Сохрани: нажми &lt;strong&gt;Ctrl+O&lt;/strong&gt;, потом &lt;strong&gt;Enter&lt;/strong&gt;, и выйди с &lt;strong&gt;Ctrl+X.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;o8Cy&quot;&gt;Шаг 3: Пишем код для бота&lt;/h3&gt;
  &lt;p id=&quot;BPtS&quot;&gt;Теперь дадим боту мозги! Мы заменим кнопку и добавим обучение.&lt;/p&gt;
  &lt;ol id=&quot;FYMC&quot;&gt;
    &lt;li id=&quot;XdKA&quot;&gt;&lt;strong&gt;Создай файл bot.py&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;J3CG&quot;&gt;
      &lt;li id=&quot;zPWz&quot;&gt;В той же папке (&lt;strong&gt;my_cool_bot&lt;/strong&gt;) пиши: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;FGUj&quot;&gt;nano bot.py&lt;/pre&gt;
  &lt;ol id=&quot;qX51&quot;&gt;
    &lt;ul id=&quot;lYC7&quot;&gt;
      &lt;li id=&quot;EIVW&quot;&gt;Вставь этот код:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;FNSl&quot; data-lang=&quot;python&quot;&gt;import os
import json
from dotenv import load_dotenv
from telegram import Update, ReplyKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from openai import OpenAI

# Загружаем секретные ключи
load_dotenv()
TELEGRAM_TOKEN = os.getenv(&amp;quot;TELEGRAM_TOKEN&amp;quot;)
OPENAI_API_KEY = os.getenv(&amp;quot;OPENAI_API_KEY&amp;quot;)

# Подключаемся к GPT
client = OpenAI(api_key=OPENAI_API_KEY)

# Хранилища для данных
user_prompts = {}
user_history = {}
user_training_data = {}

# Загружаем данные обучения из файла, если он есть
def load_training_data():
    global user_training_data
    try:
        with open(&amp;quot;training_data.json&amp;quot;, &amp;quot;r&amp;quot;) as f:
            user_training_data = json.load(f)
    except FileNotFoundError:
        user_training_data = {}

# Сохраняем данные обучения в файл
def save_training_data():
    with open(&amp;quot;training_data.json&amp;quot;, &amp;quot;w&amp;quot;) as f:
        json.dump(user_training_data, f)

# Загружаем данные при старте
load_training_data()

# Меню с кнопками
main_menu = ReplyKeyboardMarkup([
    [&amp;quot;История&amp;quot;, &amp;quot;Промт для бота&amp;quot;],
    [&amp;quot;Темы Постов&amp;quot;, &amp;quot;Обучение&amp;quot;]
], resize_keyboard=True)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    print(f&amp;quot;Кто-то сказал /start! ID: {update.message.from_user.id}&amp;quot;)
    await update.message.reply_text(
        &amp;quot;Привет! Я твой умный бот. Выбери что-нибудь в меню или просто поболтай со мной!&amp;quot;,
        reply_markup=main_menu
    )

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    text = update.message.text
    print(f&amp;quot;Сообщение от {user_id}: {text}&amp;quot;)

    if text == &amp;quot;История&amp;quot;:
        history = user_history.get(user_id, &amp;quot;История пуста.&amp;quot;)
        await update.message.reply_text(history)
    
    elif text == &amp;quot;Промт для бота&amp;quot;:
        await update.message.reply_text(&amp;quot;Напиши, кем я должен быть (например, &amp;#x27;Ты - повар&amp;#x27; или &amp;#x27;Ты - учитель&amp;#x27;).&amp;quot;)
    
    elif text == &amp;quot;Темы Постов&amp;quot;:
        prompt = user_prompts.get(user_id, &amp;quot;Ты - универсальный помощник.&amp;quot;)
        post_ideas = get_post_ideas_from_gpt(prompt)
        if &amp;quot;Ошибка&amp;quot; not in post_ideas:
            ideas = post_ideas.split(&amp;quot;\n\n&amp;quot;)
            for idea in ideas:
                if idea.strip():
                    await update.message.reply_text(idea.strip())
        else:
            await update.message.reply_text(post_ideas)
    
    elif text == &amp;quot;Обучение&amp;quot;:
        await update.message.reply_text(&amp;quot;Пришли мне ссылку, текст или что-то интересное, чтобы я научился!&amp;quot;)
    
    else:
        # После &amp;quot;Промт для бота&amp;quot;
        if &amp;quot;Промт для бота&amp;quot; in context.user_data.get(&amp;quot;last_command&amp;quot;, &amp;quot;&amp;quot;):
            user_prompts[user_id] = text
            await update.message.reply_text(&amp;quot;Круто, я теперь это умею!&amp;quot;)
        
        # После &amp;quot;Обучение&amp;quot;
        elif &amp;quot;Обучение&amp;quot; in context.user_data.get(&amp;quot;last_command&amp;quot;, &amp;quot;&amp;quot;):
            if user_id not in user_training_data:
                user_training_data[user_id] = []
            user_training_data[user_id].append(text)
            save_training_data()  # Сохраняем в файл
            summary = process_training_data(text)
            await update.message.reply_text(f&amp;quot;{summary}\nБлагодаря тебе я теперь это знаю, Вове привет!&amp;quot;)
        
        # Просто болтаем
        else:
            prompt = user_prompts.get(user_id, &amp;quot;Ты - универсальный помощник.&amp;quot;)
            response = get_chat_response(prompt, text)
            await update.message.reply_text(response)
        
        # Записываем в историю
        if user_id not in user_history:
            user_history[user_id] = &amp;quot;&amp;quot;
        user_history[user_id] += f&amp;quot;Ты сказал: {text}\n&amp;quot;

    context.user_data[&amp;quot;last_command&amp;quot;] = text

def get_post_ideas_from_gpt(prompt):
    try:
        print(f&amp;quot;Спрашиваю GPT про посты с промтом: {prompt}&amp;quot;)
        response = client.chat.completions.create(
            model=&amp;quot;gpt-4o&amp;quot;,
            messages=[
                {&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: f&amp;quot;{prompt} Дай 5 идей для постов на март 2025. Раздели их пустой строкой.&amp;quot;},
                {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Дай мне идеи!&amp;quot;}
            ],
            max_tokens=500
        )
        return response.choices[0].message.content
    except Exception as e:
        return f&amp;quot;Упс, ошибка с GPT: {str(e)}&amp;quot;

def get_chat_response(prompt, user_input):
    try:
        print(f&amp;quot;Болтаю с GPT: {user_input}&amp;quot;)
        response = client.chat.completions.create(
            model=&amp;quot;gpt-4o&amp;quot;,
            messages=[
                {&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: prompt},
                {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: user_input}
            ],
            max_tokens=500
        )
        return response.choices[0].message.content
    except Exception as e:
        return f&amp;quot;Ой, ошибка с GPT: {str(e)}&amp;quot;

def process_training_data(data):
    try:
        print(f&amp;quot;Учусь на этом: {data}&amp;quot;)
        response = client.chat.completions.create(
            model=&amp;quot;gpt-4o&amp;quot;,
            messages=[
                {&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Ты - ученик. Дай очень краткий обзор того, что понял из текста или ссылки.&amp;quot;},
                {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: f&amp;quot;Что это: {data}&amp;quot;}
            ],
            max_tokens=50
        )
        return response.choices[0].message.content
    except Exception as e:
        return f&amp;quot;Не понял, что это: {str(e)}&amp;quot;

def main():
    application = Application.builder().token(TELEGRAM_TOKEN).build()
    application.add_handler(CommandHandler(&amp;quot;start&amp;quot;, start))
    application.add_handler(MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, handle_message))
    print(&amp;quot;Я готов работать!&amp;quot;)
    application.run_polling()

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/pre&gt;
  &lt;ol id=&quot;YOw9&quot;&gt;
    &lt;li id=&quot;frpW&quot;&gt;&lt;strong&gt;Сохрани файл&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;RjVn&quot;&gt;
      &lt;li id=&quot;6qrT&quot;&gt;Нажми &lt;strong&gt;Ctrl+O&lt;/strong&gt;, потом &lt;strong&gt;Enter&lt;/strong&gt;, и выйди с &lt;strong&gt;Ctrl+X.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;AFwx&quot;&gt;Шаг 4: Запускаем бота, чтобы он не выключался&lt;/h3&gt;
  &lt;p id=&quot;zhHj&quot;&gt;Теперь сделаем так, чтобы бот работал, даже если ты закроешь терминал.&lt;/p&gt;
  &lt;p id=&quot;SSgv&quot;&gt;&lt;strong&gt;Открой &amp;quot;экран&amp;quot;&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;J9Sd&quot;&gt;
    &lt;ul id=&quot;L1y6&quot;&gt;
      &lt;li id=&quot;aA88&quot;&gt;В той же папке (my_cool_bot) пиши:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;JqHm&quot;&gt;screen&lt;/pre&gt;
  &lt;ol id=&quot;vnqK&quot;&gt;
    &lt;ul id=&quot;YEcz&quot;&gt;
      &lt;li id=&quot;N85e&quot;&gt;Ты увидишь новый экран (может быть сообщение — нажми Enter).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;zhN9&quot;&gt;&lt;strong&gt;Запусти бота&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;gilZ&quot;&gt;
    &lt;ul id=&quot;aedd&quot;&gt;
      &lt;li id=&quot;qvtW&quot;&gt;Пиши: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;LpY0&quot;&gt;python3 bot.py&lt;/pre&gt;
  &lt;ol id=&quot;CAok&quot;&gt;
    &lt;ul id=&quot;kJMd&quot;&gt;
      &lt;li id=&quot;IQWz&quot;&gt;Если всё ок, увидишь &lt;strong&gt;Я готов работать!.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;tTVp&quot;&gt;&lt;strong&gt;Спрячь экран&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;WQr9&quot;&gt;
    &lt;ul id=&quot;gOaA&quot;&gt;
      &lt;li id=&quot;2Wnk&quot;&gt;Нажми &lt;strong&gt;Ctrl+A,&lt;/strong&gt; потом &lt;strong&gt;D&lt;/strong&gt;.&lt;/li&gt;
      &lt;li id=&quot;hJEn&quot;&gt;Ты вернёшься назад, а бот будет работать!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;IB1D&quot;&gt;&lt;strong&gt;Проверь, что он жив&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;B0kw&quot;&gt;
    &lt;ul id=&quot;DtgA&quot;&gt;
      &lt;li id=&quot;PFft&quot;&gt;Пиши: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;mFSc&quot;&gt;screen -ls&lt;/pre&gt;
  &lt;ol id=&quot;2eiG&quot;&gt;
    &lt;ul id=&quot;MOQq&quot;&gt;
      &lt;li id=&quot;ydqp&quot;&gt;Увидишь что-то вроде &lt;strong&gt;12345.pts-0 (Detached)&lt;/strong&gt; — это значит, бот живёт.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;7M7F&quot;&gt;Шаг 5: Проверяем, как всё работает&lt;/h3&gt;
  &lt;p id=&quot;w87B&quot;&gt;Теперь давай поиграем с ботом!&lt;/p&gt;
  &lt;p id=&quot;Atb7&quot;&gt;&lt;strong&gt;Открой Telegram&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;ixoJ&quot;&gt;
    &lt;ul id=&quot;sn6M&quot;&gt;
      &lt;li id=&quot;cSLP&quot;&gt;Найди своего бота по его нику (например, @VovaSmartBot).&lt;/li&gt;
      &lt;li id=&quot;Jarz&quot;&gt;Напиши &lt;strong&gt;/start.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;T6Tn&quot;&gt;Увидишь меню с кнопками: &amp;quot;История&amp;quot;, &amp;quot;Промт для бота&amp;quot;, &amp;quot;Темы Постов&amp;quot;, &amp;quot;Обучение&amp;quot;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;5L4F&quot;&gt;&lt;strong&gt;Проверь &amp;quot;Обучение&amp;quot;&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;tUIq&quot;&gt;
    &lt;ul id=&quot;o0KM&quot;&gt;
      &lt;li id=&quot;JhUk&quot;&gt;Нажми &lt;strong&gt;&amp;quot;Обучение&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
      &lt;li id=&quot;NfCJ&quot;&gt;Напиши что-нибудь, например:&lt;/li&gt;
      &lt;ul id=&quot;b7Ai&quot;&gt;
        &lt;li id=&quot;F9Kp&quot;&gt;&lt;strong&gt;https://ru.wikipedia.org/wiki/Кот&lt;/strong&gt;&lt;/li&gt;
        &lt;li id=&quot;gnNQ&quot;&gt;Или: &lt;strong&gt;Кот — это пушистое животное, которое мурлыкает.&lt;/strong&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;S6US&quot;&gt;Бот ответит что-то вроде: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;mUcQ&quot;&gt;&lt;code&gt;Коты — пушистые и мурлыкают. &lt;/code&gt;&lt;/blockquote&gt;
  &lt;blockquote id=&quot;1IT6&quot;&gt;&lt;code&gt;Благодаря тебе я теперь это знаю, Вове привет!&lt;/code&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;dvQ4&quot;&gt;&lt;strong&gt;Проверь другие кнопки&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;PJjs&quot;&gt;
    &lt;ul id=&quot;lpzb&quot;&gt;
      &lt;li id=&quot;DfOA&quot;&gt;&amp;quot;&lt;strong&gt;История&lt;/strong&gt;&amp;quot;: Покажет, что ты писал.&lt;/li&gt;
      &lt;li id=&quot;PNV9&quot;&gt;&amp;quot;&lt;strong&gt;Промт для бота&amp;quot;&lt;/strong&gt;: Напиши &amp;quot;Ты - кот&amp;quot;, и бот станет говорить как кот.&lt;/li&gt;
      &lt;li id=&quot;1klB&quot;&gt;&amp;quot;&lt;strong&gt;Темы Постов&lt;/strong&gt;&amp;quot;: Даст 5 идей для постов, каждая в отдельном сообщении.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;qfTK&quot;&gt;&lt;strong&gt;Поболтай с ботом&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;wj3Q&quot;&gt;
    &lt;ul id=&quot;qfCL&quot;&gt;
      &lt;li id=&quot;AKRY&quot;&gt;Напиши &amp;quot;Привет, как дела?&amp;quot; — он ответит как помощник (или кот, если ты сменил промт).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;Q3dh&quot;&gt;Шаг 6: Что делать, если что-то сломалось&lt;/h3&gt;
  &lt;ul id=&quot;edJW&quot;&gt;
    &lt;li id=&quot;Gbdz&quot;&gt;&lt;strong&gt;Бот не отвечает&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;3eUm&quot;&gt;
      &lt;li id=&quot;wkVf&quot;&gt;Вернись в экран: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;UFS6&quot;&gt;screen -r&lt;/pre&gt;
  &lt;ul id=&quot;gI7F&quot;&gt;
    &lt;ul id=&quot;0lfX&quot;&gt;
      &lt;li id=&quot;rzyb&quot;&gt;Посмотри, что он пишет. Если ошибка про &lt;strong&gt;TELEGRAM_TOKEN&lt;/strong&gt; или &lt;strong&gt;OPENAI_API_KEY,&lt;/strong&gt; проверь &lt;strong&gt;.env.&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;ObC2&quot;&gt;&lt;strong&gt;Не запускается&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;acwH&quot;&gt;
      &lt;li id=&quot;NUf8&quot;&gt;Убедись, что ты в папке &lt;strong&gt;my_cool_bot&lt;/strong&gt;: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;RhDH&quot;&gt;cd my_cool_bot 
ls&lt;/pre&gt;
  &lt;ul id=&quot;NUbV&quot;&gt;
    &lt;ul id=&quot;iAAD&quot;&gt;
      &lt;li id=&quot;QvoX&quot;&gt;Должны быть&lt;strong&gt; bot.py&lt;/strong&gt; и .&lt;strong&gt;env&lt;/strong&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;UO4T&quot;&gt;Круто, ты сделал бота!&lt;/h3&gt;
  &lt;p id=&quot;PGFi&quot;&gt;Теперь он умеет учиться, хранит данные в файле &lt;strong&gt;training_data.json&lt;/strong&gt; (в той же папке), и будет жить в &lt;strong&gt;screen&lt;/strong&gt;, пока сервер включён. Если хочешь остановить бота, зайди в &lt;strong&gt;screen &lt;/strong&gt;(&lt;strong&gt;screen -r&lt;/strong&gt;), нажми &lt;strong&gt;Ctrl+C&lt;/strong&gt;, и выйди с &lt;strong&gt;exit.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;5KrI&quot;&gt;Напиши, если что-то непонятно или не работает — я помогу! 😊&lt;/p&gt;

</content></entry><entry><id>vlad_i_mir:w5DCInDtyPV</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/w5DCInDtyPV?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Как установить ноду Dria Compute Node (пошаговая инструкция)</title><published>2025-03-04T23:19:38.380Z</published><updated>2025-07-28T06:19:39.963Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/76/79/7679c4ad-7bf8-42d9-b2c4-8fd6563e9973.png"></media:thumbnail><category term="osnovy" label="Основы"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/26/c1/26c1b9ca-6d3e-45e5-8044-f948df6ba5a6.jpeg&quot;&gt;Ты хочешь установить ноду Dria, чтобы подключиться к децентрализованной сети и запускать AI-агентов. Вот шаг за шагом, как это сделать:</summary><content type="html">
  &lt;figure id=&quot;K5fF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/26/c1/26c1b9ca-6d3e-45e5-8044-f948df6ba5a6.jpeg&quot; width=&quot;1120&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hc1s&quot;&gt;Ты хочешь установить ноду Dria, чтобы подключиться к децентрализованной сети и запускать AI-агентов. Вот шаг за шагом, как это сделать:&lt;/p&gt;
  &lt;p id=&quot;2Tx7&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;UOOR&quot;&gt;Шаг 1: Установи нужные программы&lt;/h2&gt;
  &lt;p id=&quot;1Xtx&quot;&gt;&lt;strong&gt;Открой терминал&lt;/strong&gt; (это приложение, где можно вводить команды).&lt;/p&gt;
  &lt;p id=&quot;Plfk&quot;&gt;&lt;strong&gt;Установим curl&lt;/strong&gt;: Это программа, которая поможет загрузить нужные файлы. Введи команду:&lt;/p&gt;
  &lt;pre id=&quot;Reig&quot; data-lang=&quot;bash&quot;&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install curl -y &lt;/pre&gt;
  &lt;p id=&quot;0GI4&quot;&gt;&lt;strong&gt;Установи unzip&lt;/strong&gt; (если его нет):&lt;/p&gt;
  &lt;pre id=&quot;rJNi&quot; data-lang=&quot;bash&quot;&gt;sudo apt-get install unzip &lt;/pre&gt;
  &lt;p id=&quot;c9vn&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;wTi1&quot;&gt;Шаг 2: Скачай и установи Dria Compute Launcher&lt;/h2&gt;
  &lt;p id=&quot;cuJ9&quot;&gt;&lt;strong&gt;Загрузи Dria Compute Launcher&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;d7EF&quot;&gt;Введи команду в терминале&lt;/p&gt;
  &lt;pre id=&quot;lltl&quot; data-lang=&quot;bash&quot;&gt;curl -fsSL https://dria.co/launcher | bash &lt;/pre&gt;
  &lt;p id=&quot;9BTp&quot;&gt;Это скачает и установит специальный файл для запуска ноды Dria.&lt;/p&gt;
  &lt;p id=&quot;UQBw&quot;&gt;&lt;strong&gt;Перезапусти терминал&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;stOE&quot;&gt;Закрой терминал и открой его снова, чтобы все изменения вступили в силу.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;nAX9&quot;&gt;Шаг 3: Установка Ollama &lt;/h2&gt;
  &lt;p id=&quot;tDwy&quot;&gt;&lt;strong&gt;Скачай и установи Ollama&lt;/strong&gt;:Введи команду:&lt;/p&gt;
  &lt;pre id=&quot;DDtf&quot; data-lang=&quot;bash&quot;&gt;curl -fsSL https://ollama.com/install.sh | sh &lt;/pre&gt;
  &lt;p id=&quot;jboS&quot;&gt;&lt;strong&gt;Проверь, что Ollama установлен&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;vaB8&quot;&gt;Введи:&lt;/p&gt;
  &lt;pre id=&quot;kNv2&quot; data-lang=&quot;bash&quot;&gt;ollama --version &lt;/pre&gt;
  &lt;p id=&quot;GYff&quot;&gt;Если все правильно, он покажет версию программы.&lt;/p&gt;
  &lt;p id=&quot;2kFi&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Bm33&quot;&gt;Шаг 3: Настрой и запусти ноду Dria &lt;/h2&gt;
  &lt;p id=&quot;AUx7&quot;&gt;&lt;strong&gt;Список команд&lt;/strong&gt;: в терминале введи:&lt;/p&gt;
  &lt;pre id=&quot;mEqi&quot;&gt;dkn-compute-launcher help &lt;/pre&gt;
  &lt;p id=&quot;NtK3&quot;&gt;Это покажет список команд, которые можно использовать. Если ты видишь этот список, значит установка прошла успешно!&lt;/p&gt;
  &lt;ol id=&quot;Rzib&quot;&gt;
    &lt;li id=&quot;E8y9&quot;&gt;&lt;strong&gt;settings&lt;/strong&gt; — Изменение настроек узла: модели, API-ключи, сетевые параметры.&lt;/li&gt;
    &lt;li id=&quot;Tdbi&quot;&gt;&lt;strong&gt;setup&lt;/strong&gt; — Создание файла окружения (.env) с нуля (перезапишет существующие значения).&lt;/li&gt;
    &lt;li id=&quot;hwiR&quot;&gt;&lt;strong&gt;start&lt;/strong&gt; — Запуск последнего вычислительного узла.&lt;/li&gt;
    &lt;li id=&quot;cuBr&quot;&gt;&lt;strong&gt;referrals&lt;/strong&gt; — Генерация или ввод реферального кода.&lt;/li&gt;
    &lt;li id=&quot;3rKe&quot;&gt;&lt;strong&gt;points&lt;/strong&gt; — Показать ваши очки $DRIA.&lt;/li&gt;
    &lt;li id=&quot;25ak&quot;&gt;&lt;strong&gt;uninstall&lt;/strong&gt; — Удаление лаунчера и его файлов.&lt;/li&gt;
    &lt;li id=&quot;Eudn&quot;&gt;&lt;strong&gt;info&lt;/strong&gt; — Информация о текущем окружении.&lt;/li&gt;
    &lt;li id=&quot;39rZ&quot;&gt;&lt;strong&gt;update&lt;/strong&gt; — Ручное обновление узла и лаунчера.&lt;/li&gt;
    &lt;li id=&quot;9RBa&quot;&gt;&lt;strong&gt;specific&lt;/strong&gt; — Запуск определенной версии узла.&lt;/li&gt;
    &lt;li id=&quot;7rWx&quot;&gt;&lt;strong&gt;env-editor&lt;/strong&gt; — Открытие текстового редактора для файла окружения (для продвинутых пользователей).&lt;/li&gt;
    &lt;li id=&quot;U01z&quot;&gt;&lt;strong&gt;help&lt;/strong&gt; — Вывод справки (этого сообщения или помощи по подкомандам).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Gg2f&quot;&gt;&lt;strong&gt;опции &lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;Qwhu&quot;&gt;
    &lt;li id=&quot;LQYs&quot;&gt;&lt;strong&gt;-e, --env &amp;lt;ENV&amp;gt;&lt;/strong&gt; — Указание пути к файлу .env (по умолчанию: /root/.dria/dkn-compute-launcher/.env).&lt;/li&gt;
    &lt;li id=&quot;gyOm&quot;&gt;&lt;strong&gt;-p, --profile &amp;lt;PROFILE&amp;gt;&lt;/strong&gt; — Название профиля для файла окружения.&lt;/li&gt;
    &lt;li id=&quot;vsS6&quot;&gt;&lt;strong&gt;-h, --help&lt;/strong&gt; — Вывод справки.&lt;/li&gt;
    &lt;li id=&quot;Sc3t&quot;&gt;&lt;strong&gt;-V, --version&lt;/strong&gt; — Вывод версии программы.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;SXpr&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ZEqK&quot;&gt;&lt;strong&gt;Изменение настроек узла: модели, API-ключи, сетевые параметры.&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;a4nG&quot; data-lang=&quot;bash&quot;&gt;dkn-compute-launcher settings&lt;/pre&gt;
  &lt;p id=&quot;Hdpz&quot;&gt;Это покажет настройки&lt;/p&gt;
  &lt;p id=&quot;mXbN&quot;&gt;&lt;strong&gt;Запуск ноды&lt;/strong&gt;: &lt;/p&gt;
  &lt;p id=&quot;J97m&quot;&gt;&lt;code&gt;dkn-compute-launcher start &lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ollu&quot;&gt;Это запустит твою ноду и подключит её к сети Dria.&lt;/p&gt;
  &lt;p id=&quot;GkDd&quot;&gt;&lt;strong&gt;Проверь статус&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;Jjd1&quot;&gt;Чтобы проверить, работает ли нода, введи команду:&lt;/p&gt;
  &lt;pre id=&quot;1qZF&quot; data-lang=&quot;bash&quot;&gt;dkn-compute-launcher status &lt;/pre&gt;
  &lt;p id=&quot;tnmT&quot;&gt;Если все нормально, терминал покажет, что нода активна. Чтобы нода работала даже после закрытия терминала, используй команду &lt;code&gt;screen&lt;/code&gt; для запуска её в фоновом режиме. Поэтому останавливаем работу узла &lt;strong&gt;Ctrl + С &lt;/strong&gt;и затем запускаем его в &lt;code&gt;screen&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ELiT&quot;&gt;Пример:&lt;/p&gt;
  &lt;pre id=&quot;3q0U&quot; data-lang=&quot;bash&quot;&gt;screen -S dria-node dkn-compute-launcher start &lt;/pre&gt;
  &lt;p id=&quot;TXjC&quot;&gt;Чтобы выйти из &lt;code&gt;screen&lt;/code&gt;, нажми &lt;strong&gt;Ctrl + A&lt;/strong&gt;, потом &lt;strong&gt;D&lt;/strong&gt;.&lt;/p&gt;
  &lt;ul id=&quot;UNjP&quot;&gt;
    &lt;li id=&quot;yOGB&quot;&gt;Чтобы вернуться в &lt;code&gt;screen&lt;/code&gt;, введи:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;F1NT&quot; data-lang=&quot;bash&quot;&gt;screen -r dria-node &lt;/pre&gt;
  &lt;p id=&quot;q6X3&quot;&gt;или просмотреть запущенные скрины &lt;/p&gt;
  &lt;pre id=&quot;EU5N&quot; data-lang=&quot;bash&quot;&gt;screen -ls&lt;/pre&gt;
  &lt;p id=&quot;TnZ7&quot;&gt;Еще не маловажный инструмент эта работа с профилем&lt;/p&gt;
  &lt;pre id=&quot;MULt&quot; data-lang=&quot;bash&quot;&gt;screen -S dria-node36 dkn-compute-launcher --profile 36 start &lt;/pre&gt;
  &lt;pre id=&quot;Z7RA&quot; data-lang=&quot;bash&quot;&gt;dkn-compute-launcher --profile 11 settings&lt;/pre&gt;
  &lt;p id=&quot;i4QV&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9ozt&quot;&gt;&lt;strong&gt;Для запуска 40 сессий, изменяя номера с 1 до 40, с интервалом в 15 секунд:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;jt09&quot; data-lang=&quot;bash&quot;&gt;for i in $(seq 1 40); do screen -S dria-node$i dkn-compute-launcher --profile $i start; sleep 15; done&lt;/pre&gt;
  &lt;p id=&quot;xeGD&quot;&gt;Вот та же команда, но для запуска 40 сессий, изменяя номера с 1 до 40, с интервалом в 15 секунд:&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;NGsy&quot;&gt;Bash&lt;/p&gt;
  &lt;pre id=&quot;vAFL&quot;&gt;for i in $(seq 1 40); do screen -S dria-node$i dkn-compute-launcher --profile $i start; sleep 15; done
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;eBUI&quot;&gt;Пояснение команды&lt;/p&gt;
  &lt;ul id=&quot;48us&quot;&gt;
    &lt;li id=&quot;esEE&quot;&gt;&lt;code&gt;for i in $(seq 1 40); do ... done&lt;/code&gt;: Этот цикл будет проходить по числам от &lt;strong&gt;1 до 40&lt;/strong&gt;. На каждой итерации текущее число присваивается переменной &lt;code&gt;i&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;gLhH&quot;&gt;&lt;code&gt;screen -S dria-node$i dkn-compute-launcher --profile $i start&lt;/code&gt;: Это ваша команда для запуска процесса. &lt;code&gt;$i&lt;/code&gt; автоматически заменится на текущее число из цикла. Таким образом, в каждой новой сессии &lt;code&gt;screen&lt;/code&gt; будет уникальное имя (например, &lt;code&gt;dria-node1&lt;/code&gt;, &lt;code&gt;dria-node2&lt;/code&gt; и так далее до &lt;code&gt;dria-node40&lt;/code&gt;) и соответствующий номер профиля.&lt;/li&gt;
    &lt;li id=&quot;0sQf&quot;&gt;&lt;code&gt;sleep 15&lt;/code&gt;: После запуска каждой &lt;code&gt;screen&lt;/code&gt;-сессии скрипт будет ждать &lt;strong&gt;15 секунд&lt;/strong&gt;, прежде чем перейти к следующей итерации. Это обеспечит необходимый интервал между запусками.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;k2RH&quot;&gt;Эта команда запустит 40 отдельных &lt;code&gt;screen&lt;/code&gt;-сессий, каждая из которых будет иметь свой уникальный идентификатор и профиль, с паузой в 15 секунд между запусками.&lt;/p&gt;
  &lt;p id=&quot;wx7h&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Z6xn&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;fwGb&quot;&gt;Шаг 4: Исправляем ошибки если они есть &lt;/h2&gt;
  &lt;h4 id=&quot;hHJM&quot;&gt;1. Проверяем фаервол на сервере&lt;/h4&gt;
  &lt;p id=&quot;6l0k&quot;&gt;Твой порт 4001 открыт внутри сервера, но провайдером может блокировать его снаружи через свой фаервол. &lt;/p&gt;
  &lt;p id=&quot;3AdL&quot;&gt;Давай убедимся, что он разрешён,введи:&lt;/p&gt;
  &lt;pre id=&quot;W4CQ&quot; data-lang=&quot;bash&quot;&gt;sudo ufw status&lt;/pre&gt;
  &lt;p id=&quot;z3CW&quot;&gt;Ты должен увидеть &lt;/p&gt;
  &lt;blockquote id=&quot;oX8P&quot;&gt;&lt;strong&gt;4001 ALLOW Anywhere. &lt;/strong&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;WkU9&quot;&gt;Если 4001 нет в списке, добавь его: &lt;/p&gt;
  &lt;pre id=&quot;sb7J&quot; data-lang=&quot;bash&quot;&gt;sudo ufw allow 4001 sudo ufw status &lt;/pre&gt;
  &lt;h4 id=&quot;APhB&quot;&gt;2. Обновляем узел&lt;/h4&gt;
  &lt;p id=&quot;Er3v&quot;&gt;Давай обновимся.&lt;/p&gt;
  &lt;p id=&quot;QVf7&quot;&gt;Останови узел, нажми Ctrl+C, чтобы выключить.&lt;/p&gt;
  &lt;pre id=&quot;xrrk&quot; data-lang=&quot;bash&quot;&gt;dkn-compute-launcher update &lt;/pre&gt;
  &lt;p id=&quot;NpoH&quot;&gt;Это скачает новую версию. Затем снова запустите узел &lt;/p&gt;
  &lt;h4 id=&quot;qcEB&quot;&gt;3. Добавляем bootstrap nodes&lt;/h4&gt;
  &lt;p id=&quot;2ejU&quot;&gt;В .env у тебя DKN_BOOTSTRAP_NODES= пустое. Это как адресная книга — без неё узел не знает, к кому подключаться. Добавим стандартные узлы Dria.&lt;/p&gt;
  &lt;ul id=&quot;p92j&quot;&gt;
    &lt;li id=&quot;B3YE&quot;&gt;Открой файл .env: &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;3HkG&quot;&gt;nano /root/.dria/dkn-compute-launcher/.env&lt;/pre&gt;
  &lt;ul id=&quot;ouQx&quot;&gt;
    &lt;li id=&quot;3kpI&quot;&gt;Найди строку DKN_BOOTSTRAP_NODES= и замени её на: &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Fw90&quot;&gt;DKN_BOOTSTRAP_NODES=/ip4/52.8.51.142/tcp/4001/p2p/16Uiu2HAm9d3sMhNa3N1tN9v9kKANvJABu5gRYH7K6f5UUcUKzuwT,/ip4/52.9.132.242/tcp/4001/p2p/16Uiu2HAmFidHMYbMJG9tS4tHQeXuK3DA5kBAnVcF4hdhsG6jTdqa&lt;/pre&gt;
  &lt;p id=&quot;BOD2&quot;&gt; Это официальные узлы Dria из документации на GitHub.&lt;/p&gt;
  &lt;ul id=&quot;MH4l&quot;&gt;
    &lt;li id=&quot;OQQ4&quot;&gt;Сохрани файл: нажми &lt;strong&gt;Ctrl+O&lt;/strong&gt;, &lt;strong&gt;Enter&lt;/strong&gt;, потом выйди с &lt;strong&gt;Ctrl+X&lt;/strong&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;nyk6&quot;&gt;4. Запускаем узел заново&lt;/h4&gt;
  &lt;ul id=&quot;CJF2&quot;&gt;
    &lt;li id=&quot;zew6&quot;&gt;Запусти: &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;UPVZ&quot; data-lang=&quot;bash&quot;&gt;screen -S dria-node dkn-compute-launcher start &lt;/pre&gt;
  &lt;p id=&quot;LC3i&quot;&gt;Нажми Ctrl+A, D, чтобы выйти из screen.&lt;/p&gt;
  &lt;ul id=&quot;HlJ4&quot;&gt;
    &lt;li id=&quot;jnC4&quot;&gt;Подожди 1-2 минуты, зайди обратно: &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;FaHW&quot; data-lang=&quot;bash&quot;&gt;screen -r dria-node&lt;/pre&gt;

</content></entry><entry><id>vlad_i_mir:CzRkuvFeU_S</id><link rel="alternate" type="text/html" href="https://teletype.in/@vlad_i_mir/CzRkuvFeU_S?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=vlad_i_mir"></link><title>Telegram-бота с нуля </title><published>2025-03-03T22:38:52.131Z</published><updated>2025-03-03T22:38:52.131Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c9/ed/c9ed42bd-faa0-4c9d-9cd6-3b846774ae51.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/2d/d6/2dd65dbb-2167-446b-a922-792558a5a2fd.jpeg&quot;&gt;Название: Telegram-бот, созданный для помощи пользователям в регистрации команд на турниры. Бот взаимодействует с пользователями через диалог, собирая данные о команде (дисциплина, название команды, ФИО капитана, контактный номер, дата рождения, город, организация, информация о дополнительных игроках и комментарий), и записывает их в Google Sheets. Бот также поддерживает беседу на тему спорта, используя OpenAI API (gpt-4o) для генерации ответов. Промт для беседы загружается из Google Sheets.</summary><content type="html">
  &lt;h2 id=&quot;m3sm&quot;&gt;1. Описание бота&lt;/h2&gt;
  &lt;p id=&quot;ok1G&quot;&gt;&lt;strong&gt;Название&lt;/strong&gt;: PhygitalSportBot&lt;br /&gt; &lt;strong&gt;Описание&lt;/strong&gt;:&lt;br /&gt; PhygitalSportBot — это Telegram-бот, созданный для помощи пользователям в регистрации команд на турниры по фиджитал-спорту. Бот взаимодействует с пользователями через диалог, собирая данные о команде (дисциплина, название команды, ФИО капитана, контактный номер, дата рождения, город, организация, информация о дополнительных игроках и комментарий), и записывает их в Google Sheets. Бот также поддерживает беседу на тему фиджитал-спорта, используя OpenAI API (&lt;code&gt;&lt;strong&gt;gpt-4o&lt;/strong&gt;&lt;/code&gt;) для генерации ответов. Промт для беседы загружается из Google Sheets.&lt;/p&gt;
  &lt;h2 id=&quot;XX5R&quot;&gt;2. Описание функционала&lt;/h2&gt;
  &lt;ul id=&quot;MiBM&quot;&gt;
    &lt;li id=&quot;EsFV&quot;&gt;&lt;strong&gt;Приветствие&lt;/strong&gt;: Бот начинает диалог с приветственного сообщения и предлагает зарегистрировать команду.&lt;/li&gt;
    &lt;li id=&quot;9j1D&quot;&gt;&lt;strong&gt;Регистрация команды&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;CfNQ&quot;&gt;
      &lt;li id=&quot;rRSD&quot;&gt;Запрашивает название дисциплины (например, Фиджитал-Футбол) и подтверждает выбор.&lt;/li&gt;
      &lt;li id=&quot;erK5&quot;&gt;Запрашивает название команды и подтверждает.&lt;/li&gt;
      &lt;li id=&quot;Quoq&quot;&gt;Запрашивает ФИО капитана, контактный номер, дату рождения, город, организацию — с подтверждением на каждом шаге.&lt;/li&gt;
      &lt;li id=&quot;7skN&quot;&gt;Запрашивает информацию о дополнительных игроках (опционально).&lt;/li&gt;
      &lt;li id=&quot;sdK3&quot;&gt;Запрашивает комментарий (опционально).&lt;/li&gt;
      &lt;li id=&quot;XRVs&quot;&gt;Записывает данные в Google Sheets.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;1GQs&quot;&gt;&lt;strong&gt;Беседа&lt;/strong&gt;: Если пользователь не хочет регистрироваться, бот продолжает беседу на тему фиджитал-спорта, используя OpenAI API (&lt;strong&gt;gpt-4o&lt;/strong&gt;) и промт из Google Sheets.&lt;/li&gt;
    &lt;li id=&quot;7B12&quot;&gt;&lt;strong&gt;Проверка статуса&lt;/strong&gt;: Команда &lt;strong&gt;/status &amp;lt;название_команды&amp;gt;&lt;/strong&gt; позволяет проверить, зарегистрирована ли команда.&lt;/li&gt;
    &lt;li id=&quot;vnUb&quot;&gt;&lt;strong&gt;Отмена&lt;/strong&gt;: Команда &lt;strong&gt;/cancel &lt;/strong&gt;позволяет отменить регистрацию и вернуться к беседе.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xLwY&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;0Tzt&quot;&gt;3. Требования к серверу&lt;/h2&gt;
  &lt;ul id=&quot;UkAR&quot;&gt;
    &lt;li id=&quot;c73f&quot;&gt;&lt;strong&gt;Операционная система&lt;/strong&gt;: Ubuntu 20.04 или выше (рекомендуется Ubuntu 22.04).&lt;/li&gt;
    &lt;li id=&quot;Js9i&quot;&gt;&lt;strong&gt;Процессор&lt;/strong&gt;: Минимум 1 ядро.&lt;/li&gt;
    &lt;li id=&quot;Jj0W&quot;&gt;&lt;strong&gt;Оперативная память&lt;/strong&gt;: Минимум 2 ГБ (рекомендуется 4 ГБ).&lt;/li&gt;
    &lt;li id=&quot;R4FQ&quot;&gt;&lt;strong&gt;Дисковое пространство&lt;/strong&gt;: Минимум 10 ГБ (для установки зависимостей и хранения логов).&lt;/li&gt;
    &lt;li id=&quot;zJFa&quot;&gt;&lt;strong&gt;Интернет&lt;/strong&gt;: Доступ к интернету с возможностью подключения к api.telegram.org и api.openai.com.&lt;/li&gt;
    &lt;li id=&quot;JCZS&quot;&gt;&lt;strong&gt;Порты&lt;/strong&gt;: Открытые исходящие порты 80 и 443 для HTTP/HTTPS-запросов.&lt;/li&gt;
    &lt;li id=&quot;bgum&quot;&gt;&lt;strong&gt;Локация сервера&lt;/strong&gt;: Сервер должен находиться в стране, поддерживаемой OpenAI (например, Германия, США). Если сервер в неподдерживаемой стране (например, Россия), потребуется VPN.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mHXx&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;TGyC&quot;&gt;4. Подготовка сервера&lt;/h2&gt;
  &lt;h4 id=&quot;RLye&quot;&gt;4.1. Обновление системы&lt;/h4&gt;
  &lt;p id=&quot;RhSu&quot;&gt;Обновите систему, чтобы установить последние пакеты и исправления безопасности.&lt;/p&gt;
  &lt;pre id=&quot;zIg3&quot; data-lang=&quot;python&quot;&gt;apt update &amp;amp;&amp;amp; apt upgrade -y&lt;/pre&gt;
  &lt;ul id=&quot;UAyd&quot;&gt;
    &lt;li id=&quot;dc1K&quot;&gt;&lt;strong&gt;apt update&lt;/strong&gt; — обновляет список доступных пакетов.&lt;/li&gt;
    &lt;li id=&quot;6m4T&quot;&gt;&lt;strong&gt;apt upgrade -y&lt;/strong&gt; — обновляет установленные пакеты, &lt;strong&gt;-y &lt;/strong&gt;автоматически подтверждает действия.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;A20W&quot;&gt;4.2. Установка необходимых пакетов&lt;/h4&gt;
  &lt;p id=&quot;K42f&quot;&gt;Установите базовые утилиты, Python и зависимости:&lt;/p&gt;
  &lt;pre id=&quot;qe9l&quot; data-lang=&quot;python&quot;&gt;apt install python3 python3-pip python3-venv nano curl git -y&lt;/pre&gt;
  &lt;ul id=&quot;v2tA&quot;&gt;
    &lt;li id=&quot;iIO2&quot;&gt;&lt;strong&gt;python3&lt;/strong&gt; — интерпретатор Python.&lt;/li&gt;
    &lt;li id=&quot;QXpK&quot;&gt;&lt;strong&gt;python3-pip&lt;/strong&gt; — менеджер пакетов для Python.&lt;/li&gt;
    &lt;li id=&quot;9ATR&quot;&gt;&lt;strong&gt;python3-venv&lt;/strong&gt; — для создания виртуального окружения.&lt;/li&gt;
    &lt;li id=&quot;zKJ6&quot;&gt;&lt;strong&gt;nano&lt;/strong&gt; — текстовый редактор для редактирования файлов.&lt;/li&gt;
    &lt;li id=&quot;cIm7&quot;&gt;&lt;strong&gt;curl &lt;/strong&gt;— для проверки подключения к API.&lt;/li&gt;
    &lt;li id=&quot;3rmT&quot;&gt;&lt;strong&gt;git&lt;/strong&gt; — для работы с репозиториями (опционально).&lt;/li&gt;
    &lt;li id=&quot;9lfM&quot;&gt;&lt;strong&gt;-y&lt;/strong&gt; — автоматически подтверждает установку.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;hjEF&quot;&gt;4.3. Создание рабочей директории&lt;/h4&gt;
  &lt;p id=&quot;lUmL&quot;&gt;Создайте директорию для бота:&lt;/p&gt;
  &lt;pre id=&quot;0LpA&quot; data-lang=&quot;python&quot;&gt;mkdir /root/bot_env 
cd /root/bot_env&lt;/pre&gt;
  &lt;ul id=&quot;i5iL&quot;&gt;
    &lt;li id=&quot;kS9A&quot;&gt;&lt;strong&gt;mkdir /root/bot_env&lt;/strong&gt; — создаёт директорию /root/bot_env.&lt;/li&gt;
    &lt;li id=&quot;usqM&quot;&gt;&lt;strong&gt;cd /root/bot_env&lt;/strong&gt; — переходит в созданную директорию.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;Ofed&quot;&gt;4.4. Создание и активация виртуального окружения&lt;/h4&gt;
  &lt;p id=&quot;GzFJ&quot;&gt;Создайте виртуальное окружение, чтобы изолировать зависимости бота:&lt;/p&gt;
  &lt;pre id=&quot;PM6c&quot; data-lang=&quot;python&quot;&gt;python3 -m venv /root/bot_env/venv 
source /root/bot_env/venv/bin/activate&lt;/pre&gt;
  &lt;ul id=&quot;Y1ND&quot;&gt;
    &lt;li id=&quot;sve9&quot;&gt;&lt;strong&gt;python3 -m venv /root/bot_env/venv&lt;/strong&gt; — создаёт виртуальное окружение в директории /root/bot_env/venv.&lt;/li&gt;
    &lt;li id=&quot;7j1E&quot;&gt;&lt;strong&gt;source /root/bot_env/venv/bin/activate &lt;/strong&gt;— активирует виртуальное окружение (вы увидите (venv) в начале строки терминала).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;ELou&quot;&gt;4.5. Установка Python-библиотек&lt;/h4&gt;
  &lt;p id=&quot;MxU7&quot;&gt;Установите все необходимые библиотеки для бота:&lt;/p&gt;
  &lt;pre id=&quot;tM8g&quot; data-lang=&quot;python&quot;&gt;pip install telegram python-telegram-bot openai gspread oauth2client tenacity&lt;/pre&gt;
  &lt;ul id=&quot;Crbb&quot;&gt;
    &lt;li id=&quot;xnGr&quot;&gt;&lt;strong&gt;telegram и python-telegram-bot&lt;/strong&gt; — для работы с Telegram API.&lt;/li&gt;
    &lt;li id=&quot;wUyA&quot;&gt;&lt;strong&gt;openai&lt;/strong&gt; — для работы с OpenAI API (&lt;strong&gt;gpt-4o&lt;/strong&gt;).&lt;/li&gt;
    &lt;li id=&quot;3dRC&quot;&gt;&lt;strong&gt;gspread&lt;/strong&gt; — для работы с Google Sheets.&lt;/li&gt;
    &lt;li id=&quot;XBek&quot;&gt;&lt;strong&gt;oauth2client&lt;/strong&gt; — для аутентификации в Google Sheets API.&lt;/li&gt;
    &lt;li id=&quot;gV7j&quot;&gt;&lt;strong&gt;tenacity&lt;/strong&gt; — для повторных попыток при записи в Google Sheets.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;A1dD&quot;&gt;Пример вывода установки:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;1sXI&quot;&gt;&lt;strong&gt;&lt;code&gt;Successfully installed telegram-0.0.1 python-telegram-bot-21.11.1 openai-1.65.2 &lt;br /&gt;gspread-6.2.0 oauth2client-4.1.3 tenacity-9.0.0&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;UMqj&quot;&gt;&lt;/h3&gt;
  &lt;h2 id=&quot;PlKX&quot;&gt;5. Подготовка API-ключей и доступов&lt;/h2&gt;
  &lt;h4 id=&quot;omrS&quot;&gt;5.1. Получение API-ключа OpenAI&lt;/h4&gt;
  &lt;ol id=&quot;m71e&quot;&gt;
    &lt;li id=&quot;wpzi&quot;&gt;&lt;strong&gt;Создайте учётную запись OpenAI&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;fHEt&quot;&gt;
      &lt;li id=&quot;rpa8&quot;&gt;Перейдите на &lt;strong&gt;https://platform.openai.com/.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;iQqo&quot;&gt;Зарегистрируйтесь или войдите в существующую учётную запись.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;OlCL&quot;&gt;&lt;strong&gt;Получите API-ключ&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;P7K6&quot;&gt;
      &lt;li id=&quot;AKpm&quot;&gt;Перейдите в раздел &lt;a href=&quot;https://platform.openai.com/account/api-keys&quot; target=&quot;_blank&quot;&gt;API Keys&lt;/a&gt;.&lt;/li&gt;
      &lt;li id=&quot;AcTr&quot;&gt;Нажмите &amp;quot;Create new secret key&amp;quot;, дайте ключу имя (например, &lt;strong&gt;PhygitalBotKey&lt;/strong&gt;).&lt;/li&gt;
      &lt;li id=&quot;IdtF&quot;&gt;Скопируйте ключ (например, &lt;strong&gt;sk-abc123...&lt;/strong&gt;). Сохраните его в безопасное место.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;hdkp&quot;&gt;&lt;strong&gt;Добавьте API-ключ в переменную окружения&lt;/strong&gt;: &lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;uk4z&quot;&gt;На сервере добавьте ключ в &lt;strong&gt;/etc/environment&lt;/strong&gt; для глобального доступа:&lt;/p&gt;
  &lt;pre id=&quot;RkWX&quot; data-lang=&quot;python&quot;&gt;nano /etc/environment&lt;/pre&gt;
  &lt;p id=&quot;qaGT&quot;&gt;Добавьте строку:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;2ksV&quot;&gt;&lt;code&gt;OPENAI_API_KEY=&amp;quot;sk-abc123...&amp;quot;&lt;/code&gt; &lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;KJQW&quot;&gt;Замените &lt;strong&gt;sk-abc123...&lt;/strong&gt; на ваш API-ключ.&lt;br /&gt; Сохраните файл (&lt;strong&gt;Ctrl + O, Enter, Ctrl + X&lt;/strong&gt;) и примените изменения:&lt;br /&gt;&lt;/p&gt;
  &lt;pre id=&quot;jWs1&quot; data-lang=&quot;python&quot;&gt;source /etc/environment&lt;/pre&gt;
  &lt;p id=&quot;HyXc&quot;&gt; Проверьте, что ключ доступен:&lt;/p&gt;
  &lt;pre id=&quot;145t&quot; data-lang=&quot;python&quot;&gt;echo $OPENAI_API_KEY &lt;/pre&gt;
  &lt;p id=&quot;JlL4&quot;&gt;Вывод должен быть вашим ключом: sk-abc123....&lt;/p&gt;
  &lt;h4 id=&quot;bnBB&quot;&gt;5.2. Получение токена Telegram&lt;/h4&gt;
  &lt;ol id=&quot;HhSv&quot;&gt;
    &lt;li id=&quot;OM8u&quot;&gt;&lt;strong&gt;Создайте бота в Telegram&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;jC7f&quot;&gt;
      &lt;li id=&quot;XtdM&quot;&gt;Откройте Telegram и найдите @BotFather.&lt;/li&gt;
      &lt;li id=&quot;pgu9&quot;&gt;Отправьте &lt;strong&gt;/start.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;n0La&quot;&gt;Отправьте &lt;strong&gt;/newbot.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;oWjE&quot;&gt;Следуйте инструкциям: задайте имя бота (например, &lt;strong&gt;PhygitalSportBot&lt;/strong&gt;) и username (например, &lt;strong&gt;@PhygitalSportBot&lt;/strong&gt;).&lt;/li&gt;
      &lt;li id=&quot;LlrE&quot;&gt;После создания бота вы получите токен, например: &lt;strong&gt;7717227973:AAGwsD0GetKrPtn-OuMyoV_uBMRIZXdiS7U.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;ASoA&quot;&gt;Скопируйте токен и сохраните его в безопасное место.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;h4 id=&quot;bvUw&quot;&gt;5.3. Настройка доступа к Google Sheets&lt;/h4&gt;
  &lt;ol id=&quot;C98w&quot;&gt;
    &lt;li id=&quot;erEO&quot;&gt;&lt;strong&gt;Создайте файл &lt;em&gt;credentials.json&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;u&gt;:&lt;/u&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;ul id=&quot;my9X&quot;&gt;
      &lt;li id=&quot;WchR&quot;&gt;Перейдите в Google Cloud Console: &lt;strong&gt;https://console.cloud.google.com.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;LjRd&quot;&gt;Создайте новый проект (например, &lt;strong&gt;PhygitalBot&lt;/strong&gt;).&lt;/li&gt;
      &lt;li id=&quot;zbhd&quot;&gt;Включите API:&lt;/li&gt;
      &lt;ul id=&quot;TzzS&quot;&gt;
        &lt;li id=&quot;dBkt&quot;&gt;В разделе &amp;quot;APIs &amp;amp; Services&amp;quot; → &amp;quot;Library&amp;quot; найдите и включите &lt;strong&gt;Google Sheets API&lt;/strong&gt; и &lt;strong&gt;Google Drive API&lt;/strong&gt;.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;8nip&quot;&gt;Создайте Service Account:&lt;/li&gt;
      &lt;ul id=&quot;XPdV&quot;&gt;
        &lt;li id=&quot;7XYe&quot;&gt;Перейдите в &amp;quot;IAM &amp;amp; Admin&amp;quot; → &amp;quot;Service Accounts&amp;quot;.&lt;/li&gt;
        &lt;li id=&quot;fyID&quot;&gt;Нажмите &amp;quot;Create Service Account&amp;quot;.&lt;/li&gt;
        &lt;li id=&quot;KKMc&quot;&gt;Укажите имя (например, &lt;strong&gt;phygital-bot-service-account&lt;/strong&gt;), нажмите &amp;quot;Create and Continue&amp;quot;, пропустите шаг с ролями, нажмите &amp;quot;Done&amp;quot;.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;mW4g&quot;&gt;Создайте ключ:&lt;/li&gt;
      &lt;ul id=&quot;Zb4d&quot;&gt;
        &lt;li id=&quot;gBr2&quot;&gt;В списке Service Accounts выберите созданный аккаунт, перейдите на вкладку &amp;quot;Keys&amp;quot;.&lt;/li&gt;
        &lt;li id=&quot;4nS1&quot;&gt;Нажмите &amp;quot;Add Key&amp;quot; → &amp;quot;Create New Key&amp;quot;, выберите &amp;quot;JSON&amp;quot;, нажмите &amp;quot;Create&amp;quot;.&lt;/li&gt;
        &lt;li id=&quot;iZXd&quot;&gt;Файл &lt;strong&gt;phygital-bot-XXXXX-XXXXXXXXXXXX.json&lt;/strong&gt; скачается на ваш компьютер.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Ew3A&quot;&gt;&lt;strong&gt;Перенесите credentials.json на сервер&lt;/strong&gt;: Создайте директорию для файла:&lt;br /&gt; &lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;Tbkl&quot; data-lang=&quot;python&quot;&gt;mkdir -p /root/bot_env/credentials&lt;/pre&gt;
  &lt;p id=&quot;Yqe8&quot;&gt; Скопируйте файл на сервер:&lt;br /&gt;&lt;/p&gt;
  &lt;pre id=&quot;ISzk&quot; data-lang=&quot;python&quot;&gt;scp /path/to/phygital-bot-XXXXX-XXXXXXXXXXXX.json root@your-server-ip:/root/bot_env/credentials/credentials.json &lt;/pre&gt;
  &lt;p id=&quot;FPSN&quot;&gt;Замените&lt;strong&gt; /path/to/phygital-bot-XXXXX-XXXXXXXXXXXX.json&lt;/strong&gt; на путь к файлу на вашем компьютере и &lt;strong&gt;your-server-ip&lt;/strong&gt; на IP-адрес сервера.&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;TSCB&quot;&gt;Проверьте, что файл на месте:&lt;/p&gt;
  &lt;pre id=&quot;l20F&quot; data-lang=&quot;python&quot;&gt;ls -l /root/bot_env/credentials/credentials.json&lt;/pre&gt;
  &lt;p id=&quot;nfJc&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;W2bS&quot;&gt;
    &lt;li id=&quot;Bsx6&quot;&gt;&lt;strong&gt;Дайте доступ к Google Sheet&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;oSFD&quot;&gt;
      &lt;li id=&quot;pxDt&quot;&gt;Откройте Google Sheet: &lt;strong&gt;https://docs.google.com/spreadsheets/d/1whGZ1RefscCSiVNnVUGaXWiISnXa59EhXqxwmTXG3Vo/edit.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;BbJG&quot;&gt;Нажмите &amp;quot;Share&amp;quot; и добавьте &lt;strong&gt;client_email&lt;/strong&gt; из &lt;strong&gt;credentials.json&lt;/strong&gt; (например, &lt;strong&gt;phygital-bot-service-account@your-project-id.iam.gserviceaccount.com&lt;/strong&gt;) с правами &amp;quot;Editor&amp;quot;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ywvI&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;kKFF&quot;&gt;6. Пошаговая инструкция установки&lt;/h2&gt;
  &lt;h4 id=&quot;c1X0&quot;&gt;6.1. Создание файла bot.py&lt;/h4&gt;
  &lt;p id=&quot;yRKJ&quot;&gt;Создайте файл bot.py:&lt;/p&gt;
  &lt;pre id=&quot;IIE2&quot; data-lang=&quot;python&quot;&gt;nano /root/bot_env/bot.py&lt;/pre&gt;
  &lt;p id=&quot;zxcO&quot;&gt;Вставьте следующий код:&lt;/p&gt;
  &lt;pre id=&quot;n0t1&quot; data-lang=&quot;python&quot;&gt;import telegram
from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Application, CommandHandler, MessageHandler, ContextTypes, ConversationHandler
from telegram.ext import filters
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import logging
from openai import AsyncOpenAI
from datetime import datetime
import re
from tenacity import retry, stop_after_attempt, wait_fixed
import os

# Настройка логирования
logging.basicConfig(filename=&amp;#x27;/root/bot_env/bot.log&amp;#x27;, level=logging.INFO, 
                    format=&amp;#x27;%(asctime)s - %(levelname)s - %(message)s&amp;#x27;)

# Токен бота
TOKEN = &amp;#x27;7717227973:AAGwsD0GetKrPtn-OuMyoV_uBMRIZXdiS7U&amp;#x27;  # Замените на ваш токен Telegram

# API-ключ OpenAI из переменной окружения
OPENAI_API_KEY = os.getenv(&amp;#x27;OPENAI_API_KEY&amp;#x27;)

# Инициализация асинхронного клиента OpenAI
client = AsyncOpenAI(api_key=OPENAI_API_KEY)

# Настройка Google Sheets
scope = [&amp;#x27;https://spreadsheets.google.com/feeds&amp;#x27;, &amp;#x27;https://www.googleapis.com/auth/drive&amp;#x27;]
creds = ServiceAccountCredentials.from_json_keyfile_name(&amp;#x27;/root/bot_env/credentials/credentials.json&amp;#x27;, scope)
client_gspread = gspread.authorize(creds)
sheet = client_gspread.open_by_key(&amp;#x27;1whGZ1RefscCSiVNnVUGaXWiISnXa59EhXqxwmTXG3Vo&amp;#x27;)
prompt_sheet = sheet.worksheet(&amp;#x27;promt&amp;#x27;)
registration_sheet = sheet.worksheet(&amp;#x27;registration&amp;#x27;)

# Кэшируем данные из Google Sheets при запуске
PROMPT_CONTEXT = &amp;quot;\n&amp;quot;.join(prompt_sheet.col_values(1)[1:]) if len(prompt_sheet.col_values(1)) &amp;gt; 1 else &amp;quot;Нет данных для контекста&amp;quot;
logging.info(f&amp;quot;Loaded PROMPT_CONTEXT: {PROMPT_CONTEXT}&amp;quot;)
EXISTING_TEAMS = set(registration_sheet.col_values(3)[1:])  # Кэшируем названия команд

# Кэш для ответов ChatGPT
CHATGPT_RESPONSE_CACHE = {}

# Асинхронная функция для запросов к ChatGPT
async def get_chatgpt_response(prompt):
    # Проверяем, есть ли ответ в кэше
    if prompt in CHATGPT_RESPONSE_CACHE:
        return CHATGPT_RESPONSE_CACHE[prompt]

    try:
        response = await client.chat.completions.create(
            model=&amp;quot;gpt-4o&amp;quot;,
            messages=[
                {&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Ты виртуальный помощник по фиджитал-спорту. Будь дружелюбным и энергичным!&amp;quot;},
                {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: prompt}
            ],
            temperature=0.7,
            max_tokens=500
        )
        answer = response.choices[0].message.content.strip()
        # Сохраняем в кэш
        CHATGPT_RESPONSE_CACHE[prompt] = answer
        return answer
    except Exception as e:
        logging.error(f&amp;quot;Ошибка при запросе к ChatGPT: {str(e)}&amp;quot;)
        return &amp;quot;Извините, произошла ошибка при получении ответа от ИИ.&amp;quot;

# Состояния для ConversationHandler
CHAT, DISCIPLINE, DISCIPLINE_CONFIRM, TEAM_NAME, TEAM_NAME_CONFIRM, FULL_NAME, FULL_NAME_CONFIRM, PHONE, PHONE_CONFIRM, BIRTH_DATE, BIRTH_DATE_CONFIRM, CITY, CITY_CONFIRM, ORGANIZATION, ORGANIZATION_CONFIRM, ADD_PLAYER, COMMENT = range(17)

# Обработчик текстовых сообщений (без команды /talk)
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; None:
    user_message = update.message.text.strip().lower()
    if not user_message:
        await update.message.reply_text(&amp;quot;Пожалуйста, напиши свой вопрос или сообщение.&amp;quot;)
        return

    # Если пользователь в состоянии CHAT, продолжаем беседу
    if context.user_data.get(&amp;#x27;state&amp;#x27;) == &amp;#x27;CHAT&amp;#x27;:
        prompt = f&amp;quot;Опираясь на следующий контекст:\n{PROMPT_CONTEXT}\nПродолжи беседу на тему фиджитал-спорта. Пользователь написал: {user_message}&amp;quot;
        response = await get_chatgpt_response(prompt)
        await update.message.reply_text(response)
        return

    # Проверяем, не хочет ли пользователь зарегистрироваться
    if &amp;quot;регистр&amp;quot; in user_message or &amp;quot;записаться&amp;quot; in user_message:
        context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;REGISTRATION&amp;#x27;
        await update.message.reply_text(
            &amp;quot;Отлично! Давай зарегистрируем твою команду. Сначала укажи название дисциплины (например, Фиджитал-Футбол).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return DISCIPLINE

    # Обрабатываем обычные сообщения через ChatGPT
    prompt = f&amp;quot;Опираясь на следующий контекст:\n{PROMPT_CONTEXT}\nОтветь на вопрос: {user_message}&amp;quot;
    response = await get_chatgpt_response(prompt)
    await update.message.reply_text(response)

# Команда /start для начала диалога
async def start_registration(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    logging.info(&amp;quot;Received /start command&amp;quot;)
    context.user_data.clear()  # Очищаем старые данные
    context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;CHAT&amp;#x27;  # Устанавливаем состояние CHAT
    context.user_data[&amp;#x27;registration&amp;#x27;] = {}
    context.user_data[&amp;#x27;players&amp;#x27;] = []  # Список для хранения игроков

    # Приветствие (без обращения к ChatGPT для скорости)
    await update.message.reply_text(&amp;quot;Привет! Я твой помощник по фиджитал-спорту! 🏅 Фиджитал-спорт — это крутое сочетание физической активности и цифровых технологий. &amp;quot;
                                    &amp;quot;Давай поговорим об этом! Знаешь, какие дисциплины есть в фиджитал-спорте? Например, фиджитал-футбол или фиджитал-гонки!&amp;quot;)

    # Предложение регистрации
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        &amp;quot;Кстати, хочешь зарегистрировать свою команду на турнир? (да/нет)&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return CHAT

# Обработчик состояния CHAT
async def chat_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    user_message = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received message in CHAT state: {user_message}&amp;quot;)

    if user_message in [&amp;#x27;да&amp;#x27;, &amp;#x27;yes&amp;#x27;, &amp;#x27;y&amp;#x27;]:
        logging.info(&amp;quot;User agreed to registration, moving to DISCIPLINE state&amp;quot;)
        context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;REGISTRATION&amp;#x27;
        await update.message.reply_text(
            &amp;quot;Отлично! Давай зарегистрируем твою команду. Сначала укажи название дисциплины (например, Фиджитал-Футбол).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return DISCIPLINE
    elif user_message in [&amp;#x27;нет&amp;#x27;, &amp;#x27;no&amp;#x27;, &amp;#x27;n&amp;#x27;]:
        await update.message.reply_text(
            &amp;quot;Хорошо, давай продолжим говорить о фиджитал-спорте! Что ты думаешь о сочетании физической активности и цифровых технологий?&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;CHAT&amp;#x27;
        return CHAT
    else:
        # Продолжаем беседу
        prompt = f&amp;quot;Опираясь на следующий контекст:\n{PROMPT_CONTEXT}\nПродолжи беседу на тему фиджитал-спорта. Пользователь написал: {user_message}&amp;quot;
        response = await get_chatgpt_response(prompt)
        await update.message.reply_text(response)

        # Повторно предлагаем регистрацию
        reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
        await update.message.reply_text(
            &amp;quot;Кстати, хочешь зарегистрировать свою команду? (да/нет)&amp;quot;,
            reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
        )
        return CHAT

# Обработчик названия дисциплины
async def discipline(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    discipline = update.message.text.strip().capitalize()
    logging.info(f&amp;quot;Received discipline: {discipline}&amp;quot;)
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;discipline&amp;#x27;] = discipline
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;Дисциплина: {discipline}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return DISCIPLINE_CONFIRM

async def discipline_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in DISCIPLINE_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Отлично! Теперь укажи название команды (например, Молния).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return TEAM_NAME
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи название дисциплины (например, Фиджитал-Футбол).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return DISCIPLINE
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return DISCIPLINE_CONFIRM

# Обработчик названия команды
async def team_name(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    team_name = update.message.text.strip().capitalize()
    logging.info(f&amp;quot;Received team name: {team_name}&amp;quot;)
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;team_name&amp;#x27;] = team_name
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;Команда: {team_name}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return TEAM_NAME_CONFIRM

async def team_name_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in TEAM_NAME_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Супер! Теперь укажи ФИО капитана (например, Иванов Иван Иванович).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return FULL_NAME
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи название команды (например, Молния).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return TEAM_NAME
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return TEAM_NAME_CONFIRM

# Обработчик ФИО
async def full_name(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    full_name = update.message.text.strip()
    name_parts = full_name.split()
    logging.info(f&amp;quot;Received full name: {full_name}&amp;quot;)
    if len(name_parts) != 3:
        await update.message.reply_text(&amp;quot;Пожалуйста, укажи полное ФИО (Имя Фамилия Отчество, например, Иванов Иван Иванович).&amp;quot;)
        return FULL_NAME
    formatted_name = &amp;quot; &amp;quot;.join(part.capitalize() for part in name_parts)
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;full_name&amp;#x27;] = formatted_name
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;ФИО капитана: {formatted_name}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return FULL_NAME_CONFIRM

async def full_name_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in FULL_NAME_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Отлично! Теперь укажи контактный телефон (например, 5555555). Формат будет преобразован в 555-55-55.&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return PHONE
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи ФИО заново (например, Иванов Иван Иванович).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return FULL_NAME
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return FULL_NAME_CONFIRM

# Обработчик телефона
async def phone(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    phone = update.message.text.strip()
    phone = re.sub(r&amp;#x27;\D&amp;#x27;, &amp;#x27;&amp;#x27;, phone)
    logging.info(f&amp;quot;Received phone: {phone}&amp;quot;)
    if len(phone) != 7:
        await update.message.reply_text(&amp;quot;Пожалуйста, укажи 7 цифр для номера телефона (например, 5555555). Формат будет преобразован в 555-55-55.&amp;quot;)
        return PHONE
    formatted_phone = f&amp;quot;{phone[:3]}-{phone[3:5]}-{phone[5:7]}&amp;quot;
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;phone&amp;#x27;] = formatted_phone
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;Телефон: {formatted_phone}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return PHONE_CONFIRM

async def phone_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in PHONE_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Спасибо! Теперь укажи дату рождения капитана (в формате дд.мм.гг, например, 01.01.00). &amp;quot;
            &amp;quot;Можно также вводить в формате дд,мм,гг (например, 01,01,00) или ддммгггг (например, 01012000).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return BIRTH_DATE
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи контактный телефон заново (например, 5555555).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return PHONE
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return PHONE_CONFIRM

# Обработчик даты рождения
async def birth_date(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    birth_date = update.message.text.strip()
    logging.info(f&amp;quot;Received birth date: {birth_date}&amp;quot;)
    if re.match(r&amp;#x27;^\d{2},\d{2},\d{2}$&amp;#x27;, birth_date):
        birth_date = birth_date.replace(&amp;#x27;,&amp;#x27;, &amp;#x27;.&amp;#x27;)
    elif re.match(r&amp;#x27;^\d{8}$&amp;#x27;, birth_date):
        birth_date = f&amp;quot;{birth_date[:2]}.{birth_date[2:4]}.{birth_date[4:6]}&amp;quot;
    elif not re.match(r&amp;#x27;^\d{2}\.\d{2}\.\d{2}$&amp;#x27;, birth_date):
        await update.message.reply_text(&amp;quot;Пожалуйста, укажи дату рождения в формате дд.мм.гг (например, 01.01.00). &amp;quot;
                                        &amp;quot;Можно также вводить в формате дд,мм,гг (например, 01,01,00) или ддммгггг (например, 01012000).&amp;quot;)
        return BIRTH_DATE

    try:
        birth_date_obj = datetime.strptime(birth_date, &amp;#x27;%d.%m.%y&amp;#x27;)
        today = datetime.now()
        age = today.year - birth_date_obj.year - ((today.month, today.day) &amp;lt; (birth_date_obj.month, birth_date_obj.day))
        context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;birth_date&amp;#x27;] = birth_date
        context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;age&amp;#x27;] = age
        reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
        await update.message.reply_text(
            f&amp;quot;Дата рождения: {birth_date}, возраст: {age} лет. Всё верно?&amp;quot;,
            reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
        )
    except ValueError:
        await update.message.reply_text(&amp;quot;Неверный формат даты. Укажи дату в формате дд.мм.гг (например, 01.01.00).&amp;quot;)
        return BIRTH_DATE
    return BIRTH_DATE_CONFIRM

async def birth_date_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in BIRTH_DATE_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Спасибо! Теперь укажи город проживания (например, Москва).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return CITY
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи дату рождения заново (в формате дд.мм.гг, например, 01.01.00).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return BIRTH_DATE
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return BIRTH_DATE_CONFIRM

# Обработчик города
async def city(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    city = update.message.text.strip().capitalize()
    logging.info(f&amp;quot;Received city: {city}&amp;quot;)
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;city&amp;#x27;] = city
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;Город: {city}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return CITY_CONFIRM

async def city_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in CITY_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Укажи организацию (цех) или учебное заведение, которое вы представляете (например, Цех №5 или МГУ).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return ORGANIZATION
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи город проживания заново (например, Москва).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return CITY
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return CITY_CONFIRM

# Обработчик организации
async def organization(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    organization = update.message.text.strip()
    logging.info(f&amp;quot;Received organization: {organization}&amp;quot;)
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;organization&amp;#x27;] = organization
    reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
    await update.message.reply_text(
        f&amp;quot;Организация: {organization}. Всё верно?&amp;quot;,
        reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    )
    return ORGANIZATION_CONFIRM

async def organization_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in ORGANIZATION_CONFIRM state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Хочешь добавить других игроков в команду? (да/нет)&amp;quot;,
            reply_markup=ReplyKeyboardMarkup([[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]], one_time_keyboard=True)
        )
        return ADD_PLAYER
    elif response == &amp;#x27;нет&amp;#x27;:
        await update.message.reply_text(
            &amp;quot;Давай исправим. Укажи организацию заново (например, Цех №5 или МГУ).&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return ORGANIZATION
    else:
        await update.message.reply_text(&amp;quot;Пожалуйста, выбери &amp;#x27;да&amp;#x27; или &amp;#x27;нет&amp;#x27;.&amp;quot;)
        return ORGANIZATION_CONFIRM

# Обработчик добавления игроков
async def add_player(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    response = update.message.text.strip().lower()
    logging.info(f&amp;quot;Received response in ADD_PLAYER state: {response}&amp;quot;)
    if response == &amp;#x27;да&amp;#x27;:
        await update.message.reply_text(&amp;quot;Укажи ФИО и дату рождения игрока (например, Петров Петр Петрович 02.02.02).&amp;quot;)
        return ADD_PLAYER
    elif response == &amp;#x27;нет&amp;#x27;:
        players = context.user_data.get(&amp;#x27;players&amp;#x27;, [])
        await update.message.reply_text(
            &amp;quot;Хочешь добавить комментарий? (Если нет, напиши &amp;#x27;нет&amp;#x27;). Максимальная длина — 500 символов.&amp;quot;,
            reply_markup=ReplyKeyboardRemove()
        )
        return COMMENT
    else:
        player_data = update.message.text.strip()
        context.user_data[&amp;#x27;players&amp;#x27;].append(player_data)
        reply_keyboard = [[&amp;#x27;да&amp;#x27;, &amp;#x27;нет&amp;#x27;]]
        await update.message.reply_text(
            f&amp;quot;Игрок добавлен: {player_data}. Хочешь добавить ещё одного игрока?&amp;quot;,
            reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
        )
        return ADD_PLAYER

# Обработчик комментария
async def comment(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    comment = update.message.text.strip()
    logging.info(f&amp;quot;Received comment: {comment}&amp;quot;)
    if comment.lower() == &amp;#x27;нет&amp;#x27;:
        comment = &amp;#x27;&amp;#x27;
    elif len(comment) &amp;gt; 500:
        await update.message.reply_text(&amp;quot;Комментарий слишком длинный! Пожалуйста, укороти его до 500 символов.&amp;quot;)
        return COMMENT
    context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;comment&amp;#x27;] = comment

    # Проверка на дублирование команды (используем кэш)
    team_name = context.user_data[&amp;#x27;registration&amp;#x27;][&amp;#x27;team_name&amp;#x27;]
    if team_name in EXISTING_TEAMS:
        await update.message.reply_text(f&amp;quot;Команда &amp;#x27;{team_name}&amp;#x27; уже зарегистрирована! Если это другая команда, укажи другое название. Напиши новое название команды.&amp;quot;)
        return TEAM_NAME

    # Собираем данные для записи
    registration_data = context.user_data[&amp;#x27;registration&amp;#x27;]
    players = context.user_data.get(&amp;#x27;players&amp;#x27;, [])
    date_registered = datetime.now().strftime(&amp;quot;%H:%M %d.%m.%y&amp;quot;)
    row = [
        date_registered,
        registration_data[&amp;#x27;discipline&amp;#x27;],
        registration_data[&amp;#x27;team_name&amp;#x27;],
        registration_data[&amp;#x27;full_name&amp;#x27;],
        registration_data[&amp;#x27;phone&amp;#x27;],
        f&amp;quot;{registration_data[&amp;#x27;birth_date&amp;#x27;]} ({registration_data[&amp;#x27;age&amp;#x27;]})&amp;quot;,
        registration_data[&amp;#x27;city&amp;#x27;],
        registration_data[&amp;#x27;organization&amp;#x27;],
        f&amp;quot;{comment}; Игроки: {&amp;#x27;; &amp;#x27;.join(players) if players else &amp;#x27;&amp;#x27;}&amp;quot;  # Добавляем игроков в комментарий
    ]

    # Записываем данные в Google Sheets с повторными попытками
    @retry(stop=stop_after_attempt(3), wait=wait_fixed(2))
    def append_to_sheet(row):
        registration_sheet.append_row(row)

    try:
        append_to_sheet(row)
        EXISTING_TEAMS.add(team_name)  # Обновляем кэш
        await update.message.reply_text(&amp;quot;Регистрация завершена! 🎉 Данные вашей команды записаны. Что ещё могу сделать для тебя? &amp;quot;
                                        &amp;quot;Давай продолжим говорить о фиджитал-спорте! Как думаешь, какая дисциплина самая интересная?&amp;quot;)
        context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;CHAT&amp;#x27;  # Переходим в режим беседы
        return CHAT
    except Exception as e:
        logging.error(f&amp;quot;Ошибка при записи в Google Sheets: {str(e)}&amp;quot;)
        await update.message.reply_text(&amp;quot;Произошла ошибка при записи данных. Пожалуйста, попробуй снова позже.&amp;quot;)
        return ConversationHandler.END

# Обработчик отмены
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; int:
    await update.message.reply_text(&amp;quot;Регистрация отменена. Давай продолжим говорить о фиджитал-спорте! &amp;quot;
                                    &amp;quot;Какие у тебя планы на предстоящий турнир?&amp;quot;)
    context.user_data[&amp;#x27;state&amp;#x27;] = &amp;#x27;CHAT&amp;#x27;
    return CHAT

# Команда /status для проверки статуса регистрации
async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -&amp;gt; None:
    if not context.args:
        await update.message.reply_text(&amp;quot;Пожалуйста, укажи название команды после команды /status, например: /status Молния&amp;quot;)
        return

    team_name = &amp;quot; &amp;quot;.join(context.args).capitalize()
    try:
        all_rows = registration_sheet.get_all_values()
        found = False
        for row in all_rows[1:]:  # Пропускаем заголовок
            if row[2] == team_name:  # Колонка 3 - название команды
                await update.message.reply_text(
                    f&amp;quot;Команда &amp;#x27;{team_name}&amp;#x27; зарегистрирована!\n&amp;quot;
                    f&amp;quot;Дисциплина: {row[1]}\n&amp;quot;
                    f&amp;quot;Капитан: {row[3]}\n&amp;quot;
                    f&amp;quot;Телефон: {row[4]}\n&amp;quot;
                    f&amp;quot;Дата рождения: {row[5]}\n&amp;quot;
                    f&amp;quot;Город: {row[6]}\n&amp;quot;
                    f&amp;quot;Организация: {row[7]}\n&amp;quot;
                    f&amp;quot;Комментарий: {row[8]}&amp;quot;
                )
                found = True
                break
        if not found:
            await update.message.reply_text(f&amp;quot;Команда &amp;#x27;{team_name}&amp;#x27; не найдена. Зарегистрируй её с помощью /start!&amp;quot;)
    except Exception as e:
        logging.error(f&amp;quot;Ошибка при проверке статуса: {str(e)}&amp;quot;)
        await update.message.reply_text(&amp;quot;Произошла ошибка при проверке статуса. Попробуй снова позже.&amp;quot;)

# Основная функция для запуска бота
def main() -&amp;gt; None:
    logging.info(&amp;quot;Starting bot...&amp;quot;)
    application = Application.builder().token(TOKEN).build()

    # Добавляем ConversationHandler для регистрации
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler(&amp;#x27;start&amp;#x27;, start_registration)],
        states={
            CHAT: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, chat_handler)],
            DISCIPLINE: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, discipline)],
            DISCIPLINE_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, discipline_confirm)],
            TEAM_NAME: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, team_name)],
            TEAM_NAME_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, team_name_confirm&amp;#x27;)],
            FULL_NAME: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, full_name)],
            FULL_NAME_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, full_name_confirm)],
            PHONE: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, phone)],
            PHONE_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, phone_confirm)],
            BIRTH_DATE: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, birth_date)],
            BIRTH_DATE_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, birth_date_confirm)],
            CITY: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, city)],
            CITY_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, city_confirm)],
            ORGANIZATION: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, organization)],
            ORGANIZATION_CONFIRM: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, organization_confirm)],
            ADD_PLAYER: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, add_player)],
            COMMENT: [MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, comment)],
        },
        fallbacks=[CommandHandler(&amp;#x27;cancel&amp;#x27;, cancel)]
    )

    application.add_handler(conv_handler)
    application.add_handler(CommandHandler(&amp;#x27;status&amp;#x27;, status))
    application.add_handler(MessageHandler(filters.TEXT &amp;amp; ~filters.COMMAND, handle_text))
    application.run_polling()

if __name__ == &amp;#x27;__main__&amp;#x27;:
    main()&lt;/pre&gt;
  &lt;p id=&quot;zpnt&quot;&gt;Сохраните файл (&lt;strong&gt;Ctrl + O, Enter, Ctrl + X&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;DyzQ&quot;&gt;&lt;/p&gt;
  &lt;h4 id=&quot;281p&quot;&gt;6.2. Настройка автозапуска&lt;/h4&gt;
  &lt;p id=&quot;ea7N&quot;&gt;Чтобы бот запускался автоматически после перезагрузки сервера:&lt;/p&gt;
  &lt;pre id=&quot;sLA4&quot; data-lang=&quot;python&quot;&gt;crontab -e&lt;/pre&gt;
  &lt;p id=&quot;ERub&quot;&gt;Выберите редактор (например, &lt;strong&gt;1&lt;/strong&gt; для &lt;strong&gt;nano&lt;/strong&gt;), затем добавьте:&lt;/p&gt;
  &lt;pre id=&quot;Dzzy&quot; data-lang=&quot;python&quot;&gt;@reboot /bin/bash -c &amp;quot;source /root/bot_env/venv/bin/activate &amp;amp;&amp;amp; nohup /root/bot_env/venv/bin/python3 /root/bot_env/bot.py &amp;amp;&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;iuzc&quot;&gt;Сохраните (&lt;strong&gt;Ctrl + O, Enter, Ctrl + X&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;OnjX&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;hR6m&quot;&gt;7. Процедуры запуска бота&lt;/h2&gt;
  &lt;h4 id=&quot;Rylo&quot;&gt;7.1. Первый запуск&lt;/h4&gt;
  &lt;p id=&quot;lfd3&quot;&gt;Запустите бота вручную для проверки:&lt;/p&gt;
  &lt;pre id=&quot;3BM2&quot; data-lang=&quot;python&quot;&gt;source /root/bot_env/venv/bin/activate 
cd /root/bot_env 
nohup /root/bot_env/venv/bin/python3 bot.py &amp;amp;&lt;/pre&gt;
  &lt;ul id=&quot;r91j&quot;&gt;
    &lt;li id=&quot;Zn8L&quot;&gt;&lt;strong&gt;source /root/bot_env/venv/bin/activate&lt;/strong&gt; — активирует виртуальное окружение.&lt;/li&gt;
    &lt;li id=&quot;6X66&quot;&gt;&lt;strong&gt;cd /root/bot_env&lt;/strong&gt; — переходит в директорию бота.&lt;/li&gt;
    &lt;li id=&quot;yHxs&quot;&gt;&lt;strong&gt;nohup /root/bot_env/venv/bin/python3 bot.py &amp;amp;&lt;/strong&gt; — запускает бота в фоновом режиме, игнорируя закрытие терминала.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;FLw5&quot;&gt;&lt;/p&gt;
  &lt;h4 id=&quot;zPAC&quot;&gt;7.2. Проверка логов&lt;/h4&gt;
  &lt;pre id=&quot;YQ5A&quot; data-lang=&quot;python&quot;&gt;tail -f /root/bot_env/bot.log&lt;/pre&gt;
  &lt;p id=&quot;oS6G&quot;&gt;Ожидаемый вывод:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;uK0k&quot;&gt;&lt;code&gt;2025-03-03 20:00:00,123 - INFO - Starting bot... 2025-03-03 20:00:00,456 - INFO - HTTP Request: POST https://api.telegram.org/bot7717227973:AAGwsD0GetKrPtn-OuMyoV_uBMRIZXdiS7U/getUpdates &amp;quot;HTTP/1.1 200 OK&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h4 id=&quot;t3nq&quot;&gt;&lt;/h4&gt;
  &lt;h3 id=&quot;uABY&quot;&gt;7.3. Проверка процесса&lt;/h3&gt;
  &lt;pre id=&quot;YaOz&quot; data-lang=&quot;python&quot;&gt;ps aux | grep python&lt;/pre&gt;
  &lt;p id=&quot;g3im&quot;&gt;Ожидаемый вывод:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;3vVO&quot;&gt;&lt;code&gt;root 12345 0.1 0.2 123456 7890 ? S 20:00 0:01 /root/bot_env/venv/bin/python3 bot.py&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;Fecp&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;K1Jk&quot;&gt;8. Процедуры внесения изменений в промт в Google Sheets&lt;/h2&gt;
  &lt;h4 id=&quot;4NGU&quot;&gt;8.1. Изменение промта&lt;/h4&gt;
  &lt;ol id=&quot;sWQI&quot;&gt;
    &lt;li id=&quot;RSIn&quot;&gt;Откройте Google Sheet: &lt;strong&gt;https://docs.google.com/spreadsheets/d/1whGZ1RefscCSiVNnVUGaXWiISnXa59EhXqxwmTXG3Vo/edit.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;hHkH&quot;&gt;Перейдите на лист promt.&lt;/li&gt;
    &lt;li id=&quot;gdN5&quot;&gt;Измените текст в первом столбце (A) — это промт, который бот использует для беседы.&lt;/li&gt;
    &lt;li id=&quot;F57s&quot;&gt;Сохраните изменения (Google Sheets делает это автоматически).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h4 id=&quot;7Jhg&quot;&gt;8.2. Полный рестарт бота&lt;/h4&gt;
  &lt;p id=&quot;M0UN&quot;&gt;Бот загружает промт при запуске, поэтому нужно перезапустить его:&lt;/p&gt;
  &lt;p id=&quot;jK8H&quot;&gt;&lt;strong&gt;Остановите текущий процесс&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;ofSm&quot; data-lang=&quot;python&quot;&gt;ps aux | grep python 
kill -9 &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;s06A&quot;&gt;&lt;strong&gt;Запустите бота заново&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;8M7Z&quot; data-lang=&quot;python&quot;&gt;source /root/bot_env/venv/bin/activate 
cd /root/bot_env 
nohup /root/bot_env/venv/bin/python3 bot.py &amp;amp;&lt;/pre&gt;
  &lt;h4 id=&quot;UZ3c&quot;&gt;8.3. Полный повторный запуск сервера&lt;/h4&gt;
  &lt;p id=&quot;nfD0&quot;&gt;Если вы хотите перезапустить сервер:&lt;/p&gt;
  &lt;p id=&quot;0g2V&quot;&gt;&lt;strong&gt;Остановите бота&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;0g2V&quot; data-lang=&quot;python&quot;&gt;ps aux | grep python kill -9 &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;voua&quot;&gt;&lt;strong&gt;Перезагрузите сервер&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;voua&quot; data-lang=&quot;python&quot;&gt;reboot&lt;/pre&gt;
  &lt;p id=&quot;Wz8S&quot;&gt;&lt;strong&gt;Проверьте, что бот запустился&lt;/strong&gt;: После перезагрузки подключитесь к серверу и проверьте:&lt;/p&gt;
  &lt;pre id=&quot;Wz8S&quot; data-lang=&quot;python&quot;&gt;ps aux | grep python tail -f /root/bot_env/bot.log&lt;/pre&gt;
  &lt;p id=&quot;Wz8S&quot;&gt; Бот должен автоматически запуститься благодаря crontab.&lt;/p&gt;
  &lt;p id=&quot;fUZZ&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;zyNl&quot;&gt;9. Полезные команды для тестирования и пояснения результатов&lt;/h2&gt;
  &lt;h4 id=&quot;qGxQ&quot;&gt;9.1. Проверка процесса&lt;/h4&gt;
  &lt;pre id=&quot;918V&quot; data-lang=&quot;python&quot;&gt;ps aux | grep python&lt;/pre&gt;
  &lt;ul id=&quot;cYGw&quot;&gt;
    &lt;li id=&quot;J961&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;: Вы должны увидеть процесс &lt;strong&gt;bot.py&lt;/strong&gt;, например:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;3s53&quot;&gt;&lt;code&gt;root 12345 0.1 0.2 123456 7890 ? S 20:00 0:01 /root/bot_env/venv/bin/python3 bot.py&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;ul id=&quot;vjdJ&quot;&gt;
    &lt;li id=&quot;pmQQ&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Если процесс есть, бот запущен. Если нет, проверьте логи.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;EliR&quot;&gt;9.2. Проверка логов&lt;/h4&gt;
  &lt;pre id=&quot;6krZ&quot;&gt;tail -f /root/bot_env/bot.log&lt;/pre&gt;
  &lt;ul id=&quot;FHFZ&quot;&gt;
    &lt;li id=&quot;4lzu&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zclE&quot;&gt;&lt;code&gt;2025-03-03 20:00:00,123 - INFO - Starting bot... 2025-03-03 20:00:00,456 - INFO - HTTP Request: POST https://api.telegram.org/... &amp;quot;HTTP/1.1 200 OK&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;6Cdx&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Логи показывают, что бот запустился и успешно подключается к Telegram API. Если есть ошибки (например, 401 Unauthorized), проверьте токен Telegram.&lt;/p&gt;
  &lt;h4 id=&quot;citH&quot;&gt;9.3. Проверка подключения&lt;/h4&gt;
  &lt;pre id=&quot;k2cu&quot;&gt;curl https://api.telegram.org curl https://api.openai.com&lt;/pre&gt;
  &lt;ul id=&quot;Ralo&quot;&gt;
    &lt;li id=&quot;VzDq&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;: Оба запроса должны вернуть HTTP-ответ (например, 200 OK или HTML-код).&lt;/li&gt;
    &lt;li id=&quot;Ifcf&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Если запросы не проходят, проверьте фаервол или интернет-соединение.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;wFx5&quot;&gt;9.4. Тестирование бота в Telegram&lt;/h4&gt;
  &lt;ul id=&quot;9WFf&quot;&gt;
    &lt;li id=&quot;HsWT&quot;&gt;&lt;strong&gt;Отправьте /start&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;ol id=&quot;K0wh&quot;&gt;
    &lt;ul id=&quot;33XH&quot;&gt;
      &lt;li id=&quot;4Jfd&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;YsAu&quot;&gt;&lt;code&gt;Привет! Я твой помощник по фиджитал-спорту! 🏅 Фиджитал-спорт — это крутое сочетание физической активности и цифровых технологий. Давай поговорим об этом! Знаешь, какие дисциплины есть в фиджитал-спорте? Например, фиджитал-футбол или фиджитал-гонки! Кстати, хочешь зарегистрировать свою команду на турнир? (да/нет)&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;xRhY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ZDIx&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Бот успешно запустился и отправил приветственное сообщение.&lt;/p&gt;
  &lt;ul id=&quot;RgQW&quot;&gt;
    &lt;li id=&quot;qELR&quot;&gt;&lt;strong&gt; Ответьте &amp;quot;да&amp;quot;&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;ol id=&quot;5btQ&quot;&gt;
    &lt;ul id=&quot;svoV&quot;&gt;
      &lt;li id=&quot;mX62&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;fpml&quot;&gt;&lt;code&gt;Отлично! Давай зарегистрируем твою команду. Сначала укажи название дисциплины (например, Фиджитал-Футбол).&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;XOG3&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Бот начал процесс регистрации.&lt;/p&gt;
  &lt;ul id=&quot;mexB&quot;&gt;
    &lt;li id=&quot;lykM&quot;&gt;&lt;strong&gt;Пройдите регистрацию&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;ol id=&quot;qXzq&quot;&gt;
    &lt;ul id=&quot;rQ8b&quot;&gt;
      &lt;li id=&quot;4SqS&quot;&gt;Введите дисциплину (например, &amp;quot;Фиджитал-Футбол&amp;quot;), подтвердите (&amp;quot;да&amp;quot;).&lt;/li&gt;
      &lt;li id=&quot;NdU2&quot;&gt;Укажите название команды (например, &amp;quot;Молния&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;xd1y&quot;&gt;Укажите ФИО (например, &amp;quot;Иванов Иван Иванович&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;7KLd&quot;&gt;Укажите телефон (например, &amp;quot;5555555&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;U5w7&quot;&gt;Укажите дату рождения (например, &amp;quot;01.01.00&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;Lrql&quot;&gt;Укажите город (например, &amp;quot;Москва&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;wgSG&quot;&gt;Укажите организацию (например, &amp;quot;МГУ&amp;quot;), подтвердите.&lt;/li&gt;
      &lt;li id=&quot;5GEt&quot;&gt;Ответьте &amp;quot;нет&amp;quot; на вопрос о дополнительных игроках.&lt;/li&gt;
      &lt;li id=&quot;Ernx&quot;&gt;Ответьте &amp;quot;нет&amp;quot; на вопрос о комментарии.&lt;/li&gt;
      &lt;li id=&quot;JwQT&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;:&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;riTN&quot;&gt;&lt;code&gt;Регистрация завершена! 🎉 Данные вашей команды записаны. Что ещё могу сделать для тебя? Давай продолжим говорить о фиджитал-спорте! Как думаешь, какая дисциплина самая интересная?&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;bMjr&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Бот успешно записал данные в Google Sheets.&lt;/p&gt;
  &lt;ul id=&quot;ML9e&quot;&gt;
    &lt;li id=&quot;8zhv&quot;&gt;&lt;strong&gt;Проверьте статус&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;QuZl&quot; data-lang=&quot;python&quot;&gt;/status Молния&lt;/pre&gt;
  &lt;ol id=&quot;FMFS&quot;&gt;
    &lt;ul id=&quot;e2nw&quot;&gt;
      &lt;li id=&quot;Z2O1&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;:&lt;br /&gt; &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Y9O4&quot;&gt;&lt;code&gt;Команда &amp;#x27;Молния&amp;#x27; зарегистрирована! &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;HT6F&quot;&gt;&lt;code&gt;Дисциплина: Фиджитал-Футбол &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;JAGb&quot;&gt;&lt;code&gt;Капитан: Иванов Иван Иванович &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;BYCh&quot;&gt;&lt;code&gt;Телефон: 555-55-55 &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Dn5h&quot;&gt;&lt;code&gt;Дата рождения: 01.01.00 (24) &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;ysNe&quot;&gt;&lt;code&gt;Город: Москва &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Vosp&quot;&gt;&lt;code&gt;Организация: МГУ &lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;qBaW&quot;&gt;&lt;code&gt;Комментарий: Игроки:&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;kgqO&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Бот нашёл данные команды в Google Sheets и вывел их.&lt;/p&gt;
  &lt;p id=&quot;z6em&quot;&gt;&lt;/p&gt;
  &lt;ul id=&quot;lnxX&quot;&gt;
    &lt;li id=&quot;whFV&quot;&gt;&lt;strong&gt;Проверьте беседу&lt;/strong&gt;: После регистрации спросите что-то о фиджитал-спорте, например: &amp;quot;Какие дисциплины самые популярные?&amp;quot;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;ol id=&quot;lnh8&quot;&gt;
    &lt;ul id=&quot;5OxJ&quot;&gt;
      &lt;li id=&quot;oHB0&quot;&gt;&lt;strong&gt;Ожидаемый результат&lt;/strong&gt;: Бот ответит, используя промт из Google Sheets и OpenAI API.&lt;/li&gt;
      &lt;li id=&quot;93ni&quot;&gt;&lt;strong&gt;Пояснение&lt;/strong&gt;: Бот успешно продолжает беседу.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;TGKR&quot;&gt;Итог&lt;/h3&gt;
  &lt;p id=&quot;zWvY&quot;&gt;Инструкция включает все шаги для установки бота с нуля: от подготовки сервера до тестирования. Бот будет работать, если все API-ключи и доступы настроены корректно. Если возникнут проблемы, проверьте логи (&lt;strong&gt;tail -f /root/bot_env/bot.log&lt;/strong&gt;) и убедитесь, что сервер может подключиться к Telegram и OpenAI API.&lt;/p&gt;
  &lt;p id=&quot;LfIm&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;N3dh&quot;&gt;&lt;strong&gt;Если  понравилось пишите  👨‍🚀&lt;/strong&gt;&lt;/p&gt;

</content></entry></feed>