<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>TeaCoder</title><generator>teletype.in</generator><description><![CDATA[The founder of education platform teacoder.ru]]></description><image><url>https://img4.teletype.in/files/fe/4e/fe4eb416-4dc6-4df9-b863-2adcedd6a992.png</url><title>TeaCoder</title><link>https://blog.teacoder.ru/</link></image><link>https://blog.teacoder.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/teacoder?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/teacoder?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 24 Jun 2026 07:04:13 GMT</pubDate><lastBuildDate>Wed, 24 Jun 2026 07:04:13 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.teacoder.ru/TYLtUZowNYZ</guid><link>https://blog.teacoder.ru/TYLtUZowNYZ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder</link><comments>https://blog.teacoder.ru/TYLtUZowNYZ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder#comments</comments><dc:creator>teacoder</dc:creator><title>Node.js в крылатой ракете: Реально ли написать систему наведения на JS?</title><pubDate>Tue, 10 Mar 2026 16:14:36 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/72/0e/720e3696-ea2e-433f-8b1c-02a347869311.png"></media:content><description><![CDATA[Приветствую всех, кто привык мерить производительность в миллисекундах ответа API. Сегодня мы поднимем планку. Представьте среду, где задержка в 10 миллисекунд это физическое отклонение ракеты от курса на три метра.]]></description><content:encoded><![CDATA[
  <p id="oQSD">Приветствую всех, кто привык мерить производительность в миллисекундах ответа API. Сегодня мы поднимем планку.</p>
  <p id="jiym">Реально ли запустить Node.js в голове крылатой ракеты? Если отбросить священный трепет перед Ada и C++, технически - <strong>да</strong>. Современные бортовые вычислители на базе архитектур ARM Cortex-A достаточно мощны, чтобы прожевать рантайм V8. Но чтобы этот полет не закончился бесславным падением из-за сегфолта или заминки сборщика мусора, нам придется превратить Node.js в нечто совершенно иное.</p>
  <hr />
  <h2 id="FAuW">1. Проблема жесткого реального времени (Hard Real-Time)</h2>
  <p id="iGCG">Крылатая ракета - это объект с непрерывным циклом управления. Каждые несколько микросекунд система должна выполнять цикл: <strong>Считывание -&gt; Фильтрация -&gt; Расчет -&gt; Коррекция</strong>.</p>
  <p id="VyDY">В обычном Node.js <code>Event Loop</code> работает по принципу «сделаю, как только освобожусь». В ракете это недопустимо. Если ваш скрипт занят парсингом JSON-конфигурации полета, а в это время датчик высоты кричит о приближении к скале, ракета должна бросить всё.</p>
  <p id="AUNL">Для реализации этого на JS нам пришлось бы использовать <strong>Worker Threads</strong> и жесткую привязку к ядрам процессора (CPU Affinity), чтобы основной поток управления никогда не пересекался с фоновыми задачами.</p>
  <h2 id="q0Nf">2. Борьба с Garbage Collector: Zero-Allocation Style</h2>
  <p id="w4RQ">Но главный страх это внезапная пауза на очистку памяти. Чтобы выжить, мы должны писать код в стиле Zero-Allocation. Мы не создаем объекты, не используем строки и не вызываем <code>map/filter</code>.</p>
  <p id="Nybk">Мы используем <code>SharedArrayBuffer</code> - это кусок «сырой» памяти, общий для всех потоков, где данные лежат в виде байтов.</p>
  <pre id="Arpy" data-lang="javascript">const telemetryBuffer = new SharedArrayBuffer(1024);
const telemetry = new Float64Array(telemetryBuffer);

const LATITUDE_IDX = 0;
const LONGITUDE_IDX = 1;
const ALTITUDE_IDX = 2;

function updateCourse(newLat, newLon, newAlt) {
  telemetry[LATITUDE_IDX] = newLat;
  telemetry[LONGITUDE_IDX] = newLon;
  telemetry[ALTITUDE_IDX] = newAlt;
}</pre>
  <p id="PAoE" data-align="center"><em>Работа с координатами через типизированные массивы, чтобы не звать GC</em></p>
  <h2 id="5jXx">3. Математика на лету: Фильтр Калмана на JS</h2>
  <p id="MDS1">Система наведения должна отделять полезный сигнал от шума датчиков. Для этого используется <a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%9A%D0%B0%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0" target="_blank">фильтр Калмана</a>. В Node.js математика работает быстро благодаря JIT-компиляции, но нам важен <strong>прогрев</strong>. Если движок решит перекомпилировать функцию прямо во время маневра, ракета может дернуться.</p>
  <p id="PDZx">Поэтому перед стартом система должна прогнать тысячи холостых циклов вычислений, чтобы V8 оптимизировал функции до состояния TurboFan (максимально быстрый машинный код) и больше их не трогал.</p>
  <pre id="8u5d" data-lang="javascript">// Инициализируем пре-аллоцированные буферы
