Skip to main content
Цель: Gateway OpenClaw, работающий на машине Fly.io с постоянным хранилищем, автоматическим HTTPS и доступом через Discord/каналы.

Что потребуется

  • Установленный CLI flyctl
  • Учетная запись Fly.io (подойдет бесплатный тариф)
  • Аутентификация модели: ключ API выбранного поставщика модели
  • Учетные данные каналов: токен бота Discord, токен Telegram и т. д.

Быстрый путь для начинающих

  1. Клонируйте репозиторий, настройте fly.toml
  2. Создайте приложение и том, задайте секреты
  3. Разверните с помощью fly deploy
  4. Подключитесь по SSH, чтобы создать конфигурацию, или используйте интерфейс управления
1

Создайте приложение Fly

Выберите ближайший к вам регион. Распространенные варианты: lhr (Лондон), iad (Вирджиния), sjc (Сан-Хосе).
2

Настройте fly.toml

Отредактируйте fly.toml в соответствии с именем приложения и вашими требованиями. Отслеживаемый в репозитории файл fly.toml — это показанный ниже общедоступный шаблон; deploy/fly.private.toml — усиленный вариант без общедоступного IP-адреса (см. Закрытое развертывание).
Точкой входа Docker-образа OpenClaw служит tini, которая по умолчанию запускает node openclaw.mjs gateway. Fly [processes] заменяет Docker CMD (здесь он напрямую запускает node dist/index.js gateway ..., ту же скомпилированную точку входа), не затрагивая ENTRYPOINT, поэтому процесс по-прежнему выполняется от имени tini.Основные параметры:
3

Задайте секреты

Для привязок не к loopback-интерфейсу (--bind lan) требуется действующий способ аутентификации Gateway. В этом примере используется OPENCLAW_GATEWAY_TOKEN, но требованию также удовлетворяет gateway.auth.password или правильно настроенное развертывание с доверенным прокси и привязкой не к loopback-интерфейсу. Контракт SecretRef описан в разделе Управление секретами.Обращайтесь с этими токенами как с паролями. Для ключей API и токенов предпочитайте переменные среды/fly secrets файлу конфигурации, чтобы секреты не попадали в openclaw.json.
4

Разверните

При первом развертывании создается Docker-образ. После развертывания выполните проверку:
После запуска HTTP/WebSocket-прослушивателя Gateway записывает в журнал gateway ready. Собственная проверка работоспособности Fly отслеживает internal_port = 3000 согласно fly.toml; директива Docker HEALTHCHECK образа дополнительно опрашивает /healthz на порте по умолчанию 18789, который здесь не используется, поскольку в этом развертывании порт Gateway переопределен на --port 3000.
5

Создайте файл конфигурации

Подключитесь к машине по SSH, чтобы создать правильную конфигурацию:
При OPENCLAW_STATE_DIR=/data путь к конфигурации — /data/openclaw.json.Замените https://my-openclaw.fly.dev реальным источником приложения Fly. При запуске Gateway локальные источники интерфейса управления инициализируются значениями среды выполнения --bind и --port, чтобы первая загрузка могла пройти до создания конфигурации, однако для доступа из браузера через Fly по-прежнему необходимо указать точный источник HTTPS в gateway.controlUi.allowedOrigins.Токен Discord можно получить одним из следующих способов:
  • Переменная среды DISCORD_BOT_TOKEN (рекомендуется для секретов); добавлять ее в конфигурацию не требуется — Gateway считывает ее автоматически
  • Файл конфигурации channels.discord.token
Перезапустите, чтобы применить изменения:
6

Получите доступ к Gateway

Интерфейс управления

Или откройте https://my-openclaw.fly.dev/.Выполните аутентификацию с помощью настроенного общего секрета: токена Gateway из OPENCLAW_GATEWAY_TOKEN или пароля, если вы перешли на аутентификацию по паролю.

Журналы

Консоль SSH

Устранение неполадок

«Приложение не прослушивает ожидаемый адрес»

Gateway привязан к 127.0.0.1 вместо 0.0.0.0. Исправление: добавьте --bind lan в команду процесса в fly.toml.

Проверки работоспособности завершаются с ошибкой / в подключении отказано

Fly не может обратиться к Gateway через настроенный порт. Исправление: убедитесь, что internal_port соответствует порту Gateway (--port 3000 или OPENCLAW_GATEWAY_PORT=3000).

OOM / проблемы с памятью

Контейнер постоянно перезапускается или принудительно завершается. Признаки: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration или перезапуски без сообщений. Исправление: увеличьте объем памяти в fly.toml:
Или обновите существующую машину:
512 МБ недостаточно. 1 ГБ может работать, но при нагрузке или подробном журналировании возможен OOM. Рекомендуется 2 ГБ.

Проблемы с блокировкой Gateway

