Справочник CLI — Versola Docs
VersolaVersola/docs
До 1.00.7.1versola.kzGitHub

Справочник CLI

Все команды versola-cli по задачам: синтаксис, флаги и значения по умолчанию, примеры, коды выхода, структура каталога состояния и пороги проверок doctor.

versola — консольная утилита, которая разворачивает и запускает выпущенную версию Versola через Docker на одной машине. Эта страница описывает каждую команду и флаг versola-cli 0.2.10; пошаговый деплой на сервер — в разделе Деплой на VPS.

CLI намеренно тонкий. Он проверяет машину, работает с Docker и запускает версионированный образ ghcr.io/versolauth/versola-tools:<version>, который генерирует всё, что зависит от устройства конкретного релиза Versola: конфигурацию, Compose-файлы, админ-консоль, миграции. Поэтому у versola-cli и у Versola разные номера версий: версия CLI — то, что печатает versola version, а версия Versola — <version>, которую вы передаёте в configure/bootstrap.

Установка и обновление

macOS и Linux:

curl -fsSL https://raw.githubusercontent.com/versolauth/versola-cli/main/install.sh | sh

Скрипт ставит CLI в ~/.local/bin/versola без sudo. В Windows (PowerShell) скрипт ставит CLI в %LOCALAPPDATA%\versola:

iwr https://raw.githubusercontent.com/versolauth/versola-cli/main/install.ps1 -useb | iex

Чтобы позже перейти на новую версию CLI, выполните versola upgrade (см. ниже).

У тегов релизов CLI нет префикса v (у релизов до v0.2.5 он был). Каждый релиз публикует эти файлы и ничего больше:

ПлатформаФайл
Linux, x86-64versola-linux-amd64
macOS, Intelversola-darwin-amd64
macOS, Apple Siliconversola-darwin-arm64
Windows, x86-64versola-windows-amd64.exe
Контрольные суммыchecksums.txt

Сборки для Linux ARM64 нет: на этой платформе установщик завершится ошибкой, потому что файла не существует.

Проверка контрольной суммы. Релизный workflow пишет checksums.txt (формат sha256sum) рядом с бинарниками. Установщики и versola upgrade скачивают его и сравнивают SHA-256 бинарника; при несовпадении установка прерывается. Если checksums.txt отсутствует, недоступен или не содержит записи для нужного файла, они печатают предупреждение и продолжают без проверки. Чтобы проверить вручную, скачайте файл и checksums.txt со страницы релиза и выполните sha256sum -c --ignore-missing checksums.txt.

Чтобы обновить установленный CLI, выполните versola upgrade. Он заменяет бинарник на месте и не трогает dev-сборки.

Таргеты

Таргет — это место, где работает деплой. Он идёт первым аргументом configure и bootstrap.

ТаргетДля чегоЧто запускается
localПопробовать Versola на рабочей машине. Одноразовый стек.Docker Compose: контейнер Postgres 18, OpenBao, central, auth, edge, удостоверяющий центр (step-ca) и реверс-прокси Versola на 127.0.0.1:2821. Флагов не требует. После up админ-консоль доступна на http://localhost:2821/central/admin/, печатается логин admin с фиксированным демо-паролем.
vpsНастоящий сервер.Тот же Compose-проект с именем versola-vps, но без Postgres: нативный PostgreSQL вы поднимаете сами. Добавляет обязательные --auth-url и --postgres-host, необязательные --postgres-db и --postgres-ca и выбор режима реверс-прокси. Пароль админа не печатается; он лежит в auth.secrets.env в бандле.

На машине одновременно активен только один деплой: повторный configure заменяет запись о предыдущем. Команды на vps, которые что-то меняют, спрашивают Continue? [y/N] на стандартном вводе. Флага --yes для этих вопросов нет; пустой ответ или конец ввода прерывает команду с ненулевым кодом выхода.

Каталог состояния

Всё, что хранит CLI, лежит в ~/.versola:

