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 відмовляється запускатися з помилками «already running» після перезапуску контейнера. Файли блокування середовища виконання розташовані в <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], тому загальнодоступний вхідний доступ не виділяється.

Коли використовувати приватне розгортання

  • лише вихідні виклики/повідомлення (без вхідних вебхуків)
  • тунелі ngrok або Tailscale обробляють усі зворотні виклики вебхуків
  • доступ до 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.

Наступні кроки

Пов’язані матеріали