<?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>TeaCoder</title><subtitle>The founder of education platform teacoder.ru</subtitle><author><name>TeaCoder</name></author><id>https://teletype.in/atom/teacoder</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/teacoder?offset=0"></link><link rel="alternate" type="text/html" href="https://blog.teacoder.ru/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=teacoder"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/teacoder?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-24T07:00:10.809Z</updated><entry><id>teacoder:TYLtUZowNYZ</id><link rel="alternate" type="text/html" href="https://blog.teacoder.ru/TYLtUZowNYZ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=teacoder"></link><title>Node.js в крылатой ракете: Реально ли написать систему наведения на JS?</title><published>2026-03-10T16:14:36.146Z</published><updated>2026-03-10T16:14:36.146Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/72/0e/720e3696-ea2e-433f-8b1c-02a347869311.png"></media:thumbnail><summary type="html">Приветствую всех, кто привык мерить производительность в миллисекундах ответа API. Сегодня мы поднимем планку. Представьте среду, где задержка в 10 миллисекунд это физическое отклонение ракеты от курса на три метра.</summary><content type="html">
  &lt;p id=&quot;oQSD&quot;&gt;Приветствую всех, кто привык мерить производительность в миллисекундах ответа API. Сегодня мы поднимем планку.&lt;/p&gt;
  &lt;p id=&quot;jiym&quot;&gt;Реально ли запустить Node.js в голове крылатой ракеты? Если отбросить священный трепет перед Ada и C++, технически - &lt;strong&gt;да&lt;/strong&gt;. Современные бортовые вычислители на базе архитектур ARM Cortex-A достаточно мощны, чтобы прожевать рантайм V8. Но чтобы этот полет не закончился бесславным падением из-за сегфолта или заминки сборщика мусора, нам придется превратить Node.js в нечто совершенно иное.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;FAuW&quot;&gt;1. Проблема жесткого реального времени (Hard Real-Time)&lt;/h2&gt;
  &lt;p id=&quot;iGCG&quot;&gt;Крылатая ракета - это объект с непрерывным циклом управления. Каждые несколько микросекунд система должна выполнять цикл: &lt;strong&gt;Считывание -&amp;gt; Фильтрация -&amp;gt; Расчет -&amp;gt; Коррекция&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;VyDY&quot;&gt;В обычном Node.js &lt;code&gt;Event Loop&lt;/code&gt; работает по принципу «сделаю, как только освобожусь». В ракете это недопустимо. Если ваш скрипт занят парсингом JSON-конфигурации полета, а в это время датчик высоты кричит о приближении к скале, ракета должна бросить всё.&lt;/p&gt;
  &lt;p id=&quot;AUNL&quot;&gt;Для реализации этого на JS нам пришлось бы использовать &lt;strong&gt;Worker Threads&lt;/strong&gt; и жесткую привязку к ядрам процессора (CPU Affinity), чтобы основной поток управления никогда не пересекался с фоновыми задачами.&lt;/p&gt;
  &lt;h2 id=&quot;q0Nf&quot;&gt;2. Борьба с Garbage Collector: Zero-Allocation Style&lt;/h2&gt;
  &lt;p id=&quot;w4RQ&quot;&gt;Но главный страх это внезапная пауза на очистку памяти. Чтобы выжить, мы должны писать код в стиле Zero-Allocation. Мы не создаем объекты, не используем строки и не вызываем &lt;code&gt;map/filter&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;Nybk&quot;&gt;Мы используем &lt;code&gt;SharedArrayBuffer&lt;/code&gt; - это кусок «сырой» памяти, общий для всех потоков, где данные лежат в виде байтов.&lt;/p&gt;
  &lt;pre id=&quot;Arpy&quot; data-lang=&quot;javascript&quot;&gt;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;
}&lt;/pre&gt;
  &lt;p id=&quot;PAoE&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;Работа с координатами через типизированные массивы, чтобы не звать GC&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;5jXx&quot;&gt;3. Математика на лету: Фильтр Калмана на JS&lt;/h2&gt;
  &lt;p id=&quot;MDS1&quot;&gt;Система наведения должна отделять полезный сигнал от шума датчиков. Для этого используется &lt;a href=&quot;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&quot; target=&quot;_blank&quot;&gt;фильтр Калмана&lt;/a&gt;. В Node.js математика работает быстро благодаря JIT-компиляции, но нам важен &lt;strong&gt;прогрев&lt;/strong&gt;. Если движок решит перекомпилировать функцию прямо во время маневра, ракета может дернуться.&lt;/p&gt;
  &lt;p id=&quot;PDZx&quot;&gt;Поэтому перед стартом система должна прогнать тысячи холостых циклов вычислений, чтобы V8 оптимизировал функции до состояния TurboFan (максимально быстрый машинный код) и больше их не трогал.&lt;/p&gt;
  &lt;pre id=&quot;8u5d&quot; data-lang=&quot;javascript&quot;&gt;// Инициализируем пре-аллоцированные буферы
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);
  }
}&lt;/pre&gt;
  &lt;p id=&quot;5QPg&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;Пример структуры кастомного цикла управления&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;cS1s&quot;&gt;4. Стык с железом: Node-API и прерывания&lt;/h2&gt;
  &lt;p id=&quot;509I&quot;&gt;Node.js не умеет напрямую общаться с шиной данных ракеты (например, MIL-STD-1553 или CAN-bus). По этому понадобятся нативные аддоны на C++ или Rust.&lt;/p&gt;
  &lt;p id=&quot;h1qh&quot;&gt;В этой схеме JS выступает в роли стратега, а низкоуровневые модули в роли рефлексов. Когда датчик фиксирует критическое изменение курса, он посылает сигнал, который должен мгновенно пронзить все слои абстракции рантайма.&lt;/p&gt;
  &lt;p id=&quot;rl1u&quot;&gt;Главная сложность заключается в минимизации накладных расходов на этот переход. Мы создаем систему, где JavaScript командует векторами и целями, а микросекундные задачи по удержанию стабилизации рулей выполняются в нативном слое, максимально близком к процессору.&lt;/p&gt;
  &lt;h2 id=&quot;vBQg&quot;&gt;Конец&lt;/h2&gt;
  &lt;p id=&quot;MeHd&quot;&gt;Идея запустить интерпретируемый язык в боеголовке звучит как инженерное безумие, но чисто ради эксперимента я считаю это крутой вызов.&lt;/p&gt;
  &lt;p id=&quot;d8It&quot;&gt;На этом наше погружение в мир детерминированного JavaScript окончено. Спасибо за внимание, всем удачного кодинга!&lt;/p&gt;

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