ПутьСодержимое
~/.versola/active/state.jsonАктивный деплой: таргет, версия Versola, каталог бандла, --auth-url, режим прокси, --postgres-host, --postgres-db, время последнего migrate, ревизия схемы секретов и слоты реплик auth и edge. Деплой, сделанный намного более старым CLI, помечается как таковой, и его заменяет повторный configure.
~/.versola/active/postgres-ca.crtКопия файла, переданного в --postgres-ca, чтобы следующие шаги не зависели от исходного пути. Есть, только если вы передали флаг.
~/.versola/active/proxy-vps/Собственная конфигурация реверс-прокси vps, лежащая отдельно от бандлов и поэтому переживающая каждый configure: по каталогу на каждое поколение конфигурации (gen-000008/) и ссылка current на используемое. См. Реверс-прокси на vps.
~/.versola/active/bundle-<n>-<random>/По каталогу на каждый запуск configure, генерируется versola-tools: compose.yml, proxy.yml, replicas.yml (только если у какого-то сервиса больше одной реплики), auth.conf, central.conf, edge.conf, <service>.secrets.env (права 600, разрешённые значения секретов), utils.private-key.jwk, openbao.hcl, postgres-ca/ca.crt (CA-bundle, монтируется только на чтение в три сервиса и контейнер миграций; без --postgres-ca каталог пуст), статические файлы админ-консоли и конфигурация прокси. Эти файлы не редактируют: следующий configure пишет новый бандл и удаляет старые, когда ни один контейнер больше с них не запущен.
~/.versola/active.lockБлокировка на время работы команды, меняющей состояние: два терминала не смогут перенастроить деплой одновременно.
~/.versola/openbao/<target>.jsonУчётные данные AppRole для OpenBao этого таргета. Пишет secrets login или configure, когда сам настраивает OpenBao.
~/.versola/openbao/vps-admin.jsonRoot token и ключ распечатки OpenBao для vps, их записывает configure, когда сам настраивает OpenBao. Сохраните копию вне машины: восстановить эти значения нельзя.

versola uninstall удаляет ~/.versola/active, но не трогает ~/.versola/openbao.

Реверс-прокси на vps

CLI генерирует конфигурацию nginx для реверс-прокси Versola. На vps важны три детали.

  • Поколения конфигурации. Прокси не монтирует файлы из бандла. Каждое изменение (configure, добавление или удаление реплики) собирает полную новую конфигурацию в ~/.versola/active/proxy-vps/gen-<n>/, nginx проверяет её в одноразовом контейнере, затем переключается ссылка current и nginx перезагружается. Если перезагрузку отклонили, ссылка возвращается. Контейнер прокси для нового бандла не пересоздаётся, поэтому запросы не теряются.
  • Внутренние listener’ы auth идут через прокси. На vps прокси слушает 127.0.0.1:8082 (listener Account Settings, APORT) и 127.0.0.1:8083 (mutual-TLS listener, MPORT) и балансирует их между всеми репликами auth. Собственные listener’ы реплик сдвинуты на 1000 портов вверх (и ещё на 100 на каждый слот). central и edge сохраняют адреса из своей конфигурации. Mutual-TLS-соединение проходит как TCP, поэтому TLS по-прежнему завершает сам auth своим сертификатом.
  • Клиентский сертификат от вызывающего не принимается. Прокси ставит заголовку ssl-client-cert пустое значение в каждом пересылаемом запросе, так что вызывающий не может подставить клиентский сертификат этим заголовком. Сертификат принимается только там, где его проверили: на собственном mutual-TLS listener’е auth или через TLS-терминатор, который вы сами настроили выставлять этот заголовок.

Проверка

versola doctor

versola doctor [--target local|vps]

Проверяет, есть ли на машине всё, что нужно Versola. Ничего не устанавливает. Если Docker отсутствует, предлагает открыть страницу установки в браузере и делает это только после вашего подтверждения.

ФлагПо умолчаниюЗначение
--targetlocallocal или vps. Меняет проверку памяти и то, проверяется ли порт 2821.

Проверки печатаются строками [ok] или [!!]:

ПроверкаПроходит, если
Docker daemondocker version достаёт до сервера.
Docker Compose plugindocker compose version работает. Для replica нужен Compose 2.24 или новее (в файле реплик используется !override).
Port 2821 free (только local)На 127.0.0.1:2821 слушает только локальный прокси.
Docker memory, localDocker сообщает минимум 4 ГиБ суммарно.
Docker memory, vpsMemAvailable в /proc/meminfo не меньше 3 ГиБ для нового деплоя, 1 ГиБ, если central, auth и edge уже запущены (замена), плюс 256 МиБ, если OpenBao не запущен. Проверка падает не на Linux и когда Docker указывает на удалённый хост: она может прочитать память только той машины, где запущена. Запускайте её на сервере.
Disk spaceНе меньше 4 ГиБ свободного места на томе текущего каталога.

