Перейти к основному содержимому

Запуск туннеля как фонового сервиса

Фоновый сервис нужен, когда туннель должен работать постоянно: переживать выход из SSH, перезагрузку и падения. Команда tuna service (короткая форма — tuna svc) создаёт сервис средствами системы, сразу его запускает и перезапускает туннель через 30 секунд после падения.

Сервисом ставятся туннели http, tcp, ssh, app, postgres, mysql, redis, kubernetes, 1c и триггеры webhook и smtp. tuna start сервисом не ставится: он сам перезапускает туннели и смешивает их логи. Для нескольких туннелей создайте по сервису на каждый — install подскажет нужные команды.

Пользовательский и системный сервис​

Где появится сервис, зависит от того, кто запускает install:

СистемаБез привилегийОт root или администратора
Linux с systemdsystemd --user, юнит в ~/.config/systemd/user/системный юнит в /etc/systemd/system/
Linux с OpenRC (Alpine, Gentoo)—скрипт в /etc/init.d/
macOSLaunchAgent в ~/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 с systemdjournald, 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 # остановить