const state = new Float64Array(new SharedArrayBuffer(128));

function navigationLoop() {
  while (missionActive) {
    // Сбор данных через нативный аддон
    hardware.readSensorsToBuffer(state.buffer); 
    
    // Расчет фильтра Калмана
    // predict(state);
    // update(state);
    
    // Команда на приводы
    hardware.applyThrust(state[COURSE_VECTOR_IDX]);
    
    // Принудительная синхронизация времени
    waitPreciseMicroseconds(LOOP_TICK);
  }
}</pre>
  <p id="5QPg" data-align="center"><em>Пример структуры кастомного цикла управления</em></p>
  <h2 id="cS1s">4. Стык с железом: Node-API и прерывания</h2>
  <p id="509I">Node.js не умеет напрямую общаться с шиной данных ракеты (например, MIL-STD-1553 или CAN-bus). По этому понадобятся нативные аддоны на C++ или Rust.</p>
  <p id="h1qh">В этой схеме JS выступает в роли стратега, а низкоуровневые модули в роли рефлексов. Когда датчик фиксирует критическое изменение курса, он посылает сигнал, который должен мгновенно пронзить все слои абстракции рантайма.</p>
  <p id="rl1u">Главная сложность заключается в минимизации накладных расходов на этот переход. Мы создаем систему, где JavaScript командует векторами и целями, а микросекундные задачи по удержанию стабилизации рулей выполняются в нативном слое, максимально близком к процессору.</p>
  <h2 id="vBQg">Конец</h2>
  <p id="MeHd">Идея запустить интерпретируемый язык в боеголовке звучит как инженерное безумие, но чисто ради эксперимента я считаю это крутой вызов.</p>
  <p id="d8It">На этом наше погружение в мир детерминированного JavaScript окончено. Спасибо за внимание, всем удачного кодинга!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.teacoder.ru/infisical-secrets-nodejs</guid><link>https://blog.teacoder.ru/infisical-secrets-nodejs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder</link><comments>https://blog.teacoder.ru/infisical-secrets-nodejs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder#comments</comments><dc:creator>teacoder</dc:creator><title>Infisical: менеджер секретов</title><pubDate>Thu, 22 Jan 2026 07:40:44 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c9/df/c9df8f95-3f81-45ab-bc24-1141635a75d0.png"></media:content><description><![CDATA[Сегодня я хочу рассказать вам про Infisical - удобный менеджер секретов.]]></description><content:encoded><![CDATA[
  <p id="xfg8">Всем привет! Сегодня я хочу рассказать вам про <strong>Infisical</strong> - удобный менеджер секретов. С его помощью вы можете безопасно хранить API-ключи, токены, пароли и другие конфиденциальные данные, а также легко интегрировать их в проекты.</p>
  <p id="X4vn">В этой статье я покажу, как зарегистрироваться в Infisical, настроить секреты, подключить их к локальному проекту и использовать в приложении без риска утечек данных.</p>
  <h2 id="dAq8">Зачем нужен менеджер секретов</h2>
  <p id="IqRA">В проектах секреты обычно хранят в <code>.env</code> файлах: переменные окружения для базы данных, API ключи и т.д. Это удобно на старте, но есть ряд проблем:</p>
  <ol id="wWBC">
    <li id="DfXm"><code>.env</code> лежит в проекте или на сервере, и каждый, кто имеет доступ к файлу, видит все секреты.</li>
    <li id="jF1u">Нет истории изменений - кто и когда менял значение, не видно.</li>
    <li id="9d1w">Нельзя легко управлять разными окружениями: dev, staging, prod.</li>
  </ol>
  <p id="HWt3">Например, обычный <code>.env</code> может выглядеть так:</p>
  <pre id="z42v" data-lang="bash">NODE_ENV=development

HTTP_PORT=3000
CORS_ORIGIN=http://localhost:5173

STRIPE_API_KEY=sk_test_51LabcXYZ