После перезапуска контейнера Gateway отказывается запускаться с ошибками «уже запущен». Файлы блокировки среды выполнения находятся в <tmpdir>/openclaw-<uid>/gateway.<hash>.lock и gateway.state.<hash>.lock (Linux: /tmp/openclaw-<uid>/gateway.*.lock), а не на постоянном томе /data, поэтому при полном перезапуске контейнера они обычно удаляются вместе с остальной файловой системой контейнера. Если блокировка сохраняется (например, при fly machine restart, который сохраняет файловую систему контейнера) и препятствует запуску, удалите ее вручную:

Конфигурация не считывается

--allow-unconfigured только обходит проверку при запуске. Этот параметр не создает и не исправляет /data/openclaw.json, поэтому убедитесь, что реальная конфигурация существует и содержит "gateway": { "mode": "local" } для обычного запуска локального Gateway. Убедитесь, что конфигурация существует:

Запись конфигурации через SSH

fly ssh console -C не поддерживает перенаправление оболочки. Чтобы записать файл конфигурации:
fly sftp может завершиться с ошибкой, если файл уже существует; сначала удалите его:

Состояние не сохраняется

Если после перезапуска исчезают профили аутентификации, состояние каналов/поставщиков или сеансы, каталог состояния записывается в файловую систему контейнера, а не на том. Исправление: убедитесь, что OPENCLAW_STATE_DIR=/data задан в fly.toml, и повторите развертывание.

Обновление

git pull + fly deploy — контролируемый способ обновления в этом случае: он заново собирает образ из Dockerfile, поэтому версия CLI/Gateway, базовый образ ОС и все изменения Dockerfile обновляются вместе. openclaw update внутри работающего контейнера выполняет другую операцию, поскольку образ поставляется в виде созданного Docker дерева dist/ без рабочей копии .git и без глобальной установки под управлением npm, которую эта команда могла бы обнаружить; соответствующий процесс для установок в стиле виртуальной машины описан в разделе Обновление.

Обновление команды машины

Чтобы изменить команду запуска без полного повторного развертывания:
Последующий fly deploy сбрасывает команду машины до значения из fly.toml; после повторного развертывания примените изменения вручную еще раз.

Закрытое развертывание (усиленное)

По умолчанию Fly выделяет общедоступные IP-адреса, поэтому ваш Gateway доступен по адресу https://your-app.fly.dev и может быть обнаружен интернет-сканерами (Shodan, Censys и т. д.). Используйте deploy/fly.private.toml для усиленного развертывания без общедоступного IP-адреса: этот вариант не содержит [http_service], поэтому общедоступный входящий доступ не выделяется.

Когда использовать закрытое развертывание

  • Только исходящие вызовы/сообщения (без входящих Webhook)
  • Туннели ngrok или Tailscale обрабатывают все обратные вызовы Webhook
  • Доступ к Gateway выполняется через SSH, прокси или WireGuard, а не через браузер
  • Развертывание должно быть скрыто от интернет-сканеров

Настройка

Или преобразуйте существующее развертывание:
После этого fly ips list должна отображать только IP-адрес типа private:

Доступ к приватному развертыванию

Вариант 1: локальный прокси (самый простой)
Вариант 2: VPN WireGuard
Вариант 3: только SSH

Webhook при приватном развертывании

Для обратных вызовов Webhook (Twilio, Telnyx и т. д.) без публичного доступа:
  1. туннель ngrok: запустите ngrok внутри контейнера или как вспомогательный контейнер
  2. Tailscale Funnel: предоставьте доступ к определенным путям через Tailscale
  3. Только исходящие подключения: некоторые провайдеры (Twilio) поддерживают исходящие вызовы без Webhook
Пример конфигурации голосовых вызовов с ngrok в разделе plugins.entries.voice-call.config:
Туннель ngrok работает внутри контейнера и предоставляет публичный URL-адрес Webhook, не открывая публичный доступ к самому приложению Fly. Укажите имя хоста туннеля в webhookSecurity.allowedHosts, чтобы разрешить перенаправленные заголовки хоста.

Компромиссы безопасности

Примечания

  • Fly.io использует архитектуру x86; Dockerfile совместим как с x86, так и с ARM.
  • Для подключения WhatsApp/Telegram используйте fly ssh console.
  • Постоянные данные хранятся на томе по пути /data.
  • Для Signal в образе требуется signal-cli (CLI на основе Java); используйте собственный образ и выделите не менее 2GB памяти.

Стоимость

При рекомендуемой конфигурации (shared-cpu-2x, 2GB ОЗУ) ожидайте расходы примерно $10-15 в месяц в зависимости от использования; бесплатный тариф покрывает часть базового объема ресурсов. Актуальные тарифы приведены на странице цен Fly.io.

Дальнейшие действия

Связанные материалы