{"id":19855843,"url":"https://github.com/twocolors/node-red-contrib-alice-self-hosting","last_synced_at":"2025-07-07T03:02:14.313Z","repository":{"id":212161349,"uuid":"730845082","full_name":"twocolors/node-red-contrib-alice-self-hosting","owner":"twocolors","description":"Node-RED nodes to Yandex Alice devices in Self-Hosting","archived":false,"fork":false,"pushed_at":"2025-04-11T09:42:50.000Z","size":787,"stargazers_count":12,"open_issues_count":2,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T11:49:26.015Z","etag":null,"topics":["alice","iot","node-red","nodejs","self-hosting","yandex","yandex-dialogs"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twocolors.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-12-12T19:56:11.000Z","updated_at":"2025-04-11T09:42:47.000Z","dependencies_parsed_at":"2023-12-26T13:27:50.017Z","dependency_job_id":"9788fd56-1610-4be3-b603-d649bdb89aaf","html_url":"https://github.com/twocolors/node-red-contrib-alice-self-hosting","commit_stats":null,"previous_names":["twocolors/node-red-contrib-alice-self-hosting"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twocolors%2Fnode-red-contrib-alice-self-hosting","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twocolors%2Fnode-red-contrib-alice-self-hosting/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twocolors%2Fnode-red-contrib-alice-self-hosting/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twocolors%2Fnode-red-contrib-alice-self-hosting/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twocolors","download_url":"https://codeload.github.com/twocolors/node-red-contrib-alice-self-hosting/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251969396,"owners_count":21673194,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alice","iot","node-red","nodejs","self-hosting","yandex","yandex-dialogs"],"created_at":"2024-11-12T14:13:51.591Z","updated_at":"2025-05-02T01:31:16.181Z","avatar_url":"https://github.com/twocolors.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# node-red-contrib-alice-self-hosting\n\n[![platform](https://img.shields.io/badge/platform-Node--RED-red?logo=nodered)](https://flows.nodered.org/node/node-red-contrib-alice-self-hosting)\n[![Min Node Version](https://img.shields.io/node/v/node-red-contrib-alice-self-hosting.svg)](https://nodejs.org/en/)\n[![GitHub version](https://img.shields.io/github/package-json/v/twocolors/node-red-contrib-alice-self-hosting?logo=npm)](https://www.npmjs.com/package/node-red-contrib-alice-self-hosting)\n[![GitHub stars](https://img.shields.io/github/stars/twocolors/node-red-contrib-alice-self-hosting)](https://github.com/twocolors/node-red-contrib-alice-self-hosting/stargazers)\n[![Package Quality](https://packagequality.com/shield/node-red-contrib-alice-self-hosting.svg)](https://packagequality.com/#?package=node-red-contrib-alice-self-hosting)\n\n[![issues](https://img.shields.io/github/issues/twocolors/node-red-contrib-alice-self-hosting?logo=github)](https://github.com/twocolors/node-red-contrib-alice-self-hosting/issues)\n![GitHub last commit](https://img.shields.io/github/last-commit/twocolors/node-red-contrib-alice-self-hosting)\n![NPM Total Downloads](https://img.shields.io/npm/dt/node-red-contrib-alice-self-hosting.svg)\n![NPM Downloads per month](https://img.shields.io/npm/dm/node-red-contrib-alice-self-hosting)\n![Repo size](https://img.shields.io/github/repo-size/twocolors/node-red-contrib-alice-self-hosting)\n\n## 💡💬\nОбсудить и общаться в душной обстановке можно тут [https://t.me/alice_in_red_wonderland](https://t.me/alice_in_red_wonderland)\n\n## Предупреждение\n\n**!!! ВНИМАНИЕ !!!**\n\nПроект в ранней альфа-стадии! Возможны существенные изменения функционала при выходе новых версий, которые всё сломают. Внимательно читайте описания к новым версиям!\n\n**Требуется помощь в написании документации.**\n\nПроект представляет набор нод (узлов) Node-RED для работы с Алисой от Яндекса без сторонних сервисов, напрямую с домашнего сервера. С требованиями можно ознакомиться [здесь](#требования).\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/node-demo.png\"\u003e\n\n## Благодарности\n\nЭто большой copy-paste из двух замечательный проектов [node-red-contrib-alice](https://github.com/efa2000/node-red-contrib-alice) и [yandex2mqtt](https://github.com/lasthead0/yandex2mqtt).\n\nСпасибо им за идею и реализацию.\n\n## Принцип работы\n\nКроме нод для работы с Алисой, релизованных в других замечательных проектах, node-red-contrib-alice-self-hosting средствами самого Node-RED создает веб-сервер для авторизации и обработки команд.\n\nВ итоге для работы не требуется ничего кроме самого Node-RED и работоспособность не зависит ни от каких сторонных сервисов — только Яндекса и домашнего сервера, что также весьма положительно влияет на скорость работы.\n\n# Безопасность\n\n\u003e The 'S' in IoT stands for Security\n\nНода **должна** быть спрятана за правильно настроенными сервисами типа nginx, traefik, caddy, ngrok, localtunnel, cloudflare и т.п., в противном случае любой может **получить полный доступ** к Node-RED. В случае, если доступ снаружи предоставлен ко всему Node-RED, необходимо добавить [авторизацию](https://nodered.org/docs/user-guide/runtime/securing-node-red#usernamepassword-based-authentication).\n\nСуществуют ноды для [ngrok](https://flows.nodered.org/node/node-red-contrib-ngrok) (версия на 21.12.2023 нода банит аккаунт, ждем решения (подробнее тут [issues/30](https://github.com/sammachin/node-red-contrib-ngrok/issues/30)) и [localtunnel](https://flows.nodered.org/node/node-red-contrib-localtunnel), которые позволяют получить доступ к установке Node-RED из интернета без проброса портов на роутере и установки дополнительного ПО. Самое простое решение — ngrok, так как помимо прочего даже в бесплатной версии позволяет автоматизировать получение TLS сертификата.\n\n# Требования\n\nДля работы требуется несколько обязательных условий:\n\n## Белый IP-адрес\n\nЕсли ваш роутер говорит что провайдер дал адрес из [этого диапазона](https://ru.wikipedia.org/wiki/Частный_IP-адрес) — он не белый.\n\nЯндекс требует постоянного доступа к машине с Node-RED из внешнего интернета и сделать с этим ничего нельзя.\n\n## Постоянный IP-адрес или собственный домен\n\nДомен может быть бесплатным и любым, например от [Duck DNS](https://www.duckdns.org) или любых других сервисов.\n\nЯндекс требует указать URL для ноды и если указать свой динамический IP, то после каждого переподключения к провайдеру потребуется заново настраивать навык Алисы.\n\n## Валидный TLS сертификат\n\nКоторый настроен для использования с Node-RED или обратным прокси-сервером. Бесплатный всегда можно получить у [LetsEncrypt](https://letsencrypt.org). Яндекс не позволяет использовать самоподписанные сертификаты.\n\n## Открытый порт и маршрут\n\nПри домашнем использовании необходимо на роутере открыть порт и создать маршрут до сервера с Node-RED (Эта манипуляция известна как *проброс порта*).\n\nБез этого Яндекс никак не сможет получить доступ к Node-RED.\n\n## Альтернативы\n\nСуществует несколько сервисов которые позволяют опубликовать в интернете локальное веб-приложение, но такие решения имеют существенные недостатки в увеличении времени отклика Алисы из-за того, что данные передаются через сторонний сервер (минимум плюс 30-200 мсек), а также возникает зависимость от стабильности работы выбранного сервиса.\n\n* [Ngrok](https://ngrok.com/) - самый популярный, это хорошее в своей простоте решение, так как снимает **все** вышеуказанные требования к белому IP-адресу, домену, настройке роутера и TLS-сертификата, существенно увеличивает безопасность.\n* [KeenDNS](https://help.keenetic.com/hc/ru/articles/360000400919-Сервис-доменных-имен-KeenDNS) - если у вас есть роутер Keenetic, но нет статического IP адреса, то сервис KeenDNS поможет вам получить удаленный доступ к вашему устройству. С его помощью вы можете легко включить поддержку DDNS прямо на вашем роутере. KeenDNS бесплатный и обеспечивает защищенное SSL соединение. Даже если ваш IP адрес не входит в «белый список», вы все равно сможете настроить KeenDNS без проблем. [Пример удаленного доступа к веб-приложениям домашней сети через KeenDNS](https://help.keenetic.com/hc/ru/articles/360000563719-Пример-удаленного-доступа-к-веб-приложениям-домашней-сети-через-KeenDNS)\n\n# Установка\n\n## Установка ноды\n\nОбычная установка из палитры Node-RED. После установки перезапуск **обязателен**, как и после любого обновления.\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/node-install.png\"\u003e\n\n## Настройка доступа для Яндекса\n\nЭто самое сложное в настройке и индивидуально для каждого пользователя.\n\nКонцепция такова:\n\n- домен `mydomain.ru` резолвит адрес домашнего роутера\n\n- роутер настроен на т.н. пробрасывание порта (TCP) до машины с установленным Node-RED\n\n    - настоятельнейше рекомендуется использовать обратный прокси-сервер (самый простой — Nginx Proxy Manager), при этом открыть доступ не к всему Node-RED, а только до определенного пути в нём — **WebHook URL** (см. ниже)\n\n    - если используется авторизация (белые списки и т.п.), она должна быть отключена до **WebHook URL**, этот адрес **и те, что глубже него** должны быть полностью открыты. Например `https://mydomain.ru/0123abcdef/webhook` и все что дальше — `https://mydomain.ru/0123abcdef/webhook/anything/absulutely/completely/any/url`. Всё что выше: `https://mydomain.ru/0123abcdef/` или `https://mydomain.ru/` должно быть закрыто, это прямой доступ к админке Node-RED для любого пользователя интернета\n\n- Node-RED создает **WebHook URL**, через который и происходит общение с Алисой\n\n- возможно использование ngrock, localtunnel или аналогичного сервиса. Стоит отметить что указанный способ *позволит избежать обязательного требования белого IP-адреса*.\n\n## Использование туннеля (сторонние сервисы)\n\n### ngrok\n\nСпециально для node-red-contrib-alice-self-hosting создан [ngrok flow для Node-RED](https://github.com/twocolors/node-red-contrib-alice-self-hosting/blob/master/examples/ngrock-flow.json). Не требует внешней установки пакетов и достаточно стабильно работает.\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/ngrok-flow.png\"\u003e\n\nТребует регистрации бесплатного аккаунта в сервисе [ngrok](https://dashboard.ngrok.com/), создания [постоянного домена](https://dashboard.ngrok.com/cloud-edge/domains) и [токена](https://dashboard.ngrok.com/get-started/your-authtoken). Так как в бесплатной версии доступны только один домен и один токен, рекомендуется зарегистрировать новый аккаунт ngrok для этой ноды.\n\nВся настройка сводится к указанию данных в ноде (кубике) `ngrok`: необходимо заполнить `authtoken`, `addr` и `domain`\n\n```\n\n// token from ngrok https://dashboard.ngrok.com/get-started/your-authtoken\nconst authtoken = \"YOUR_TOKEN_HERE\";\n// server and port ('localhost:1880' or '1880')\nconst addr = \"1880\";\n// static domain https://dashboard.ngrok.com/cloud-edge/domains\nconst domain = \"YOUR_NGROK_DOMAIN_HERE.ngrok-free.app\";\n\n```\n\nПосле этого сделать deploy и отправить \"Start tunnel\". **Внимание! Сразу после этого любой может получить доступ к Node-RED**, поэтому стоит озаботиться [настройкой авторизации](https://nodered.org/docs/user-guide/runtime/securing-node-red#usernamepassword-based-authentication) заранее.\n\nНеобходимый для Яндекса **Endpoint URL** будет выглядеть как `https://YOUR_NGROK_DOMAIN_HERE.ngrok-free.app/abcd000000/webhook` (комбинация из домена ngrok и **WebHook URL** из настроек ноды). Так как выше мы указали порт Node-RED (1880), указывать его в **Endpoint URL** не требуется, ngrok пробрасывает его из 1880 в 443.\n\n## Примеры настройки reverse proxy\n\nПримеры настройки обратного прокси-сервера. Адрес сервера Node-RED `192.168.0.2`, порт `1880`, домен `alice.mydomain.ru` указывает на внешний IP-адрес (роутера), на роутере проброшен порт 443 (https) до сервера с traefik (во всех примерах он установлен на том же сервере `192.168.0.2`).\n\nПодразумевается, что уже получен TLS сертификат для домена от letsencrypt или аналогичного сервиса (в примере используется wildcard сертификат для всех поддоменов `*.example.ru`, в реальных условиях и при использовании [DDNS](https://ru.wikipedia.org/wiki/Динамический_DNS) можно использовать любой домен, например `ursecretdomain.duckdns.org`). Почти все современные обратные прокси-серверы позволяют существенно упростить этот процесс и автоматически продлевать бесплатные сертификаты.\n\n### Traefik\n\nВ этом примере соблюдены требования безопасности — доступен только Webhook URL, Node-RED закрыт от доступа снаружи.\n\n\u003cdetails\u003e\n  \u003csummary\u003eНастройка для Traefik в файле конфигурации\u003c/summary\u003e\n\n```\nhttp:\n  routers:\n    nodered-alice:\n      entrypoints:\n        - websecure\n      rule: Host(`alice.mydomain.ru`) \u0026\u0026 PathPrefix(`/0123abcdef/webhook`)\n      service: nodered-alice\n      tls: true\n\nservices:\n    nodered-alice:\n      loadBalancer:\n        servers:\n        - url: \"http://192.168.0.2:1880\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eНастройка для Traefik через labels в docker compose\u003c/summary\u003e\n\n```\nlabels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.nodered-alice.rule=Host(`alice.mydomain.ru`) \u0026\u0026 PathPrefix(`/0123abcdef/webhook`)\"\n      - \"traefik.http.routers.nodered-alice.entrypoints=websecure\"\n      - \"traefik.http.routers.nodered-alice.tls.certResolver=letsencrypt\"\n      - \"traefik.http.services.nodered-alice.loadbalancer.server.port=1880\"\n```\n\n\u003c/details\u003e\n\n### Nginx proxy manager\n\n[Nginx proxy manager](https://nginxproxymanager.com) — самый простой и дружелюбный из всех обратных прокси и не требует работы в консоли, все настройки осуществляются через веб-интерфейс.\n\n\u003cdetails\u003e\n  \u003csummary\u003eПример настройки\u003c/summary\u003e\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/npm-new-proxy.png\" width=40% align=top\u003e \u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/npm-ssl.png\" width=40% align=top\u003e\n\nВнимание! Эти настройки **не ограничивают доступ к Node-RED**! Любой пользователь может получить полный доступ к панели управления по адресу `https://alice.mydomain.ru`.\n\n\u003c/details\u003e\n\n\n### Caddy\n\n**TBD**\n\n## Получение WebHook URL\n\nПосле перезапуска перетаскиваем любую ноду на сетку и в свойствах нового узла (Credentials) запоминаем адрес (**WebHook URL**) из примечания (вида `http://192.168.0.2:1880/0123abcdef/webhook`). Это тот самый адрес который должен быть доступен из интернета для Яндекса.\n\nДля большей гибкости и в случае отсутствия reverse proxy **настоятельно рекомендуется** изменить порт на отличный от стандартного порта Node-RED (1880). Часть URL вида `0123abcdef` генерируется случайно для каждого пользователя, её тоже можно изменить если в одной инсталяции Node-RED используется несколько аккаунтов Яндекса (например несколько \"домов\").\n\nРеализация OAuth использует сервис [Яндекс](https://oauth.yandex.ru) подробнее на [Хабре](https://habr.com/ru/amp/publications/710366/)\n\n## Создание OAuth\n\n- [Здесь](https://oauth.yandex.ru) создаем новое приложение.\n\n    - *Для каких платформ нужно приложение* — Веб-сервисы\n\n    - *Доступ к данным* — что угодно, можно оставить только \"Доступ к портрету пользователя\"\n\n    - *Redirect URI* — `https://social.yandex.net/broker/redirect`\n\n    - *Почта для связи* — почта для связи\n\n- Сохраняем **ClientID** и **Client secret**\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/oauth.png\"\u003e\n\n\n- Создаем **Приватный** диалог на [Яндекс](https://dialogs.yandex.ru)\n\n    - *Тип диалога* — Умный дом\n\n    - *Название* — любое\n\n    - *Backend* — *Endpoint URL* — адрес из ноды (**WebHook URL**)\n\n    - *Тип доступа* — Приватный\n\n    - Остальные поля со звездочкой — на свой вкус\n\n    - В разделе *Связка аккаунтов*\n\n        - *Идентификатор приложения* — ранее полученный **ClientID**\n\n        - *Секрет приложения* — ранее полученный **Client secret**\n\n        - *URL авторизации* — `https://oauth.yandex.ru/authorize`\n\n        - *URL для получения токена* — `https://oauth.yandex.ru/token`\n\n        - *URL для обновления токена* — `https://oauth.yandex.ru/token`\n\n\u003cimg src=\"https://github.com/twocolors/node-red-contrib-alice-self-hosting/raw/master/readme/dialogs.png\"\u003e\n\n## Настройки ноды\n\n**TBD**\n\n# Настройка сети\n\nСервер с Node-RED или с reverse proxy должны быть доступны из интернета.\n\n**TBD**\n\n## OpenWRT\n\n**TBD**\n\n## Keenetic\n\nНастройки — Сетевые правила — Переадресация — Правила переадресации портов — Добавить правило\n\nВыход: *Выбрать из списка устройств сервер с Node-RED или reverse proxy*\n\nОткрыть порт: *Порт, к которому будет открыт доступ извне, рекомендуется использовать случайный из диапазона 40000-50000, но можно использовать и стандартный 443 (https)*\n\nПорт назначения: *Порт Node-RED (1880) или порт, который слушает reverse proxy*\n\n## TP-Link\n\n**TBD**\n\n# Использование\n\n## Создание устройства\n\n**TBD**\n\n\u003cdetails\u003e\n  \u003csummary\u003eПримеры\u003c/summary\u003e\n\n## Примеры\n\n### on_off\n\n### toggle\n\n### range\n\n### color\n\n### mode\n\n### sensor\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwocolors%2Fnode-red-contrib-alice-self-hosting","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwocolors%2Fnode-red-contrib-alice-self-hosting","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwocolors%2Fnode-red-contrib-alice-self-hosting/lists"}