<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns:turbo="http://turbo.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Блог</title>
    <link>https://block-fox.ru</link>
    <description/>
    <language>ru</language>
    <lastBuildDate>Tue, 07 Jul 2026 22:23:25 +0300</lastBuildDate>
    <item turbo="true">
      <title>Smart Life + MacroDroid: дом ещё умнее</title>
      <link>https://block-fox.ru/tpost/rdkx8sxi01-smart-life-macrodroid-dom-eschyo-umnee</link>
      <amplink>https://block-fox.ru/tpost/rdkx8sxi01-smart-life-macrodroid-dom-eschyo-umnee?amp=true</amplink>
      <pubDate>Tue, 07 Jul 2026 20:41:00 +0300</pubDate>
      <description>Бизнес-конструктор в действии: как бесплатно подружить Tuya (Smart Life) и MacroDroid</description>
      <turbo:content><![CDATA[<header><h1>Smart Life + MacroDroid: дом ещё умнее</h1></header><div class="t-redactor__text">Пока типичные студии разработки выбивают бюджеты на&nbsp;создание кастомного бэкенда для банального управления реле, прагматичный бизнес собирает автоматизацию из&nbsp;готовых кубиков. Если вы&nbsp;пытались управлять умными розетками или обогревателями Tuya напрямую со&nbsp;смартфона через MacroDroid, то&nbsp;наверняка разбились о&nbsp;суровую реальность: роутеры изолируют Wi-Fi клиентов, а&nbsp;локальный протокол требует сложного шифрования пакетов.</div><div class="t-redactor__text">Решение в стиле Block-Fox — бесплатный микро-сервер в Google Apps Script. Смартфон шлет простейший интернет-клик на вашу личную ссылку, а облако Google само берет на себя всю криптографию, генерирует подписи по стандартам Tuya Cloud Sign v2.0 и мгновенно переключает реле. Компьютер для этого держать включенным не нужно, всё работает в режиме 24/7. Минимум кода, ноль затрат. </div><h2  class="t-redactor__h2">Блок 1. Добываем API-ключи Tuya</h2><div class="t-redactor__text">Прежде чем настраивать автоматизацию, нужно получить «паспортные данные» вашей экосистемы. Постарайтесь не запутаться в трех соснах интерфейса разработчиков: </div><div class="t-redactor__text"><ol><li data-list="ordered">Перейдите на <a href="https://iot.tuya.com">iot.tuya.com</a> и создайте аккаунт разработчика.</li><li data-list="ordered">В панели слева зайдите в <strong>Cloud</strong> -&gt; <strong>Development</strong> -&gt; нажмите <strong>Create Cloud Project</strong>. Имя проекта пишите любое, а в поле <em>Data Center</em> выберите <strong>Central Europe Data Center</strong> (для СНГ и Европы).</li><li data-list="ordered">Внутри проекта перейдите во вкладку <strong>Link Tuya App</strong>. Нажмите <strong>Add App Account</strong> и отсканируйте появившийся QR-код через ваше мобильное приложение (Tuya Smart или Smart Life). Все устройства автоматически подтянутся в облако.</li><li data-list="ordered">Вернитесь во вкладку <strong>Overview</strong> вашего проекта и скопируйте два главных параметра: <strong>Access ID (Client ID)</strong> и <strong>Access Secret (Client Secret)</strong>.</li><li data-list="ordered">Перейдите во вкладку <strong>Devices</strong>, найдите в списке нужный гаджет и скопируйте его <strong>Device ID</strong>.</li></ol></div><h2  class="t-redactor__h2">Блок 2. Развертывание скрипта в облаке Google</h2><div class="t-redactor__text">Google Apps Script идеален для нашей задачи, так как умеет в криптографию (HMAC-SHA256), которую не способны переварить стандартные HTTP-запросы в смартфонах. </div><div class="t-redactor__text"><ol><li data-list="ordered">Перейдите на <a href="https://script.google.com">script.google.com</a> под своей учетной записью Google.</li><li data-list="ordered">Нажмите <strong>«Новый проект» (New project)</strong> , полностью сотрите шаблонный бред и вставьте следующий скрипт:</li></ol></div><div class="t-redactor__text">JavaScript</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// ====== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ======  
const CLIENT_ID = &quot;ВАШ_ACCESS_ID_ИЗ_ШАГА_1&quot;; 
const SECRET = &quot;ВАШ_ACCESS_SECRET_ИЗ_ШАГА_1&quot;;
const DEVICE_ID = &quot;ВАШ_DEVICE_ID_УСТРОЙСТВА&quot;; 
const TUYA_BASE_URL = &quot;https://openapi.tuyaeu.com&quot;; // [cite: 28, 29]
// ===================================  

function doGet(e) {   
  try {     
    let action = e.parameter.action; // [cite: 30]
    let turnOn = (action === &#039;off&#039;) ? false : true; // [cite: 31]
    
    // 1. Получаем свежий токен доступа
    let t_token = new Date().getTime().toString(); // [cite: 32]
    let signUrl_token = &quot;/v1.0/token?grant_type=1&quot;;     
    let bodyHash_token = calcSha256(&quot;&quot;); // [cite: 33]
    let stringToSign_token = CLIENT_ID + t_token + &quot;GET\n&quot; + bodyHash_token + &quot;\n\n&quot; + signUrl_token; // [cite: 34]
    let sign_token = calcHmacSha256(stringToSign_token, SECRET);     
    let tokenOpts = {       
      &quot;method&quot;: &quot;get&quot;,       
      &quot;headers&quot;: { &quot;client_id&quot;: CLIENT_ID, &quot;sign&quot;: sign_token, &quot;t&quot;: t_token, &quot;sign_method&quot;: &quot;HMAC-SHA256&quot; },       
      &quot;muteHttpExceptions&quot;: true     
    }; // [cite: 35]
    let tokenRes = JSON.parse(UrlFetchApp.fetch(`${TUYA_BASE_URL}${signUrl_token}`, tokenOpts).getContentText()); // [cite: 36]
    if (!tokenRes.success) return ContentService.createTextOutput(JSON.stringify({ error: &quot;Token failed&quot;, detail: tokenRes})).setMimeType(ContentService.MimeType.JSON); // [cite: 37]
    let accessToken = tokenRes.result.access_token;     
    
    // 2. Формируем и подписываем команду для реле
    let t_cmd = new Date().getTime().toString(); // [cite: 38]
    let signUrl_cmd = `/v1.0/devices/${DEVICE_ID}/commands`;     
    let payloadStr = JSON.stringify({ &quot;commands&quot;: [{ &quot;code&quot;: &quot;switch_1&quot;, &quot;value&quot;: turnOn }] }); // [cite: 39]
    let bodyHash_cmd = calcSha256(payloadStr);         
    let stringToSign_cmd = CLIENT_ID + accessToken + t_cmd + &quot;POST\n&quot; + bodyHash_cmd + &quot;\n\n&quot; + signUrl_cmd; // [cite: 40]
    let sign_cmd = calcHmacSha256(stringToSign_cmd, SECRET);     
    let cmdOpts = {       
      &quot;method&quot;: &quot;post&quot;,       
      &quot;contentType&quot;: &quot;application/json&quot;,       
      &quot;headers&quot;: {         
        &quot;client_id&quot;: CLIENT_ID,         
        &quot;access_token&quot;: accessToken,         
        &quot;sign&quot;: sign_cmd,         
        &quot;t&quot;: t_cmd,         
        &quot;sign_method&quot;: &quot;HMAC-SHA256&quot;        
      },       
      &quot;payload&quot;: payloadStr,       
      &quot;muteHttpExceptions&quot;: true     
    }; // [cite: 41, 42]
    let response = UrlFetchApp.fetch(`${TUYA_BASE_URL}${signUrl_cmd}`, cmdOpts);     
    return ContentService.createTextOutput(response.getContentText()).setMimeType(ContentService.MimeType.JSON); // [cite: 43]
  } catch (err) {     
    return ContentService.createTextOutput(JSON.stringify({ error: err.toString()})).setMimeType(ContentService.MimeType.JSON); // [cite: 44]
  }
} 

function calcSha256(input) {   
  let rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, input, Utilities.Charset.UTF_8); // [cite: 45]
  return rawHash.map(function(b) { return (&#039;0&#039; + (b &amp; 0xFF).toString(16)).slice(-2); }).join(&#039;&#039;); // [cite: 46]
} 

function calcHmacSha256(input, key) {   
  let rawHmac = Utilities.computeHmacSha256Signature(input, key, Utilities.Charset.UTF_8); // [cite: 46]
  return rawHmac.map(function(b) { return (&#039;0&#039; + (b &amp; 0xFF).toString(16)).slice(-2); }).join(&#039;&#039;).toUpperCase(); // [cite: 47]
}</code></pre><div class="t-redactor__embedcode"><ol>
  <li>Замените текстовые значения вверху скрипта на ваши ключи и нажмите иконку «Сохранить» (дискета).</li>
  <li>Кликайте синюю кнопку <strong>«Начало развертывания» (Deploy)</strong> &rarr; <strong>«Новое развертывание» (New deployment)</strong>. Нажмите на шестеренку и выберите тип: <strong>«Веб-приложение» (Web app)</strong>.</li>
  <li>Выставите настройки прав (не накосячьте здесь):
    <ul>
      <li>Запуск от имени: <strong>«Я»</strong> (ваш Google-аккаунт).</li>
      <li>У кого есть доступ: <strong>«Все» (Anyone)</strong> &mdash; чтобы телефон мог слать команды без авторизации.</li>
    </ul>
  </li>
  <li>Нажмите <strong>«Развернуть»</strong>. Если система попросит авторизацию (Authorize access) &mdash; соглашайтесь, выбирайте свой аккаунт, жмите <em>Advanced &rarr; Go to ... (unsafe)</em> и подтверждайте.</li>
  <li>Скопируйте сгенерированный <strong>URL веб-приложения</strong> (ссылка, заканчивающаяся на <code>/exec</code>).</li>
</ol></div><div class="t-redactor__text"><ol><li data-list="ordered">Нажмите <strong>«Развернуть»</strong>. Если система попросит авторизацию (Authorize access) — соглашайтесь, выбирайте свой аккаунт, жмите <em>Advanced -&gt; Go to ... (unsafe)</em> и подтверждайте. </li><li data-list="ordered">Скопируйте сгенерированный <strong>URL веб-приложения</strong> (ссылка, заканчивающаяся на /exec). </li></ol></div><div class="t-redactor__text">⚠️ <strong>Важно на будущее:</strong> Если решите отредактировать этот код, обычного сохранения мало. Вам придется нажать <em>«Управление развертываниями» -&gt; «Редактировать» (карандаш) -&gt; Версия: «Новая версия» -&gt; «Развернуть»</em>. Ссылка при этом останется прежней. </div><h2  class="t-redactor__h2">Блок 3. Настройка автоматизации в MacroDroid</h2><div class="t-redactor__text">Скрипт в облаке полностью универсален. Забудьте про программистский булшит с настройкой переменных, заголовков и JSON-тел в самом телефоне. </div><div class="t-redactor__text"><ul><li data-list="bullet"><strong>Для включения устройства:</strong> Создайте макрос в MacroDroid с любым триггером (геозона, будильник, кнопка). Добавьте действие: <strong>«Сеть» -&gt; «HTTP GET-запрос»</strong>. В поле URL вставьте вашу ссылку из Шага 2, приписав на конце параметр включения: ?action=on. Все остальные поля оставьте пустыми.</li><li data-list="bullet"><strong>Для выключения устройства:</strong> Создайте аналогичное действие в макросе выключения, но на конце ссылки укажите параметр: ?action=off.</li></ul></div><h3  class="t-redactor__h3">Финал</h3><div class="t-redactor__text">Готово. Модуль собран. Вместо изобретения велосипеда и оплаты мифических человеко-часов ленивых разработчиков вы получили готовую, работающую связку API. Умный дом моментально подчиняется триггерам смартфона из любой точки мира через надежные и абсолютно бесплатные серверы Google. Прагматично, быстро и максимально эффективно.</div>]]></turbo:content>
    </item>
    <item turbo="true">
      <title>Корпоративный ИИ на базе OpenSource: как внедрить LibreChat</title>
      <link>https://block-fox.ru/tpost/23h6ntu671-korporativnii-ii-na-baze-opensource-kak</link>
      <amplink>https://block-fox.ru/tpost/23h6ntu671-korporativnii-ii-na-baze-opensource-kak?amp=true</amplink>
      <pubDate>Tue, 07 Jul 2026 22:05:00 +0300</pubDate>
      <description>Разбор, как без сложной серверной терминологии развернуть изолированный LibreChat на собственном сервере и жестко закрыть доступ по IP, чтобы сотрудники получили персональные чаты, а информация была в безопасности.</description>
      <turbo:content><![CDATA[<header><h1>Корпоративный ИИ на базе OpenSource: как внедрить LibreChat</h1></header><div class="t-redactor__text">Многие компании совершают критическую ошибку, разрешая сотрудникам использовать публичные версии ChatGPT или Claude для рабочих задач. Любая закрытая финансовая отчетность, коммерческая тайна или фрагмент исходного кода, отправленные сотрудником в публичный ИИ-сервис, покидают периметр компании и передаются внешнему поставщику. Для организаций с высокими требованиями к информационной безопасности это означает потерю контроля над обработкой конфиденциальных данных и может противоречить внутренним политикам безопасности или требованиям регуляторов. Чтобы использовать всю мощь современных LLM без рисков, бизнесу необходимы собственные корпоративные ИИ-ассистенты, развернутые в изолированном контуре.</div><h2  class="t-redactor__h2">Безопасный контур: как запереть ИИ внутри компании</h2><div class="t-redactor__text">Главный приоритет при внедрении ИИ – безопасность данных компании. Чтобы существенно снизить риск утечки данных во внешние сервисы, платформа разворачивается на изолированном сервере.</div><h4  class="t-redactor__h4">Безопасный контур: два простых правила защиты данных</h4><div class="t-redactor__text">Развернуть нейросеть – половина дела. Главное – сделать так, чтобы к корпоративным данным не дотянулись извне. Чтобы не забивать сотрудникам голову сложными инструкциями, вся безопасность компании строится вокруг двух простых правил:</div><div class="t-redactor__text"><ul><li data-list="bullet"><strong>Выделенный сервер (VPS).</strong> Платформа устанавливается на собственный или арендованный сервер компании, доступ к которому полностью контролируется вашими техническими специалистами.</li><li data-list="bullet"><strong>Ограничение доступа по IP (WhiteList).</strong> На уровне веб-сервера (например, Nginx) прописываются статические IP-адреса вашего офиса. При попытке зайти в ИИ-чат из дома или публичного кафе пользователь получит ошибку доступа.</li></ul></div><div class="t-redactor__text">Такой подход гарантирует надежную защиту коммерческой информации и обеспечивает безопасное ускорение рутинных операций в разы. Данные физически не покинут периметр офиса, а компании не придется внедрять сложные избыточные системы авторизации.</div><h2  class="t-redactor__h2">Флагман корпоративной автоматизации: LibreChat</h2><div class="t-redactor__text">Среди множества проверенных нами OpenSource-решений лучше всего себя показал LibreChat. Этот интерфейс визуально и функционально повторяет привычный ChatGPT, но дает компании гибкость в настройке и позволяет использовать как внешние API, так и полностью локальные модели.</div><div class="t-redactor__text">Большая часть корпоративных внедрений строится именно на LibreChat благодаря его возможностям кастомизации:</div><div class="t-redactor__text"><ul><li data-list="bullet"><strong>Собственный поддомен. </strong>Вы можете развернуть чат на внутреннем адресе, например, ai.yourcompany.ru.</li><li data-list="bullet"><strong>Фирменный брендинг.</strong> В интерфейсе легко заменить стандартные логотипы, настроить собственный favicon и полностью убрать упоминания сторонних платформ. Сотрудники работают в привычной корпоративной среде.</li><li data-list="bullet"><strong>Кастомные ИИ-агенты.</strong> Для разных отделов создаются готовые пресеты. Например, "Ассистент маркетолога" с предустановленными промтами для копирайтинга или "Помощник юриста" для экспресс-анализа договоров. Каждый агент может быть дополнен внутренней базой знаний компании.</li><li data-list="bullet"><strong>Контроль доступов и логирование.</strong> Администратор системы может гибко управлять ролями, ставить лимиты на использование API-токенов для каждого сотрудника и видеть общую аналитику.</li></ul></div><div class="t-redactor__text">LibreChat позволяет гибко комбинировать коммерческие API (OpenAI, Anthropic) и полностью локальные нейросети (через Ollama), способные работать без подключения к интернету.</div><h2  class="t-redactor__h2">Другие OpenSource-варианты: CherryStudio и Open WebUI</h2><div class="t-redactor__text">Если LibreChat кажется избыточным для текущих задач, существуют альтернативные инструменты, ориентированные на другие сценарии использования.</div><div class="t-redactor__text"><strong>CherryStudio. </strong>Это легковесный и эстетичный десктопный клиент. Он идеально подходит для индивидуальной работы или микрокоманд. CherryStudio поддерживает быстрое переключение между десятками API-провайдеров и удобное управление промтами. Однако он уступает LibreChat в возможностях централизованного администрирования пользователей и серверного брендинга.</div><div class="t-redactor__text"><strong>Open WebUI.</strong> Мощная веб-панель, которая чаще всего разворачивается в связке с локальными моделями. Обладает глубокой интеграцией с базами знаний и модулями RAG, но требует чуть больше усилий для тонкой настройки корпоративного стиля.</div><h3  class="t-redactor__h3">Прагматичный подход от Block-Fox</h3><div class="t-redactor__text">Мы в Block-Fox не предлагаем строить сложные монолитные системы с нуля там, где можно применить готовые кубики. Развертывание изолированных нейросетевых инстансов для работы сотрудников с документами, базами знаний и аналитикой – это понятный и масштабируемый модуль цифровой экосистемы. Мы берем лучшие OpenSource-решения, адаптируем под ваши бизнес-процессы и экономим ваш бюджет, обеспечивая высокий уровень защиты данных.</div>]]></turbo:content>
    </item>
  </channel>
</rss>
