Установка 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 = "...":
read -rs CLOUDFLARE_API_TOKEN && export CLOUDFLARE_API_TOKENТокен нужен только команде на вашем компьютере; развёрнутая панель его не получает. Закончив, удалите токен в панели Cloudflare, а для следующего деплоя создайте новый.
Деплой#
Сначала посмотрите план. --dry-run только читает из Cloudflare (токен, зону, существующие скрипты и базы), проверяет пакет и печатает, что сделал бы настоящий запуск. Он не создаёт ни файла, ни чего-либо в Cloudflare:
mistgate edge deploy --host panel.example.com --dry-runЗатем запустите по-настоящему:
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.
Запуск выполняет такие шаги по порядку и останавливается на первой ошибке:
- Скачивает пакет и проверяет его подпись.
- Проверяет токен и находит аккаунт и зону хоста.
- Отказывается продолжать, если Worker-скрипт или база D1 с таким именем уже есть, а файла с ключами нет: он не присваивает и не заменяет то, что не может открыть своими ключами.
- Записывает файл с ключами (см. ниже) до того, как что-либо создаст.
- Создаёт базу D1.
- Загружает шесть скриптов в таком порядке: link, provision, public, admin, jobs, а последним передний Worker, чтобы скрипт уже существовал, когда его привязывает другой. В самый первый раз передний Worker загружается раньше всех и без привязок к остальным, потому что Worker link привязывает его Durable Objects; в конце он загружается снова, уже с привязками. Статические файлы админки уходят вместе с public и admin. Секреты уходят вместе со скриптами:
MASTER_KEYв пять скриптов, которые запускают панель, а секретный путь админки, путь подписок и хеш токена настройки — только в admin. Скрипт, содержимое которого такое же, как при прошлом запуске, заново не загружается. - Сразу после загрузки каждого скрипта выключает его имя
workers.devи preview-адреса, ставит на скрипте jobs cron-триггер раз в минуту и привязываетpanel.example.comк переднему Worker'у как custom domain. DNS-запись и сертификат создаёт Cloudflare. - До пяти минут ждёт ответа страницы-ширмы
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:
mistgate edge deploy --host panel.example.comОна читает файл с ключами, поэтому ключи, база и секретные пути остаются. Она загружает скрипты, содержимое которых изменилось (релиз, не затрагивающий передний Worker, не перезапускает соединения агентов), применяет новые миграции Durable Objects и выпускает новый токен настройки, который можно игнорировать (поэтому admin загружается каждый раз). Пакет старше развёрнутого отклоняется до всякой загрузки. Пока заменяется передний Worker, подключённые агенты переподключаются сами, а идущая SSH-установка повторяется (на третьем прерывании она завершается ошибкой). Файл ключей перезаписывается с новой версией пакета; мастер-ключ остаётся, поэтому прежняя копия файла по-прежнему открывает всё. Сначала прочитайте заметки к релизу: резервной копии базы, к которой можно вернуться, нет, а откат базу не трогает.
Откат#
Если обновление работает плохо, запустите это из каталога с файлом ключей:
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 | После первого деплоя ничего не обновлялось, поэтому прежняя версия не записана. Для отката нужно обновление, от которого возвращаться. |
Дальше#
Добавление ноды, затем Первые пользователи. Остальные страницы руководства применимы, кроме возможностей из списка выше. Как устроены части: Архитектура.