Что потребуется
- Установленный CLI flyctl
- Учетная запись Fly.io (подойдет бесплатный тариф)
- Аутентификация модели: ключ API выбранного поставщика модели
- Учетные данные каналов: токен бота Discord, токен Telegram и т. д.
Быстрый путь для начинающих
- Клонируйте репозиторий, настройте
fly.toml - Создайте приложение и том, задайте секреты
- Разверните с помощью
fly deploy - Подключитесь по SSH, чтобы создать конфигурацию, или используйте интерфейс управления
1
Создайте приложение Fly
lhr (Лондон), iad (Вирджиния), sjc (Сан-Хосе).2
Настройте fly.toml
Отредактируйте Точкой входа Docker-образа OpenClaw служит
fly.toml в соответствии с именем приложения и вашими требованиями. Отслеживаемый в репозитории файл fly.toml — это показанный ниже общедоступный шаблон; deploy/fly.private.toml — усиленный вариант без общедоступного IP-адреса (см. Закрытое развертывание).tini, которая по умолчанию запускает node openclaw.mjs gateway. Fly [processes] заменяет Docker CMD (здесь он напрямую запускает node dist/index.js gateway ..., ту же скомпилированную точку входа), не затрагивая ENTRYPOINT, поэтому процесс по-прежнему выполняется от имени tini.Основные параметры:3
Задайте секреты
--bind lan) требуется действующий способ аутентификации Gateway. В этом примере используется OPENCLAW_GATEWAY_TOKEN, но требованию также удовлетворяет gateway.auth.password или правильно настроенное развертывание с доверенным прокси и привязкой не к loopback-интерфейсу. Контракт SecretRef описан в разделе Управление секретами.Обращайтесь с этими токенами как с паролями. Для ключей API и токенов предпочитайте переменные среды/fly secrets файлу конфигурации, чтобы секреты не попадали в openclaw.json.4
Разверните
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
Устранение неполадок
«Приложение не прослушивает ожидаемый адрес»
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:
Проблемы с блокировкой 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: локальный прокси (самый простой)Webhook при приватном развертывании
Для обратных вызовов Webhook (Twilio, Telnyx и т. д.) без публичного доступа:- туннель ngrok: запустите ngrok внутри контейнера или как вспомогательный контейнер
- Tailscale Funnel: предоставьте доступ к определенным путям через Tailscale
- Только исходящие подключения: некоторые провайдеры (Twilio) поддерживают исходящие вызовы без Webhook
plugins.entries.voice-call.config:
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.
Дальнейшие действия
- Настройте каналы обмена сообщениями: Каналы
- Настройте Gateway: Конфигурация Gateway
- Поддерживайте OpenClaw в актуальном состоянии: Обновление