mistgate Документация
RU

Установка Cloudflare-версии

Как запустить панель на Cloudflare Workers вместо сервера командой mistgate edge deploy: что нужно, API-токен, файл с ключами, который обязательно сохранить, первый вход и что пока недоступно. Предварительная версия.

На этой странице

Cloudflare-версия — это та же панель, собранная под WebAssembly и запущенная в шести Cloudflare Workers с базой D1, а не бинарником на вашем Linux-сервере. Одна команда, mistgate edge deploy, создаёт всё нужное в вашем аккаунте Cloudflare. Ноды остаются вашими серверами, и добавляются из админки как обычно. Страница ведёт от аккаунта Cloudflare до аккаунта владельца в админке. В примерах — panel.example.com.

Внимание

эта версия — предварительная. mistgate edge deploy и панель проверены на имитации Cloudflare, но ещё не на настоящем аккаунте (это следующий раунд работы). Edge-пакет входит в релизы начиная с v0.1.36. Не переносите сюда панель, от которой зависят люди. Часть возможностей пока недоступна: см. ниже «Что пока недоступно». Если нужна панель, на которую можно положиться уже сегодня, используйте Установку панели.

Требования#

Что Требование
Тариф Cloudflare Workers Paid. На Workers Free запрос может потратить всего 10 мс CPU и сделать 50 подзапросов, а один только холодный старт панели (загрузка панели в виде WebAssembly) стоит около 125–254 мс, так что она не помещается. D1 и Durable Objects Cloudflare считает по использованию; сколько стоит панель на настоящем аккаунте, пока не измерено.
Домен Имя хоста, например panel.example.com, внутри зоны, которая на DNS Cloudflare и активна. Команда ищет зону хоста в аккаунтах, которые видит токен, и останавливается до того, как что-либо создаст, если зоны нет или она ещё не активна (её серверы имён уже должны указывать на Cloudflare). Берите имя, у которого ещё нет DNS-записи: запись для custom domain Worker'а Cloudflare добавляет сам, а что он делает с уже существующей записью, не проверялось.
Команда mistgate, тот же бинарник, что и панель, на любом компьютере с доступом в интернет к api.cloudflare.com и github.com. Официальные бинарники релиза — для Linux (amd64 и arm64); на macOS и Windows соберите его из исходников (см. Требования).
Релиз с edge-пакетом Команда скачивает mistgate-edge.tar.gz и подписанный манифест из релиза на GitHub своей версии и сверяет их с ключом релиза, вшитым в бинарник, до любой загрузки в Cloudflare. Ни в одном релизе пока нет этого пакета. Сборке для разработки нужно указать пакет через --version или --bundle. См. Релизы и подпись.
Ноды Те же, что для любой панели: см. Требования. Агенты подключаются к panel.example.com по HTTPS (WebSocket), поэтому ноде нужен только исходящий TCP 443 к нему.

Создайте API-токен#

Команда обращается к API Cloudflare с токеном, который создаёте вы. В панели Cloudflare откройте My Profile → API Tokens → Create Token → Create Custom Token и дайте ему такие права:

Область Право Для чего оно команде
Account Account Settings: Read GET /accounts, первый вызов: перечисляет аккаунты, которые видит токен, и заодно проверяет сам токен.
Zone Zone: Read GET /zones: находит зону хоста.
Account Workers Scripts: Edit Перечисляет скрипты и читает их развёртывания, загружает все шесть вместе со статическими файлами, ставит расписание cron, выключает имя workers.dev и при откате возвращает прежние версии (/workers/scripts/...). Одного права хватает на все шесть скриптов.
Account D1: Edit Находит или создаёт базу (/d1/database).
Zone Workers Routes: Edit Привязывает хост к переднему Worker'у как custom domain (PUT /workers/domains).

В Account Resources выберите свой аккаунт, а в Zone Resources — одну зону хоста.

Важно