Код выхода ненулевой, если хоть одна проверка не прошла. Для сервера всегда указывайте --target vps: значение по умолчанию применяет не то правило для памяти.

Деплой

Три шага деплоя можно выполнить вместе (bootstrap) или по одному. Запускайте их отдельно, когда миграции должны быть самостоятельным шагом, который можно проверить.

versola bootstrap

versola bootstrap <local|vps> <version> [flags]

Выполняет configure, migrate и up по порядку; на vps подтверждение запрашивается один раз в начале. <version> — тег релиза Versola без префикса v.

ФлагПо умолчаниюЗначение
--auth-urlнетПубличный origin auth, например https://id.example.com. Обязателен на vps.
--postgres-hostнетhost:port Postgres, например 127.0.0.1:5432. Обязателен на vps.
--proxynginxТолько vps. nginx: прокси Versola занимает порты 80/443 и получает сертификат Let’s Encrypt для https в --auth-url. external: на 80/443 остаётся ваш веб-сервер и пробрасывает запросы в прокси Versola на 127.0.0.1:2821.
--acme-stagingfalseТолько vps. Использовать staging-среду Let’s Encrypt (сертификат не доверенный, лимитов нет).
--postgres-dbauthТолько vps. Имя базы Postgres: от 1 до 63 букв, цифр, _ или -. Используйте то же имя в строках CREATE DATABASE и \c установочного SQL.
--postgres-caнетТолько vps. PEM-файл с CA, подписавшим серверный сертификат Postgres, для sslmode=verify-full, когда JVM этому CA ещё не доверяет. В файле должен быть сертификат. Он копируется в бандл, монтируется в central, auth, edge и контейнер миграций и записывается как postgres.ssl-root-cert.
--setup-openbaofalseТолько vps. OpenBao вы настраиваете сами; тогда CLI нужны учётные данные, сохранённые через secrets login.
--generate-missingнетИмена секретов через запятую, которые можно сгенерировать, хотя план остановился бы (см. --generate-missing).
--allow-legacy-secretsfalseНастроить релиз без схемы секретов по старому правилу (см. ниже).
--no-browserfalseНе открывать админ-консоль в браузере, когда всё готово (local).

--proxy, --acme-staging, --postgres-db и --postgres-ca для local отклоняются.

На vps первый запуск с пустым OpenBao генерирует пароль роли Postgres. Тогда bootstrap останавливается перед migrate с ненулевым кодом выхода, потому что у роли ещё нет этого пароля: выполните SQL, который напечатал configure, затем versola migrate и versola up.

versola bootstrap vps 0.7.1 --auth-url https://id.example.com --postgres-host 127.0.0.1:5432

versola configure

versola configure <local|vps> <version> [flags]

Готовит деплой, не запуская его. Проверяет машину, тянет versola-tools:<version>, генерирует бандл (конфигурацию, Compose-файлы, админ-консоль, конфигурацию прокси), при необходимости запускает OpenBao и разрешает все секреты через него. Ни один сервис Versola не запускается, база не затрагивается, поэтому команду безопасно повторять. На vps она просит подтверждение, потому что заменяет запись этой машины об активном деплое.

Флаги те же, что у bootstrap, кроме --no-browser. configure не запоминает --auth-url, --postgres-host и --proxy: передавайте одни и те же значения при каждом запуске, включая --proxy external, иначе режим прокси вернётся к nginx. --postgres-db и --postgres-ca — исключение: они записываются (файл CA копируется рядом с state.json), следующий configure без флага сохраняет записанное значение, а повторно переданный флаг его переопределяет. Им нужен релиз versola-tools, который читает POSTGRES_DB и POSTGRES_CA_FILE (0.7.1 и новее); более старый их игнорирует.

Прежде чем записать любой секрет, configure вычисляет, что можно сделать с каждым (тот же план печатает secrets plan), и останавливается, ничего не записав, если какой-то секрет выглядит потерянным. См. Секреты.

