tt - это официальная единая консольная утилита Tarantool, написанная на Go. Она заменила устаревший tarantoolctl и закрывает весь жизненный цикл приложения: установку нужной версии ядра, генерацию каркаса из шаблона, сборку зависимостей, фоновый запуск инстансов, подключение к консоли, проверку статуса, остановку и упаковку. Ключевая идея урока: tt - это не просто запускалка процессов, а менеджер окружения (environment). Понимание того, что такое окружение и как tt раскладывает по нему файлы, объясняет почти всё поведение команд.
В этом уроке мы пройдём минимальный рабочий цикл: init -> create -> build -> start -> connect -> status -> stop, и разберём, что происходит под капотом на каждом шаге.
Механика: окружение, конфиг и раскладка файлов
Сердце tt - конфигурационный файл tt.yaml. Его создаёт команда
Код: Выделить всё
tt initВнутри tt.yaml несколько секций. Самые важные:
- env.instances_enabled - директория, где лежат приложения (по умолчанию instances.enabled). Только то, что здесь, tt считает enabled и видит командами start, status, stop.
- env.bin_dir (bin) - сюда ставятся бинарники tarantool и tt при tt install.
- app.run_dir / log_dir / wal_dir / vinyl_dir / memtx_dir - пути для рантайм-артефактов: сокеты и pid, логи, .xlog, .vylog, .snap. По умолчанию var/run, var/log, var/lib.
Приложение - это директория внутри instances.enabled. Для Tarantool 3.x в ней должны быть два файла: config.yaml (декларативная конфигурация: топология, имена инстансов, их роли) и instances.yml (список инстансов, которые поднимать в этом окружении). Можно положить и .lua-файлы с прикладным кодом. Имя директории = имя приложения (то, что вы пишете в tt start app).Важно: в tt 2.0 раскладка изменилась. Теперь app.*_dir отсчитываются НЕ от корня окружения, а от директории приложения внутри instances.enabled. То есть логи лежат в instances.enabled/myapp/var/log/<instance_name>/, а не в общем var у корня. Многие гайды из эпохи tt 1.x вводят в заблуждение.

Рабочий цикл tt: init, create, build, start, connect
Команды и примеры
Шаг 0. Создать окружение
Код: Выделить всё
tt init
# создаст tt.yaml и каркас директорий:
# bin/ include/ distfiles/ instances.enabled/ modules/ templates/
tt create инстанцирует приложение из шаблона. Встроенные шаблоны для 3.x: single_instance (один инстанс) и vshard_cluster (шардированный кластер). Шаблон cartridge оставлен только для устаревшего Tarantool 2.x.
Код: Выделить всё
tt create single_instance --name myapp
# -s / --non-interactive - не спрашивать переменные интерактивно
# --var name=value - задать переменную шаблона
# -f / --force - перезаписать существующую директорию
# -dst PATH - куда создавать (по умолчанию ./<name>)
Шаг 2. Собрать приложение
Код: Выделить всё
tt build [PATH] [--spec app-scm-1.rockspec]
Шаг 3. Запустить
Код: Выделить всё
tt start myapp # все инстансы приложения по instances.yml
tt start myapp:router # только инстанс router
tt start # все enabled-приложения окружения
tt start -i myapp # интерактивно: логи в stdout, Ctrl+C останавливает
Шаг 4. Подключиться
Код: Выделить всё
tt connect myapp # локально, по имени инстанса, без пароля
tt connect myapp:master # конкретный инстанс
tt connect 192.168.1.10:3301 -u user -p pass # удалённо, по URI
tt connect myapp -l sql # язык консоли: lua (по умолчанию) или sql
tt connect myapp -f script.lua # выполнить скрипт, не входя в консоль
Код: Выделить всё
myapp:instance001> box.info.ro
---
- false
...
myapp:instance001> box.space._space:count()
Код: Выделить всё
tt status myapp
# INSTANCE STATUS PID MODE CONFIG BOX UPSTREAM
# колонки: имя | running/not running | pid | RW/RO |
# состояние config.info() | состояние box.info() | upstream репликации
tt stop myapp # остановить всё приложение
tt restart myapp:i1 # перезапуск (спросит подтверждение)
tt clean myapp # удалить артефакты: логи, снапшоты, xlog
- Приложение не видно командами. tt видит только то, что лежит (или симлинкнуто) в instances.enabled. Создали в другом месте через -dst и забыли симлинк - tt start app скажет, что приложения нет.
- Не тот tt.yaml. Поиск конфига идёт вверх по дереву. Запускаете из вложенной папки - можете подцепить родительский или системный конфиг. Проверяйте через tt cfg dump или флаг -c.
- Фоновый режим дважды. tt уже запускает в фоне через watchdog. Включать background внутри Tarantool нельзя - сломаете status и stop.
- build не нужен всем. tt build - это про LuaRocks-зависимости. Чистому single_instance без rockspec он не требуется; вызов на пустом приложении просто ничего полезного не сделает.
- config.yaml против box.cfg. В 3.x конфигурация декларативная (config.yaml). Старый путь через init.lua с box.cfg считается legacy; tt его ещё поддерживает, но документация для него - в ветке 2.11.
- Остаточный pid/сокет. При жёстком убийстве процесса в run_dir могут остаться tt.pid и сокет; tt stop ругнётся, что не может stat pid-файл - это значит инстанс уже мёртв.
Контрольные вопросыЗадание. Соберите полный цикл с нуля в пустой директории:
1) tt init;
2) tt create single_instance --name lab --non-interactive;
3) tt start lab;
4) tt status lab - убедитесь, что STATUS = RUNNING и запомните PID;
5) tt connect lab и выполните box.info.uptime и box.cfg.memtx_memory;
6) выйдите (Ctrl+D), сделайте tt stop lab и снова tt status lab - статус должен смениться.
Бонус: найдите в файловой системе путь к unix-сокету и pid-файлу инстанса (подсказка: instances.enabled/lab/var/run/<instance>/).
- Где физически лежат логи, snapshot и pid-файл инстанса myapp в default launch mode, и от чего отсчитываются эти пути в tt 2.0+?
- Почему нельзя включать background средствами Tarantool, если приложение запускается через tt start? Какую роль играет watchdog?
- Чем локальное подключение tt connect myapp по имени отличается от подключения по URI в плане аутентификации, и под каким пользователем вы окажетесь без логина?
- Что именно делает tt build под капотом, куда складывает результат и в каком случае этот шаг можно пропустить?