этот список выведен из вызовов API, которые делает команда. На настоящем аккаунте он не подтверждён; точный минимум станет известен только после первого настоящего деплоя. Если команда остановится из-за нехватки прав, сообщение назовёт вызов. Вероятнее всего не хватит прав для custom domain: ему может понадобиться ещё Zone: DNS: Edit; добавьте право и запустите команду снова с --resume.

Передавайте токен команде только через переменную окружения CLOUDFLARE_API_TOKEN. Флага для него нет, поэтому токен не виден в списке процессов, а команда не записывает его ни в файл с ключами, ни в Cloudflare; в сообщениях об ошибках он заменяется на [REDACTED]. В bash строка ниже заодно не оставляет токен в истории; в PowerShell задайте $env:CLOUDFLARE_API_TOKEN = "...":

Shell
read -rs CLOUDFLARE_API_TOKEN && export CLOUDFLARE_API_TOKEN

Токен нужен только команде на вашем компьютере; развёрнутая панель его не получает. Закончив, удалите токен в панели Cloudflare, а для следующего деплоя создайте новый.

Деплой#

Сначала посмотрите план. --dry-run только читает из Cloudflare (токен, зону, существующие скрипты и базы), проверяет пакет и печатает, что сделал бы настоящий запуск. Он не создаёт ни файла, ни чего-либо в Cloudflare:

Shell
mistgate edge deploy --host panel.example.com --dry-run

Затем запустите по-настоящему:

Shell
mistgate edge deploy --host panel.example.com
Флаг По умолчанию Значение
--host нет, обязателен Публичное имя панели без схемы, порта и пути.
--name mistgate-edge Имя переднего скрипта Worker и базы D1; остальные пять называются <name>-link, <name>-public, <name>-admin, <name>-jobs и <name>-provision. Другое имя позволяет держать вторую панель в том же аккаунте.
--d1-location weur Где D1 должен хранить базу: wnam, enam, weur, eeur, apac или oc. Подсказка для Cloudflare; выберите ближайший к вам регион.
--version релиз самого бинарника Какой edge-релиз скачать, vX.Y.Z.
--bundle нет Каталог с уже лежащим на диске edge-пакетом (mistgate-edge.tar.gz, edge-manifest.json, edge-manifest.sig) вместо скачивания. Вместе с --version нельзя.
--resume выкл. Продолжить остановившийся запуск по файлу с ключами. См. ниже.
--dry-run выкл. Напечатать запланированные вызовы (имена привязок, без значений); читать из Cloudflare, ничего не менять.
--rollback выкл. Вернуть каждый Worker на версию, которая была до последнего обновления. См. «Откат» ниже.
--insecure-skip-signature выкл. Для пакета разработки, который вы собрали сами, только вместе с --bundle: пропускает проверку подписи и печатает предупреждение. Не применяйте к пакету, который собрали не вы.

Панель — это шесть Worker'ов. Домен только у первого; у остальных нет своего адреса, и к ним обращаются через него:

  • <name>, передний Worker: небольшой маршрутизатор без WebAssembly. Он отправляет каждый запрос одному из остальных по пути и владеет Durable Objects, к которым подключаются агенты нод.
  • <name>-public: подписки, страница пользователя и сайт-ширма.
  • <name>-link: сторона панели в канале агентов.
  • <name>-admin: админка и её API. Только он создаёт панель в пустой базе.
  • <name>-jobs: задача, которую раз в минуту запускает cron-триггер.
  • <name>-provision: установка нод по SSH.

Все шесть используют одну базу D1.