versola configure vps 0.7.1 --auth-url https://id.example.com --postgres-host db.example.com:5432 --postgres-db versola --postgres-ca /etc/ssl/db-ca.pem

Генерация секретов, которые план отклоняет

--generate-missing NAME[,NAME...] подтверждает, что указанные секреты можно сгенерировать, даже если план остановился бы на них (секрет выглядит потерянным или установка неизвестного происхождения). Имена, которых нет в схеме релиза, считаются проблемой — скорее всего, это опечатки. Пара ключей генерируется, только если названы все члены её группы: половина пары бесполезна. Генерация замены для секрета, к которому привязаны данные, делает эти данные нечитаемыми; используйте флаг, только чтобы восстановиться после потери значения, от которого точно ничего не зависит.

--allow-legacy-secrets относится к релизу, чей versola-tools не пишет secrets.schema.json. Без схемы CLI не отличает новый секрет от потерянного, поэтому на vps отказывается работать, если в OpenBao уже есть секреты или записан деплой. С флагом применяется старое правило: всё, чего нет в OpenBao, генерируется, потеряно оно или нет. При пустом OpenBao и отсутствии записи терять нечего, и флаг не нужен. local не отклоняется никогда.

versola migrate

versola migrate [--dry-run] [--service auth|central|edge]

Выполняет миграции базы каждого сервиса для того, что configure подготовил последним, в одном одноразовом контейнере versola-tools. Ни один сервер не запускается. На vps сначала просит подтверждение и напоминает, что миграции нельзя откатить (down-миграций нет): перед ответом «да» сделайте бэкап базы.

ФлагПо умолчаниюЗначение
--dry-runfalseПодключиться к настоящей базе и перечислить миграции, которые были бы применены, ничего не применяя и без запроса подтверждения.
--serviceвсе триОграничить auth, central или edge. Любое другое значение — ошибка.

Код выхода ненулевой, если миграция упала, так что скрипт или шаг пайплайна могут на него полагаться. С --dry-run релизы до 0.6.2 включительно сообщают о миграциях, которые просто ещё не применены, как об ошибке проверки; это баг образа versola-tools тех релизов, в 0.7.0 он исправлен.

Сервисы сами не мигрируют: они стартуют с RUN_MIGRATIONS=false, проверяют схему и отказываются стартовать на устаревшей.

versola up

versola up [--no-browser]

Запускает стек, подготовленный configure, и ждёт, пока он начнёт обслуживать трафик: сначала central (auth и edge синхронизируют с ним конфигурацию), затем auth и edge, затем реверс-прокси; в конце — запрос через прокси к auth. Предполагается, что migrate уже выполнен. На vps просит подтверждение, потому что заменяет то, что сейчас обслуживает трафик. central стартует только после того, как step-ca и одноразовый контейнер mtls-init выпустят сертификаты, которые он читает (бандлы 0.7.1 и новее); это часть первого шага.

ФлагПо умолчаниюЗначение
--no-browserfalseНе открывать админ-консоль в браузере (только local; vps браузер не открывает никогда).

На vps печатает адрес и файл с ADMIN_BOOTSTRAP_PASSWORD. Этот пароль временный, действует 24 часа, а первый вход с ним требует задать новый.

Эксплуатация

versola status

versola status

Печатает версию и таргет деплоя, время последних миграций, реплики и вывод docker compose ps для проекта. Если ничего не развёрнуто, сообщает об этом и завершается с кодом 0.

Deployed version: 0.7.1 (target: vps)
Migrations applied: 2026-10-14 17:11:51
Replicas: auth x1 (slot 1), edge x1 (slot 1)

versola down

versola down [--volumes]

Останавливает контейнеры деплоя, включая OpenBao и прокси, сохраняя данные и образы. Том Postgres таргета local сохраняется, если не передать --volumes, — этот флаг удаляет и тома стека. На vps Postgres ваш, и команда его никогда не трогает.

versola uninstall

versola uninstall [-y|--yes]

Останавливает стек с --volumes, удаляет Docker-образы, которые скачал Versola, и очищает ~/.versola/active. Перечисляет, что удалит, и просит подтверждение, если не указан -y. На vps оставляет том OpenBao (versola-openbao-file-vps) и том сертификатов (versola-acme-vps) и печатает команды docker volume rm. Если Docker недоступен, сохраняет ~/.versola/active, чтобы деплой потом всё же можно было остановить. Бинарник versola не удаляет, а печатает его путь.