</content></entry><entry><id>teacoder:uptime-kuma-guide</id><link rel="alternate" type="text/html" href="https://blog.teacoder.ru/uptime-kuma-guide?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=teacoder"></link><title>Как развернуть свой собственный статус-сервис с Uptime Kuma</title><published>2026-01-11T11:08:08.943Z</published><updated>2026-01-11T14:45:37.962Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/52/6c/526c2d53-7fd7-479f-9ee5-e99722f5440e.png"></media:thumbnail><summary type="html">В этой статье я покажу, как развернуть свой собственный сервис для мониторинга сайтов и приложений с помощью Uptime Kuma. Мы установим сервис через Docker, настроим проверки для сайтов и API, подключим уведомления и сделаем публичную статус-страницу, чтобы ваши пользователи или команда всегда знали, что работает, а что нет.</summary><content type="html">
  &lt;p id=&quot;Z2OS&quot;&gt;В этой статье я покажу, как развернуть свой собственный сервис для мониторинга сайтов и приложений с помощью Uptime Kuma. Мы установим сервис через Docker, настроим проверки для сайтов и API, подключим уведомления и сделаем публичную статус-страницу, чтобы ваши пользователи или команда всегда знали, что работает, а что нет.&lt;/p&gt;
  &lt;p id=&quot;KSsz&quot;&gt;Сайт проекта: &lt;a href=&quot;https://github.com/louislam/uptime-kuma&quot; target=&quot;_blank&quot;&gt;https://github.com/louislam/uptime-kuma&lt;/a&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;TEmm&quot;&gt;&lt;strong&gt;Что такое Uptime Kuma&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;AiCC&quot;&gt;Uptime Kuma - это инструмент для мониторинга ваших сайтов и сервисов. Он показывает, работают ли ваши приложения и API и сразу уведомляет, если что-то упало.&lt;/p&gt;
  &lt;p id=&quot;YVYl&quot;&gt;С его помощью можно проверять доступность сайтов по HTTP(S), следить за TCP-соединениями и портами, WebSocket или просто пинговать сервер. Также он фиксирует скорость отклика чтобы понимать насколько быстро работают сервисы.&lt;/p&gt;
  &lt;p id=&quot;WtVk&quot;&gt;Главное преимущество это удобный веб-интерфейс. Он сохраняет историю проверок, показывает процент uptime и позволяет делать как публичные, так и приватные статус-страницы. Также можно настроить уведомления через Telegram, Discord, Slack, Email и другие каналы.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;21Qc&quot;&gt;Запуск через Docker&lt;/h2&gt;
  &lt;p id=&quot;uvhj&quot;&gt;Разворачивать Uptime Kuma мы будем через Docker - это самый простой способ. &lt;/p&gt;
  &lt;p id=&quot;bcf1&quot;&gt;Сначала создаём отдельную папку для проекта:&lt;/p&gt;
  &lt;pre id=&quot;17uH&quot; data-lang=&quot;bash&quot;&gt;mkdir status
cd status&lt;/pre&gt;
  &lt;p id=&quot;R7h4&quot;&gt;Дальше создаём файл &lt;code&gt;docker-compose.yml:&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;QCFy&quot; data-lang=&quot;yaml&quot;&gt;version: &amp;#x27;3.8&amp;#x27;

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

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