Запуск выполняет такие шаги по порядку и останавливается на первой ошибке:

  1. Скачивает пакет и проверяет его подпись.
  2. Проверяет токен и находит аккаунт и зону хоста.
  3. Отказывается продолжать, если Worker-скрипт или база D1 с таким именем уже есть, а файла с ключами нет: он не присваивает и не заменяет то, что не может открыть своими ключами.
  4. Записывает файл с ключами (см. ниже) до того, как что-либо создаст.
  5. Создаёт базу D1.
  6. Загружает шесть скриптов в таком порядке: link, provision, public, admin, jobs, а последним передний Worker, чтобы скрипт уже существовал, когда его привязывает другой. В самый первый раз передний Worker загружается раньше всех и без привязок к остальным, потому что Worker link привязывает его Durable Objects; в конце он загружается снова, уже с привязками. Статические файлы админки уходят вместе с public и admin. Секреты уходят вместе со скриптами: MASTER_KEY в пять скриптов, которые запускают панель, а секретный путь админки, путь подписок и хеш токена настройки — только в admin. Скрипт, содержимое которого такое же, как при прошлом запуске, заново не загружается.
  7. Сразу после загрузки каждого скрипта выключает его имя workers.dev и preview-адреса, ставит на скрипте jobs cron-триггер раз в минуту и привязывает panel.example.com к переднему Worker'у как custom domain. DNS-запись и сертификат создаёт Cloudflare.
  8. До пяти минут ждёт ответа страницы-ширмы https://panel.example.com/ и печатает ссылки.

Workers Logs у всех шести скриптов выключены.

Файл с ключами#

Команда записывает mistgate-edge-<name>.json в текущий каталог (mistgate-edge-mistgate-edge.json при имени по умолчанию) и печатает его полный путь. В нём лежит всё, что нельзя прочитать обратно из Cloudflare: мастер-ключ панели, секретный путь админки и путь подписок, токен настройки, а также идентификаторы вашего аккаунта, зоны и базы. После обновления в нём записана и версия, которая была у каждого скрипта до него, — для отката.

Внимание

сохраните этот файл сразу, как команда напечатает путь: положите копию в менеджер паролей или на зашифрованный диск. Cloudflare не показывает секрет повторно после того, как он задан. Если файл потерян, потерян и мастер-ключ, а с ним всё, что панель запечатала в базе (сохранённые SSH-пароли, ключи устройств, CA флота); и последующий deploy откажется трогать созданные им скрипты и базу, потому что у него больше нет их ключей. Кто получит файл, тот сможет открыть то, что запечатывает панель, поэтому не кладите его в репозиторий или общую папку.

В Linux и macOS файл создаётся с правами 0600. В Windows режим доступа не применяется: файл наследует права папки, поэтому держите его в личной папке (команда об этом предупреждает). --resume ищет файл в каталоге, из которого вы запускаете команду, а setup-link принимает его путь.

Если запуск остановился на середине (ошибка сети, Ctrl+C, ошибка Cloudflare), ничего не откатывается, а файл с ключами остаётся. Устраните причину и запустите ту же команду снова с --resume: она прочитает файл и записанную в нём версию пакета и продолжит с теми же ключами и тем же токеном настройки; скрипты, которые уже загружены, заново не загружаются. Без --resume запуск, нашедший файл с ключами, считается обновлением (см. ниже).

После деплоя#