DATABASE_URL=postgresql://user:pass@localhost:5432/dbname</pre>
  <p id="zFG7">Всё вроде просто, но что реально важно:</p>
  <ul id="tHOM">
    <li id="ENL8"><code>NODE_ENV,</code> <code>HTTP_PORT</code> и <code>CORS_ORIGIN</code> - это локальные настройки, их можно оставить в <code>.env</code>.</li>
    <li id="gwg8">А вот <code>STRIPE_API_KEY</code>, <code>DATABASE_URL</code> лучше перенести в менеджер секретов.</li>
  </ul>
  <p id="6221">Почему? Потому что их случайная утечка может стоить денег или безопасности. В менеджере секретов вы храните их безопасно, задаёте, кто может получить доступ, можно менять значения без перезапуска приложения и есть история изменений.</p>
  <h2 id="oc38">Cloud или Self-Hosted</h2>
  <p id="jg69">Infisical можно использовать двумя способами: полностью управляемый cloud сервис или разворачивать на своём сервере. У self-hosted есть свои плюсы - полный контроль над данными, но для простого старта удобнее cloud версия.</p>
  <p id="KWnU">Я буду показывать именно cloud, потому что её проще настроить и сразу работать с секретами в проекте.</p>
  <p id="oSdJ">Регистрация простая: заходите на <a href="https://infisical.com" target="_blank">сайт</a>, создаёте аккаунт, подтверждаете почту и попадаете в панель управления.</p>
  <figure id="Nmjn" class="m_column">
    <img src="https://img3.teletype.in/files/6a/27/6a27b772-76ac-4f93-9b36-6901f7ccbd58.png" width="1917" />
  </figure>
  <p id="MJf8"></p>
  <h2 id="W6K2">Создание первой организации и проекта</h2>
  <p id="ztnS">После того как мы создали аккаунт, нам предлагают создать организацию. Организация в Infisical - это верхний уровень структуры, куда будут входить все ваши проекты и секреты.</p>
  <figure id="1ne3" class="m_column">
    <img src="https://img2.teletype.in/files/9d/b0/9db0b201-a582-448f-96bb-6e959115995d.png" width="1919" />
  </figure>
  <p id="Z2z8">Внутри организации Infisical создаёт первый проект автоматически, он называется <strong>Example Project</strong>. Это базовый проект, который можно использовать как пример или сразу удалять.</p>
  <figure id="KGwI" class="m_column">
    <img src="https://img3.teletype.in/files/61/2a/612a20c4-0a9e-4da2-95f1-ab7f40ff166d.png" width="1919" />
  </figure>
  <p id="GWXq">Дальше можно создавать собственные проекты внутри организации, логически разделяя сервисы или репозитории. Например, отдельный проект для бэкэнда, другой для фронтэнда или для микросервисов.</p>
  <h2 id="Fegf">Добавление секретов</h2>
  <p id="Y0Vj">Я буду показывать всё на примере дефолтного проекта, который создаётся автоматически при создании организации. В нём уже есть несколько дефолтных переменных.</p>
  <figure id="dgER" class="m_column">
    <img src="https://img3.teletype.in/files/ec/23/ec23885a-84d1-4951-9f4e-6a4a8d25bb38.png" width="1919" />
  </figure>
  <p id="UD3o">Для чистоты примера я сначала удаляю эти дефолтные переменные.</p>
  <p id="6rPG">Теперь создадим свои переменные. В качестве примера возьмём <code>DATABASE_URL</code> и <code>STRIPE_API_KEY</code>. Чтобы добавить переменную, нажмите кнопку <strong>&quot;Add Secret&quot;</strong> в панели проекта. Появится форма создания новой переменной:</p>
  <figure id="SMf1" class="m_column">
    <img src="https://img4.teletype.in/files/b9/92/b9920bae-8af1-4f8a-93a4-71172cc16c62.png" width="1918" />
  </figure>
  <p id="Dem8">Разберём поля формы подробно:</p>
  <ul id="v4cD">
    <li id="1Q8K"><strong>Key</strong> - имя вашей переменной. Например <code>DATABASE_URL</code>. Это то, как её будут использовать в коде.</li>
    <li id="MTsp"><strong>Value</strong> - здесь вводим реальное значение секрета.</li>
    <li id="xsKQ"><strong>Tags</strong> - теги помогают классифицировать секреты. Можно создавать теги по сервисам или по типу ключей, чтобы потом легко фильтровать.</li>
    <li id="f0hp"><strong>Environments</strong> - выбор окружений, в которых будет создан секрет. В Infisical есть три стандартных окружения:</li>
    <ul id="ZHWQ">
      <li id="J3sA"><strong>Development</strong> - для локальной разработки. Сюда обычно добавляют тестовые ключи или локальные строки подключения.</li>
      <li id="8sX1"><strong>Staging</strong> - промежуточное окружение, где проверяются функции перед релизом. Здесь используют отдельные тестовые ключи и базы данных.</li>
      <li id="nSYY"><strong>Production</strong> - боевое окружение, сюда добавляются реальные секреты, которые будут использоваться в продакшене.</li>
    </ul>
  </ul>
  <h2 id="7YJD">Папки и окружения – dev/staging/prod и как их правильно разделять</h2>
  <p id="ZAuy">Infisical позволяет разделять секреты по окружениям. Это помогает держать ключи для тестов отдельно от боевых данных.</p>
  <p id="HzJF">Ещё есть папки, это удобный способ логически объединять переменные внутри окружения. Например, я создаю группу <code>database</code> для всех переменных базы, <code>payment</code> для Stripe и <code>auth</code> для JWT или OAuth токенов.</p>
  <figure id="6ZEk" class="m_column">
    <img src="https://img1.teletype.in/files/cf/b9/cfb98e04-1e85-4cf4-bd89-7db72b198707.png" width="838" />
  </figure>
  <figure id="WWQD" class="m_column">
    <img src="https://img4.teletype.in/files/35/8c/358ce392-73ef-4eb3-ba3c-681dfccade8f.png" width="1918" />
  </figure>
  <figure id="ohQ4" class="m_column">
    <img src="https://img3.teletype.in/files/22/88/228817f0-2be7-4b65-ba31-1db4cbe3bea0.png" width="1819" />
  </figure>
  <h2 id="BtYm">Интегрируем Infisical в приложение</h2>
  <p id="WNsG">Я буду показывать на примере простого Node.js приложения.</p>
  <p id="BQDj">Для начала нам нужно установить Infisical CLI глобально, чтобы можно было работать с секретами через командную строку. Это делается одной простой командой:</p>
  <pre id="y3r5" data-lang="bash">npm i -g @infisical/cli</pre>
  <p id="pttP">После установки нужно авторизоваться в Infisical. Для этого в терминале проекта пишем:</p>
  <pre id="yY3d" data-lang="bash">infisical login</pre>
  <p id="ajdE">CLI предложит выбрать способ использования: Infisical Cloud (US или EU регион) либо self-hosted. Выбираем нужный вариант(у меня это US) с помощью стрелок и нажимаем Enter. После этого происходит авторизация, и Infisical CLI получает доступ к вашим секретам.</p>
  <p id="xv0m">Далее нужно привязать наш проект к CLI. Для этого в терминале выполняем команду:</p>
  <pre id="Few6" data-lang="bash">infisical init</pre>
  <p id="o4if">CLI покажет список доступных организаций. Выбираем организацию, из которой будем подгружать секреты. После этого в папке проекта создаётся файл конфигурации <code>.infisical.json</code>, который хранит ID проекта.</p>
  <p id="ELGq">Теперь самое важное: чтобы приложение могло использовать секреты, его <strong>нельзя запускать обычной командой</strong> <code>node index.js</code> или <code>npm run start</code>. Нужно использовать команду:</p>
  <pre id="V8mQ" data-lang="bash">infisical run node index.js</pre>
  <p id="WUW0">То есть при запуске любого кода, где мы используем переменные не из <code>.env</code>, а из Infisical, всегда добавляем <code>infisical run</code> перед командой. Это гарантирует, что Infisical подгрузит секреты в <code>process.env</code> на время выполнения.</p>
  <p id="4xWb">В коде работать с ними можно точно так же, как с обычными переменными окружения:</p>
  <pre id="rwTL" data-lang="javascript">console.log(&#x27;Node environment:&#x27;, process.env.NODE_ENV)
console.log(&#x27;HTTP port:&#x27;, process.env.HTTP_PORT)
console.log(&#x27;Stripe API key:&#x27;, process.env.STRIPE_API_KEY)
console.log(&#x27;Database URL:&#x27;, process.env.DATABASE_URL)</pre>
  <p id="LGFv">Если попытаться запустить приложение обычной командой <code>node index.js</code>, <code>process.env</code> для секретов Infisical будет пустым.</p>
  <h2 id="cH3P">История изменений и аудит</h2>
  <p id="l4OH">Infisical ведёт детальный аудит всех действий с секретами в проекте. В панели управления есть раздел <strong>Audit Logs</strong>, где видно, кто, когда и что делал.</p>
  <figure id="bWZE" class="m_column">
    <img src="https://img4.teletype.in/files/f2/f0/f2f0601b-ba10-4eb3-80e2-22a059cb6a7a.png" width="1899" />
  </figure>
  <p id="lGWr">Например, на скрине показано, как я несколько раз просматривал список секретов в проекте. Каждое действие фиксируется с точным временем, типом события и аккаунтом пользователя:</p>
  <ul id="tpNL">
    <li id="UvMH"><strong>event</strong> - что именно произошло (например, <code>dashboard-list-secrets</code>).</li>
    <li id="wCu8"><strong>actor</strong> - кто совершил действие (например, <code>user</code>).</li>
    <li id="GaNN"><strong>user_email</strong> - почта пользователя, чтобы можно было понять, кто именно сделал изменения.</li>
    <li id="GjaR"><strong>timestamp</strong> - когда произошло событие (например, <code>Jan 22nd 2026, 10:22 AM</code>).</li>
  </ul>
  <p id="vJun">То есть аудит помогает отслеживать все изменения, предотвращать случайные удаления или утечки секретов и контролировать действия внутри команды.</p>
  <h2 id="9LCp">Конец</h2>
  <p id="S4TS">Итак, мы разобрали, зачем нужен менеджер секретов, как базово работать с Infisical, создавать проекты, добавлять переменные и подключать их в своих приложениях. Теперь вы можете безопасно хранить все ключи, токены и пароли вне кода и спокойно запускать приложения в разных окружениях.</p>
  <p id="j1tU">Надеюсь, эта статья поможет вам быстрее и безопаснее работать с секретами в ваших проектах. Удачи с настройкой и кодингом!</p>
  <p id="Ox86">До встречи в следующих статьях!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.teacoder.ru/uptime-kuma-guide</guid><link>https://blog.teacoder.ru/uptime-kuma-guide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder</link><comments>https://blog.teacoder.ru/uptime-kuma-guide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=teacoder#comments</comments><dc:creator>teacoder</dc:creator><title>Как развернуть свой собственный статус-сервис с Uptime Kuma</title><pubDate>Sun, 11 Jan 2026 11:08:08 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/52/6c/526c2d53-7fd7-479f-9ee5-e99722f5440e.png"></media:content><description><![CDATA[В этой статье я покажу, как развернуть свой собственный сервис для мониторинга сайтов и приложений с помощью Uptime Kuma. Мы установим сервис через Docker, настроим проверки для сайтов и API, подключим уведомления и сделаем публичную статус-страницу, чтобы ваши пользователи или команда всегда знали, что работает, а что нет.]]></description><content:encoded><![CDATA[
  <p id="Z2OS">В этой статье я покажу, как развернуть свой собственный сервис для мониторинга сайтов и приложений с помощью Uptime Kuma. Мы установим сервис через Docker, настроим проверки для сайтов и API, подключим уведомления и сделаем публичную статус-страницу, чтобы ваши пользователи или команда всегда знали, что работает, а что нет.</p>
  <p id="KSsz">Сайт проекта: <a href="https://github.com/louislam/uptime-kuma" target="_blank">https://github.com/louislam/uptime-kuma</a></p>
  <hr />
  <h2 id="TEmm"><strong>Что такое Uptime Kuma</strong></h2>
  <p id="AiCC">Uptime Kuma - это инструмент для мониторинга ваших сайтов и сервисов. Он показывает, работают ли ваши приложения и API и сразу уведомляет, если что-то упало.</p>
  <p id="YVYl">С его помощью можно проверять доступность сайтов по HTTP(S), следить за TCP-соединениями и портами, WebSocket или просто пинговать сервер. Также он фиксирует скорость отклика чтобы понимать насколько быстро работают сервисы.</p>
  <p id="WtVk">Главное преимущество это удобный веб-интерфейс. Он сохраняет историю проверок, показывает процент uptime и позволяет делать как публичные, так и приватные статус-страницы. Также можно настроить уведомления через Telegram, Discord, Slack, Email и другие каналы.</p>
  <hr />
  <h2 id="21Qc">Запуск через Docker</h2>
  <p id="uvhj">Разворачивать Uptime Kuma мы будем через Docker - это самый простой способ. </p>
  <p id="bcf1">Сначала создаём отдельную папку для проекта:</p>
  <pre id="17uH" data-lang="bash">mkdir status
cd status</pre>
  <p id="R7h4">Дальше создаём файл <code>docker-compose.yml:</code></p>
  <pre id="QCFy" data-lang="yaml">version: &#x27;3.8&#x27;

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    ports:
      - &quot;3001:3001&quot;
    volumes:
      - ./data:/app/data</pre>
  <p id="T8Kz">Запускаем контейнер командой:</p>
  <pre id="TFpU" data-lang="bash">docker-compose up -d</pre>
  <p id="XTcR">Теперь веб-интерфейс доступен по адресу <a href="http://localhost:3001" target="_blank">http://localhost:3001</a>. Файл <code>./data</code> хранит всю историю проверок и настройки, поэтому можно безопасно перезапускать контейнер.</p>
  <hr />
  <h2 id="sVbn">Регистрация админского аккаунта</h2>
  <p id="7rjr">После того как вы запустили Uptime Kuma через Docker, первым делом нужно создать администратора.</p>
  <p id="DXNR">На стартовой странице вводим логин и пароль. После подтверждения регистрации вы попадёте в основной интерфейс.</p>
  <figure id="Xxax" class="m_column">
    <img src="https://img3.teletype.in/files/65/cf/65cfce7e-0491-440e-a697-42702b3739c9.png" width="1913" />
  </figure>
  <h2 id="LBmc">Создание монитора</h2>
  <p id="JGjP">После того как вы зарегистрировались, вас автоматически перекидывает на <strong>панель управления</strong>. Здесь отображаются все ваши мониторы, статус сервисов и т.п</p>
  <figure id="iKF1" class="m_column">
    <img src="https://img1.teletype.in/files/0c/08/0c084ebb-848b-41d0-a019-43354a10c8c7.png" width="1919" />
  </figure>
  <p id="PORX">Наc интересует кнопка <strong>Add New Monitor</strong>, которая позволяет создать новый монитор. Монитор - это настройка проверки конкретного сервиса: сайт, API, сервер или база данных. После создания монитор будет регулярно проверять доступность сервиса и уведомлять вас при сбоях.</p>
  <h3 id="qcOu">Выбор типа монитора</h3>
  <p id="eP6Z">Когда вы нажимаете <strong>Add New Monitor</strong>, первым делом нужно выбрать <strong>Monitor Type</strong>. Uptime Kuma предлагает несколько категорий:</p>
  <ul id="bZ5x">
    <li id="banF"><strong>HTTP(s) </strong>- проверка веб-сайтов и API через HTTP или HTTPS.</li>
    <li id="PjsE"><strong>TCP Port</strong> - проверка доступности конкретного порта на сервере.</li>
    <li id="YC6N"><strong>Ping</strong> - классический пинг сервера (ICMP).</li>
    <li id="45ZL"><strong>HTTP(s) - Keyword</strong> - проверка наличия определённого текста на странице.</li>
    <li id="BZbP"><strong>HTTP(s) - Json Query</strong> - проверка значений в JSON ответе.</li>
    <li id="ksAU"><strong>gRPC(s) - Keyword</strong> - проверка gRPC сервисов.</li>
    <li id="rmah"><strong>DNS</strong> - проверка DNS записей.</li>
    <li id="OMXT"><strong>Docker Container</strong> - проверка состояния контейнера Docker.</li>
  </ul>
  <p id="K5fI">Есть также <strong>Specific Monitor Type</strong>, например базы данных (MySQL, PostgreSQL, MongoDB), игровые серверы (Steam, GameDig) и очереди сообщений (MQTT, Kafka).</p>
  <figure id="UvJR" class="m_original">
    <img src="https://img3.teletype.in/files/e4/16/e4167adf-77a7-4f97-b991-342f0ee43445.png" width="601" />
  </figure>
  <h3 id="Vg0X">Настройка HTTP(s) монитора</h3>
  <p id="rBnR">Давайте рассмотрим создание простого HTTP(s) монитора для веб-сайта.</p>
  <p id="KLvc"><strong>Общие поля:</strong></p>
  <ul id="qT6G">
    <li id="69iI"><strong>Friendly Name</strong> - имя мониторинга, например <code>Website</code>. Оно будет отображаться в панели и статус-страницах.</li>
    <li id="UGgh"><strong>URL</strong> - адрес сайта, который проверяем, например <code>https://teacoder.ru</code>.</li>
    <li id="RyHD"><strong>Heartbeat Interval</strong> - как часто проверять сервис. По умолчанию <code>60</code> секунд.</li>
    <li id="mOSv"><strong>Retries</strong> - количество попыток до того, как сервис считается упавшим. Например, <code>0</code> отключает повторные попытки.</li>
    <li id="TZI4"><strong>Heartbeat Retry Interval</strong> - интервал между повторными попытками, если первая проверка не прошла.</li>
    <li id="KNYH"><strong>Request Timeout</strong> - время ожидания ответа от сервиса, по умолчанию <code>48</code> секунд.</li>
    <li id="3vTO"><strong>Resend Notification if Down X times consecutively</strong> - повторная отправка уведомления, если сервис падает несколько раз подряд.</li>
  </ul>
  <p id="l9NG"><strong>Расширенные настройки:</strong></p>
  <ul id="7UYK">
    <li id="cn4y"><strong>Certificate Expiry Notification</strong> - уведомление о скором окончании срока действия TLS/SSL сертификата.</li>
    <li id="508p"><strong>Ignore TLS/SSL error for HTTPS websites</strong> - игнорировать ошибки сертификатов, если нужно проверять сайт с самоподписанным сертификатом.</li>
    <li id="nu46"><strong>Upside Down Mode</strong> - инвертирует статус: если сервис доступен, он будет отображаться как DOWN.</li>
    <li id="YEaN"><strong>Max. Redirects</strong> - максимальное количество редиректов для HTTP-запроса, по умолчанию <code>10</code>.</li>
    <li id="y2n9"><strong>Accepted Status Codes</strong> - какие HTTP-коды считаются успешными (например, <code>200-299</code>).</li>
  </ul>
  <p id="rPqV"><strong>HTTP Options:</strong></p>
  <ul id="KlAi">
    <li id="6HM5"><strong>Method</strong> - GET, POST, PUT и т.д.</li>
    <li id="XbXh"><strong>Body Encoding</strong> - JSON или XML.</li>
    <li id="yIuD"><strong>Body</strong> - тело запроса для POST-запросов.</li>
    <li id="ZcY3"><strong>Headers</strong> - дополнительные HTTP-заголовки, например для авторизации.</li>
    <li id="14gl"><strong>Authentication</strong> - метод авторизации, если сайт защищён (Basic Auth, OAuth, NTLM, mTLS).</li>
  </ul>
  <figure id="zbX2" class="m_column">
    <img src="https://img2.teletype.in/files/19/23/19237dc0-ccbd-41f3-98ce-1564d0fe560f.png" width="1919" />
  </figure>
  <p id="Zn8I">После заполнения этих полей нажимаем <strong>Save</strong>, и монитор сразу начинает проверять выбранный сервис. В панели управления монитором вы увидите график доступности и статус сервиса.</p>
  <figure id="BYug" class="m_column">
    <img src="https://img2.teletype.in/files/1c/7f/1c7fb366-bc3f-42b6-a652-b8a7ef01077f.png" width="1246" />
  </figure>
  <h2 id="pZba">Настройка уведомлений</h2>
  <p id="50lC">После того как мы создали первый монитор и он начал отслеживать сервис, важно настроить уведомления, чтобы узнавать о сбоях вовремя. В Uptime Kuma можно настроить уведомления через множество каналов: Telegram, Discord, Slack, Email, Webhook и другие. Я буду показывать на примере Telegram.</p>
  <h3 id="tZaQ">Создаём Telegram-бота</h3>
  <ul id="CxLL">
    <li id="KQjz">Откройте Telegram и найдите <strong><a href="https://t.me/BotFather" target="_blank">BotFather</a></strong>.</li>
    <li id="kzT6">Нажмите <strong>/start</strong>, затем <strong>/newbot</strong>, чтобы создать нового бота.</li>
    <li id="tbjP">Укажите имя бота и username.</li>
    <li id="y1nq">После создания BotFather даст вам <strong>API ключ </strong>- сохраните его, он понадобится для настройки в Uptime Kuma.</li>
  </ul>
  <figure id="gh5X" class="m_column">
    <img src="https://img3.teletype.in/files/6d/8a/6d8a3037-5224-4b9a-9cc5-498ff69729aa.png" width="668" />
  </figure>
  <h3 id="FUbu">Настройка уведомлений в Uptime Kuma</h3>
  <p id="XTa9">Далее откройте панель управления и перейдите в <strong>Settings → Notification</strong>. В этом разделе отображаются все существующие уведомления. Нажмите <strong>Setup Notification</strong>, чтобы добавить уведомление, и в поле <strong>Notification Type</strong> выберите <strong>Telegram</strong>.</p>
  <figure id="NocA" class="m_column">
    <img src="https://img4.teletype.in/files/b7/a3/b7a3deb3-ce1c-4978-8256-dcf128f28ce9.png" width="1266" />
  </figure>
  <h3 id="auCm">Заполняем поля</h3>
  <p id="LAaE">Далее заполняем поля для уведомления. В поле <strong>Friendly Name</strong> можно указать любое имя, например <code>Telegram Alerts</code>. В поле <strong>Bot Token</strong> вставляем токен, который выдал BotFather. В <strong>Chat ID</strong> указываем идентификатор чата, куда бот будет отправлять уведомления - если это личный чат с ботом, используйте свой ID, если группа - ID группы. Чтобы узнать свой Chat ID, можно написать боту <a href="https://t.me/useridbot" target="_blank">@userinfobot</a>.</p>
  <p id="LplS">Внизу формы отметьте <strong>Default enabled</strong> и <strong>Apply on all existing monitors</strong>, чтобы уведомление сразу стало активным для всех мониторов. После сохранения уведомление будет работать автоматически, и бот сможет присылать сообщения о падениях и восстановлении сервисов.</p>
  <figure id="9Hdf" class="m_column">
    <img src="https://img2.teletype.in/files/59/ea/59ea676f-94ec-4344-add9-ae083a029cd9.png" width="730" />
  </figure>
  <h2 id="9tKq">Создание публичной статус-страницы</h2>
  <p id="6XFr">Теперь можно сделать публичную статус-страницу, чтобы пользователи видели, какие сервисы работают, а какие нет. Для этого в верхнем меню панели управления перейдите в <strong>Status Pages</strong> и нажмите <strong>New Status Page</strong> </p>
  <figure id="aLZ5" class="m_column">
    <img src="https://img3.teletype.in/files/65/32/65320aca-f8be-4051-af89-190c47cd632c.png" width="1917" />
  </figure>
  <p id="MJGX">В поле <strong>Name</strong> укажите любое имя страницы, например <code>Services</code>, а в <strong>Slug</strong> уникальный идентификатор для URL, например <code>services</code>. После сохранения страница будет доступна по адресу <a href="http://localhost:3001/status/services" target="_blank">http://localhost:3001/status/services</a></p>
  <figure id="Y1FH" class="m_column">
    <img src="https://img1.teletype.in/files/09/e4/09e48082-cece-42ee-962b-f597ceec9154.png" width="1919" />
  </figure>
  <p id="CQxY">На этом этапе страница уже создана, но она ещё не содержит мониторов. Чтобы добавить монитор на страницу, нажмите <strong>Add a monitor</strong> и выберите какие мониторы вы хотите добавить, я выбираю <strong>Website</strong>. Далее автоматически создастся группа с названием <code>Services</code>, в которую попадёт новый монитор. Вы также можете создавать свои группы и распределять мониторы по ним.</p>
  <figure id="XSzW" class="m_column">
    <img src="https://img3.teletype.in/files/24/02/24026751-87a1-4f8d-867f-857d48357e16.png" width="1919" />
  </figure>
  <figure id="eiVV" class="m_column">
    <img src="https://img4.teletype.in/files/73/0d/730d4ed4-8202-46ee-8e18-d79752c9e581.png" width="1919" />
  </figure>
  <h2 id="0aGk">Заключение</h2>
  <p id="A2nN">Ну что же, я рассказал вам про основные моменты работы с Uptime Kuma: запуск через Docker, создание мониторов, уведомления и публичные статус-страницы. </p>
  <p id="X15w">Помимо этого, в панели есть разделы Reverse Proxy, Tags, Monitor History, Docker Hosts, Security, API Keys, Proxies и Backup, которые позволяют гибко управлять безопасностью и интеграциями. А для статус-страниц есть мелочи по типу: Footer Text, тема страницы, теги, Google Analytics и кастомные стили.</p>
  <p id="JjAQ">Спасибо, что прочитали статью, надеюсь она вам помогла!</p>

]]></content:encoded></item></channel></rss>