Запуск туннеля как фонового сервиса
Фоновый сервис нужен, когда туннель должен работать постоянно: переживать выход из SSH, перезагрузку и падения. Команда tuna service (короткая форма — tuna svc) создаёт сервис средствами системы, сразу его запускает и перезапускает туннель через 30 секунд после падения.
Сервисом ставятся туннели http, tcp, ssh, app, postgres, mysql, redis, kubernetes, 1c и триггеры webhook и smtp. tuna start сервисом не ставится: он сам перезапускает туннели и смешивает их логи. Для нескольких туннелей создайте по сервису на каждый — install подскажет нужные команды.
Пользовательский и системный сервис
Где появится сервис, зависит от того, кто запускает install:
| Система | Без привилегий | От root или администратора |
|---|---|---|
| Linux с systemd | systemd --user, юнит в ~/.config/systemd/user/ | системный юнит в /etc/systemd/system/ |
| Linux с OpenRC (Alpine, Gentoo) | — | скрипт в /etc/init.d/ |
| macOS | LaunchAgent в ~/Library/LaunchAgents/ | LaunchDaemon в /Library/LaunchDaemons/ |
| FreeBSD | — | скрипт в /usr/local/etc/rc.d/ |
| Windows | — | служба Windows |
Для пользовательского сервиса на Linux CLI включает linger (loginctl enable-linger): без него systemd остановит его после выхода из SSH и не запустит при загрузке. Если включить linger не удалось, CLI предупредит и подскажет команду sudo loginctl enable-linger <пользователь>.
По умолчанию macOS имеет политики управления энергией, которые заставляют компьютер засыпать и тогда сервис станет недоступным, но это поведение можно настроить, если вы хотите использовать компьютер с macOS в режиме сервера.
Посмотреть текущий план питания можно с помощью команды pmset -g.
Для постоянной работы в фоне выставьте следующие значения:
sudo pmset -a sleep 0
sudo pmset -a autorestart 1
sudo pmset -a networkoversleep 1
sudo pmset -a tcpkeepalive 1
sudo pmset -a powernap 0
sudo pmset -a womp 1
Создание сервиса
Войдите в аккаунт командой tuna login и передайте после -- команду туннеля:
tuna service install -- tuna http 8080 --subdomain=web
Сервис сразу запустится. Имя по умолчанию — tuna. Чтобы держать несколько сервисов, задайте каждому своё имя флагом --name или переменной TUNA_SERVICE_NAME:
tuna service install --name=db -- tuna tcp 5432
По умолчанию инспектор запросов в сервисе выключен: в фоне его никто не смотрит. Нужен — передайте --inspect в команде туннеля явно. У postgres, mysql и redis инспектор работает всегда, install предупредит об этом. Если отладка запросов не нужна, ставьте сервисом tuna tcp.
Ключ сервиса
Для каждого сервиса install выпускает отдельный ключ из вашей сессии. Если в команде есть --subdomain, --domain или --port, ключ привязан к этому адресу, иначе он поднимает туннели только своего типа: HTTP или TCP. Ключ лежит в файле с доступом только для пользователя сервиса, в аргументы процесса он не попадает. tuna service uninstall отзывает его на сервере.
Если на машине нет входа — это сервер, куда вы зашли по SSH, или install запущен через sudo и не видит вашу сессию, — CLI покажет ссылку и код: откройте ссылку на любом устройстве, где вы вошли в tuna, и подтвердите выпуск ключа. Без терминала, в скрипте, CLI возьмёт ключ из TUNA_API_KEY, флага --api-key или конфигурационного файла. У такого ключа должно быть право на туннели (tunnels:connect).
Системный сервис от другого пользователя
Системный сервис по умолчанию работает от root (в Windows — от LocalSystem). Безопаснее запускать его от непривилегированного пользователя — укажите его флагом --user или переменной TUNA_SERVICE_INSTALL_USER:
sudo tuna service install --user=www-data -- tuna http 8080 --subdomain=web
В Windows для службы без пароля подойдёт встроенная учётная запись:
tuna service install --user 'NT AUTHORITY\LocalService' -- tuna http 8080 --subdomain=web
Управление сервисами
В терминале tuna service без подкоманды открывает интерфейс со списком сервисов. Из него можно создать, изменить, запустить, остановить, перезапустить и удалить сервис и посмотреть его логи.
| Клавиша | Действие |
|---|---|
Enter | логи выбранного сервиса |
i | карточка сервиса: команда, пользователь, файл логов |
n | новый сервис |
e | изменить команду |
s / x / R | запустить / остановить / перезапустить |
d | удалить сервис и отозвать его ключ |
Для скриптов те же действия есть подкомандами. Все они принимают --name, по умолчанию tuna:
tuna service list # все сервисы, --json — в JSON
tuna service status --name=web # код выхода 1, если сервис не запущен
tuna service start --name=web
tuna service stop --name=web
tuna service restart --name=web
tuna service uninstall --name=web # остановить, удалить и отозвать ключ
Изменение команды
tuna service edit меняет аргументы туннеля и перезапускает сервис. Имя, пользователь, переменные окружения и автозапуск сохраняются:
tuna service edit --name=web -- tuna http 8081 --subdomain=web
Тип туннеля поменять нельзя — для этого переустановите сервис. Если сменился адрес (--subdomain, --domain, --port), CLI выпустит новый ключ и отзовёт старый.
Логи
tuna service logs --name=web # последние 100 строк
tuna service logs --name=web -n 500
tuna service logs --name=web -f # следить за новыми строками
tuna service logs сам находит журнал на каждой системе:
| Система | Где логи |
|---|---|
| Linux с systemd | journald, journalctl [--user] -u <имя> |
| Linux с OpenRC, FreeBSD | /var/log/tuna/<имя>.log |
| macOS | ~/Library/Logs/tuna/<имя>.log, у системного сервиса — /Library/Logs/tuna/<имя>.log |
| Windows | %ProgramData%\tuna\logs\<имя>.log |
Запуск в Docker Compose
Вместо сервиса можно запустить туннель контейнером. Создайте compose.yml:
---
name: tuna
services:
web:
image: yuccastream/tuna:latest
command: http 3000 --subdomain=web
restart: always
network_mode: "host"
environment:
- TUNA_API_KEY=<ваш_ключ>
В официальном образе инспектор тоже выключен по умолчанию. Как его включить — в разделе Инспектор в Docker.
network_mode: "host" (аналог --net=host) по умолчанию работает только в Linux. В Windows и macOS это бета-функция Docker Desktop: в Settings на вкладке Features in development выберите Enable host networking.
docker compose up -d # запустить
docker compose logs -f # логи
docker compose down -v # остановить