Команда печатает, где лежит файл с ключами, адрес админки (https://panel.example.com/ и секретный путь из 24 случайных символов) и одноразовую ссылку настройки:

Текст
Admin URL: https://panel.example.com/<secret path>/
Setup link (one-time; the token is valid for 30 minutes from the panel's first start): https://panel.example.com/<secret path>/setup#<token>

Адрес админки секретный намеренно, как в режиме секретного пути у панели на VPS: остальные, открыв хост, видят только сайт-ширму. Сохраните адрес; он есть и в файле с ключами.

Откройте ссылку настройки в браузере и создайте аккаунт владельца, как в Установке панели (шаг 8, «Первый вход»). Панель впервые стартует при первом запросе или первом тике cron, на практике в течение минуты после загрузки, и токен действует 30 минут с этого момента. Часть после # никогда не попадает на сервер.

Если ссылка истекла или вы закрыли страницу до создания аккаунта:

  • mistgate edge setup-link --file mistgate-edge-mistgate-edge.json печатает сохранённую ссылку ещё раз. В ней тот же токен, так что это помогает при потерянной ссылке, но не при истёкшей.
  • Для нового токена запустите mistgate edge deploy --host panel.example.com снова без --resume: он ещё раз загрузит тот же пакет и выпустит новый токен настройки. Это работает, только пока нет администратора; ссылка панели, у которой уже есть владелец, ничего не делает.

Если последняя строка вывода говорит, что хост ещё не ответил HTTP 200, Cloudflare, скорее всего, ещё выпускает сертификат custom domain. Сам деплой закончен: откройте ссылку через несколько минут.

Добавьте ноды#

Добавляйте ноды в Ноды → Добавить ноду как на панели на VPS; см. Добавление ноды. Установка по SSH работает и в этой версии, со следующими отличиями (подробности — в Установке ноды по SSH):

  • Панель подключается к новому серверу из сети Cloudflare, поэтому SSH на сервере на время установки должен принимать подключения из интернета, а не только с вашего адреса.
  • Панель отказывается от адресов, принадлежащих Cloudflare или спрятанных за его прокси, от частных сетей и от серверов, доступных только через VPN. Мастер пишет «Сеть панели отказала в соединении с этим адресом, или сервер из неё недоступен». Используйте собственный публичный адрес сервера или имя без проксирования (DNS only).
  • Если SSH так не работает или сервер принимает только SSH-ключи, используйте команду установки вручную. Мастер предлагает её рядом с ошибкой. Агент подключается к панели сам, поэтому работает из любой сети, которая достаёт до panel.example.com.

Что пока недоступно#

В местах из списка ниже админка пишет «Пока недоступно в Cloudflare-версии», и вызов, который запустил бы такую работу, отклоняется теми же словами. Всё остальное работает как на панели на VPS: ноды, профили, пользователи, подписки и страница пользователя, доктор нод и установка по SSH.

Возможность Чего не хватает
Резервные копии Нет зашифрованных резервных копий и восстановления. Собственное восстановление D1 у Cloudflare (Time Travel) может вернуть базу, но с панелью это не проверялось. Берегите файл с ключами.
Уведомления в Telegram Сообщения не отправляются.
MCP и API-токены MCP-сервер не отдаётся. Уже выданные токены видны и отзываются; новые создать нельзя.
Проверки туннелей Проверки туннелей серверов, которые делает панель, и построенные на них оповещения не работают.
Обновление нод Панель не обновляет агентов нод: нет раскатки и обновлений по расписанию.
Логи ноды Живой лог агента ноды не показывается.
Обновление панели Самообновления нет: обновляйте, запустив команду снова (ниже).
Свой сайт-ширма ноды Вариант сайта-ширмы Свой сайт недоступен: эта версия не хранит загруженные наборы файлов.
ТСПУ-зонд ТСПУ-зонд проверки из страны не работает: запуск идёт минуты, а у плановых задач этой редакции секунды. Карточка пишет, что он недоступен. Globalping и списки блокировок работают.

Ограничения этой версии, важные для устройств:

  • У каждого устройства на каждой ноде свои ключи, а то, что панель отправила ноде, она помнит в одной строке D1, размер которой D1 ограничивает 2 МБ. Это около 38 000 учёток на ноду, то есть примерно 7 500 человек с двумя протоколами по ссылке при среднем 2,5 устройства (около 19 000 человек, пока у устройств не было своих ключей). Когда строка проходит 1,5 МБ, панель один раз на ноду пишет предупреждение в лог.
  • Почасовая очистка делает ещё один вызов D1 (стирает старые удалённые устройства).

Регистрация WARP-аккаунта из панели тоже недоступна и завершается ошибкой «WARP registration is unavailable in this edition»; админка пока это не отмечает.

Обновление#

Скачайте новый mistgate (или передайте --version vX.Y.Z) и запустите команду снова с теми же --host и --name, из каталога с файлом ключей, без --resume:

Shell
mistgate edge deploy --host panel.example.com

Она читает файл с ключами, поэтому ключи, база и секретные пути остаются. Она загружает скрипты, содержимое которых изменилось (релиз, не затрагивающий передний Worker, не перезапускает соединения агентов), применяет новые миграции Durable Objects и выпускает новый токен настройки, который можно игнорировать (поэтому admin загружается каждый раз). Пакет старше развёрнутого отклоняется до всякой загрузки. Пока заменяется передний Worker, подключённые агенты переподключаются сами, а идущая SSH-установка повторяется (на третьем прерывании она завершается ошибкой). Файл ключей перезаписывается с новой версией пакета; мастер-ключ остаётся, поэтому прежняя копия файла по-прежнему открывает всё. Сначала прочитайте заметки к релизу: резервной копии базы, к которой можно вернуться, нет, а откат базу не трогает.

Откат#

Если обновление работает плохо, запустите это из каталога с файлом ключей:

Shell
mistgate edge deploy --host panel.example.com --rollback

Прежде чем обновление что-либо загрузит, команда записывает в файл ключей активную версию каждого из шести скриптов и его расписание cron. --rollback возвращает их через развёртывания Cloudflare: сначала передний Worker, затем остальные в порядке, обратном загрузке, и восстанавливает расписания. Он использует тот же токен, не принимает пакет и ничего не загружает; вместе с --dry-run он только перечисляет, что вернул бы. У скрипта, который создало последнее обновление, прежней версии нет, и он остаётся как есть.

  • База D1 не откатывается. Релиз должен менять её схему только добавлением, поэтому версия до обновления на ней по-прежнему работает.
  • Откат возвращает на одно обновление: файл ключей хранит версии, предшествовавшие последнему новому пакету. После первого деплоя возвращаться некуда.
  • Следующий mistgate edge deploy загрузит все шесть скриптов заново.

Переезд между панелью на VPS и edge#

Пока не поддерживается. Перенести пользователей, ноды и ссылки подписок с панели на VPS на edge или обратно нельзя: резервную копию панели на VPS на edge не восстановить, а нодам нельзя сообщить новый адрес панели. Выбирайте версию для нового флота или планируйте создать пользователей заново и заново подключить каждую ноду. Переезд в обе стороны с сохранением рабочих ссылок подписок запланирован, но не сделан.

Если команда остановилась#

Команда пишет Что делать
CLOUDFLARE_API_TOKEN is required Задайте переменную в той же оболочке.
list Cloudflare accounts: ... Токен неверный, истёк или у него нет Account Settings: Read. Создайте его заново, как описано выше.
no Cloudflare DNS zone matches host panel.example.com; the host's zone must be on Cloudflare DNS Добавьте домен в Cloudflare, направьте на него серверы имён и берите хост внутри этой зоны.
the Cloudflare zone example.com has status "pending", not "active" Закончите перенос серверов имён домена на Cloudflare и запустите команду снова.
a Worker script with this name already exists but its local key file is missing; refusing to replace its secrets Файла с ключами нет в этом каталоге. Найдите его или выберите другой --name (старые скрипты и база останутся в аккаунте; удалите их в панели Cloudflare, если они не нужны). База D1 с таким именем даёт тот же отказ.
this is a development build with no release version: pass --version vX.Y.Z or --bundle DIR Укажите команде, какой пакет использовать.
the deployed script is at migration ..., which this bundle does not know Пакет старше развёрнутого. Возьмите более новый релиз.
--resume requires the local deployment file ... В текущем каталоге нет файла с ключами для этого --name.
nothing to roll back: the local deployment file records no earlier version После первого деплоя ничего не обновлялось, поэтому прежняя версия не записана. Для отката нужно обновление, от которого возвращаться.

Дальше#

Добавление ноды, затем Первые пользователи. Остальные страницы руководства применимы, кроме возможностей из списка выше. Как устроены части: Архитектура.

Править страницу на GitHub