@airlok/cli
Публикация папки проекта на хостинге Airlok из терминала — без GitHub и без своего сервера. И подключение своего сервера одной командой, не заходя на него.
npx @airlok/cli login # вход через браузер
npx @airlok/cli deploy # собрать и опубликовать текущую папку
Нужен Node.js 18.17 или новее. Устанавливать ничего не нужно: npx скачает CLI сам.
ИИ-агенты: один раз и навсегда
npx @airlok/cli setup
Команда входит в Airlok (если ещё не вошли) и подключает найденных агентов — Claude Code, Codex, Antigravity, Cursor:
- прописывает им MCP-сервер Airlok с вашим токеном — через него агент видит приложения, статус и лог сборки, логи, переменные, базу, домены и настройки;
- кладёт навыки:
airlok— как публиковать, разбирать упавшую сборку, проверять сайт и что нельзя делать без вашей просьбы;airlok-yml— как подготовитьairlok.ymlпроекта с полным списком переменных окружения и их описаниями.
После перезапуска агента достаточно сказать «опубликуй на Airlok» или «почему сайт отдаёт 500». Выбрать агентов:
--agents claude,codex, без вопросов: --yes. Повторный запуск ничего не дублирует; прежние файлы настроек остаются
рядом с суффиксом .airlok-backup. Токен хранится в файлах настроек агентов открытым текстом, отозвать его можно в
дашборде: Настройки → токены.
Свой сервер: одна команда с вашего компьютера
npx @airlok/cli server connect root@IP-СЕРВЕРА --letsencrypt
Заходить на сервер не нужно: CLI заводит его в дашборде, ставит Airlok по SSH (Docker, nginx, файрвол, агент) и ждёт, когда агент выйдет на связь. То же можно поручить ИИ-агенту — промпт для него есть в дашборде: Серверы → «Добавить».
- Если сервер ещё не пускает по ключу, CLI создаёт ключ
~/.ssh/airlok_ed25519и кладёт его на сервер. Пароль от сервера спрашивает сам ssh — один раз и только в настоящем терминале; ИИ-агент попросит вас выполнить команду у себя. - Токен агента CLI получает под вашим входом и передаёт на сервер через stdin ssh: он не печатается и не попадает в промпт ИИ-агента.
--ssh-keys-onlyзакрывает вход по паролю; CLI сам проверяет вход по ключу новым соединением и подтверждает его.--name— имя в дашборде (по умолчанию — адрес),--port— порт SSH,--email— почта для Let's Encrypt,--json— итог одной строкой. Пользователь не root должен иметь sudo без пароля.- В конце CLI смотрит, сколько на сервере неустановленных обновлений системы, и в терминале предлагает их поставить; без
терминала (ИИ-агент, скрипт) сообщает об этом и пишет сводку в
os_updatesв--json. Поставить позже:server upgrade <имя>, перезагрузить, если нужно:server reboot <имя>. Сам CLI ничего не ставит и не перезагружает. - Повторный запуск безопасен: если прошлая попытка не дошла до конца, CLI продолжит её с тем же сервером.
- Ключ, с которым CLI зашёл на сервер, становится устройством в дашборде (имя — по компьютеру): там видно, у кого есть доступ к серверу, и там же его закрывают.
Нужен OpenSSH-клиент: на macOS и Linux он есть, на Windows 10/11 — тоже (PowerShell).
Устройства: доступ к серверам по SSH
npx @airlok/cli device add --name "Рабочий макбук" --server prod,stage
npx @airlok/cli device list
device add берёт открытый ключ этого компьютера (~/.ssh/id_ed25519.pub или другой найденный, --key — свой файл
.pub) и добавляет его в «Устройства» дашборда. Агент кладёт ключ в authorized_keys root на отмеченных серверах за
несколько секунд; галочки, отключение и удаление устройства — в дашборде. Закрытый ключ CLI не читает. Если ключ уже
добавлен, --server просто открывает ему ещё серверы.
Как это работает
loginпечатает ссылку с кодом. Откройте её, сверьте код и нажмите «Разрешить» — CLI получит токен с правом публиковать. Токен лежит в~/.config/airlok/config.json, его видно и можно отозвать в дашборде: Настройки → токены.deployспрашивает, в какое приложение публиковать (или создаёт новое), и запоминает выбор в.airlok/project.jsonвнутри папки. Дальше хватаетnpx @airlok/cli deploy.- Папка пакуется в архив. В git-репозитории берутся файлы по
.gitignore;node_modules,.git,.env*(кроме.env.example) и сборки не уходят никогда — Airlok соберёт проект сам. Предел архива — 50 МБ. - CLI показывает этапы сборки и в конце печатает адрес сайта. Если сборка упала — причину и конец лога; код выхода тогда 1.
Проверка проекта
npx @airlok/cli check [папка] [--json]
Показывает, что Airlok сделает с проектом, ничего не собирая: стек, команды установки, сборки и запуска, адрес проверки,
базу, загрузки и все переменные окружения — и что помешает публикации, включая опечатки в airlok.yml. Папка пакуется так
же, как для deploy, проверяется на сервере Airlok тем же кодом, что и сборка, и сразу удаляется. Код выхода 1 — с
такими файлами публикация не пройдёт.
Подсказки в редакторе даёт схема — первая строка airlok.yml:
# yaml-language-server: $schema=https://raw.githubusercontent.com/airlok-sh/airlok/main/schema/airlok.schema.json
Переменные окружения
npx @airlok/cli env list --app shop # имена, без значений
npx @airlok/cli env set OPENAI_API_KEY --app shop # значение спросит, не показывая на экране
printf %s "$VALUE" | npx @airlok/cli env set OPENAI_API_KEY --app shop # или из stdin
npx @airlok/cli env set --app shop --from .env # все переменные из файла
npx @airlok/cli env rm OPENAI_API_KEY --app shop
У приложения на своём сервере значения шифруются здесь, на вашем компьютере, под ключ агента этого сервера: Airlok
хранит только шифротекст и прочитать его не может. CLI печатает отпечаток ключа — тот же агент пишет в журнал сервера
(journalctl -u airlok-agent | grep ключ). На сервер значения попадут при следующей публикации. У приложения на хостинге
их шифрует дашборд, и они применяются со следующего запроса к сайту. Если имя приложения есть на нескольких серверах —
--app <сервер>/<имя>, хостинг — hosting/<имя>.
Свой домен на своём сервере
npx @airlok/cli domain add shop.example.ru --app shop # подключить или заменить: покажет A-запись на IP сервера
npx @airlok/cli domain check --app shop # проверить DNS сейчас
npx @airlok/cli domain show --app shop # что с доменом
npx @airlok/cli domain rm --app shop # отключить
У регистратора заводится A-запись домена на IP сервера; Airlok проверяет её сам каждую минуту. Когда DNS указывает на
сервер, домен включается следующей публикацией и главнее app.domain в airlok.yml. На хостинге свои домены подключаются
в дашборде или через ИИ-агента.
Флаги
| Флаг | Что делает |
|---|---|
--app <имя> | опубликовать в существующее приложение |
--new <имя> | создать приложение и опубликовать |
--title <текст> | название публикации; по умолчанию — последний коммит |
--no-wait | не ждать конца сборки |
--json | итог одной строкой JSON: удобно для скриптов и ИИ-агентов |
CI и ИИ-агенты
Без браузера CLI работает с токеном из переменной окружения:
AIRLOK_TOKEN=airlok_pat_… npx @airlok/cli deploy --app shop --json
Токен с правом публиковать создаётся в дашборде: Настройки → токены. AIRLOK_URL задаёт адрес дашборда, если он не https://app.airlok.ru.
Разработка
npm test
Зависимостей нет: только стандартная библиотека Node.js.