versola replica

versola replica add <auth|edge> [count]
versola replica remove <auth|edge> [count]

Запускает больше одной копии auth или edge за реверс-прокси Versola, который распределяет запросы между ними. central не реплицируется. Реплики записываются, поэтому versola up их восстанавливает, а versola status их показывает. Флагов нет; count по умолчанию 1.

add запускает count новых реплик по одной в наименьших свободных слотах (всего не больше 9). Каждую дожидается готовности и только потом добавляет в upstream’ы прокси. Реплика, которая не поднялась, удаляется; запущенные до неё остаются. У каждого слота своё имя контейнера (versola-auth-2), порты сдвинуты на 100 на слот.

remove останавливает слоты с наибольшими номерами по одному: сначала прокси перестаёт слать реплике запросы и ждёт завершения текущих, затем реплика останавливается. Последнюю реплику сервиса удалить нельзя.

Деплой должен быть запущен (versola up) из последнего configure. На vps обе команды просят подтверждение.

versola replica add edge 2

versola version

versola version

Печатает versola-cli <version> (<go version>, <os>/<arch>). versola --version печатает то же самое.

versola upgrade

versola upgrade [-y|--yes]

Проверяет последний релиз versola-cli на GitHub; если он отличается от версии этого бинарника, скачивает файл для вашей платформы, сверяет его с checksums.txt и заменяет запущенный исполняемый файл на месте. Просит подтверждение, если не указан -y. Версию Versola в деплое не меняет: для этого — configure с новой <version>. dev-сборки не трогает никогда.

Секреты

Эти команды управляют доступом машины к OpenBao и показывают, что сделал бы configure. Что такое секреты и как их ротировать — в разделе Секреты.

versola secrets login

versola secrets login <target> <address> <role-id>

Сохраняет учётные данные AppRole для таргета в ~/.versola/openbao/<target>.json после проверки входом. Secret ID запрашивается отдельным скрытым вводом (или читается из стандартного ввода, если это не терминал), поэтому не попадает ни в историю shell, ни в список процессов. Нужна с --setup-openbao или когда машина потеряла файл с учётными данными.

versola secrets login vps http://127.0.0.1:8200 <role-id>

versola secrets test

versola secrets test <target>

Входит с сохранёнными учётными данными, записывает тестовое значение в versola/<target>/_secrets-test, читает его обратно и сообщает, работают ли учётные данные и движок KV v2. Секретов сервисов не касается. При любой ошибке завершается с ненулевым кодом.

versola secrets plan

versola secrets plan <target> <version> [--json] [--generate-missing NAME[,NAME...]]

Печатает, что configure сделал бы с каждым секретом, ничего не делая. Читает, что хранится в OpenBao, запускает versola-tools:<version> во временном каталоге, чтобы узнать секреты релиза и значения-кандидаты, и для каждого секрета печатает: сохранить, создать или остановить запуск. Нужны сохранённые учётные данные (secrets login), запущенный OpenBao и Docker. В OpenBao и в деплой ничего не пишется. Значения секретов не печатаются никогда.

ФлагПо умолчаниюЗначение
--jsonfalseНапечатать отчёт в JSON.
--generate-missingнетКак у configure: показать план с подтверждёнными именами.

Код выхода ненулевой, если в плане есть проблемы. В JSON-отчёте поля version, ok, target, state, schemaRevision, deployedRevision (когда есть запись), actions и problems. Формат описан вместе с правилами плана в разделе Секреты.

Обслуживание

Типовые задачи сводятся к командам выше:

ЗадачаКоманда
Обновить CLIversola upgrade
Перевести деплой на другую версию Versolaversola configure, versola migrate, versola up (Передеплой)
Посмотреть миграции заранееversola migrate --dry-run
Проверить доступ к OpenBaoversola secrets test <target>
Посмотреть изменение секретов заранееversola secrets plan <target> <version>
Остановить всё, сохранив данныеversola down
Удалить деплой и образыversola uninstall

Дальше

  • Деплой на VPS: те же команды по порядку на настоящем сервере.
  • Секреты: что configure делает с каждым секретом и как ротировать один из них.
  • Конфигурация: что находится в сгенерированных файлах конфигурации.