diff --git a/docs/deployment/systemd-services.md b/docs/deployment/systemd-services.md index 5ed2c7b..b964c53 100644 --- a/docs/deployment/systemd-services.md +++ b/docs/deployment/systemd-services.md @@ -169,3 +169,107 @@ ExecStart=satellite-python -m wyoming_satellite ... - [Руководство по развёртыванию](../../DEPLOY.md) - [MQTT LED интеграция](integration/mqtt-led.md) + +--- + +## TEST сервисы (для разработки) + +Для тестирования новых функций без влияния на production службы созданы **TEST сервисы**. + +### Отличия от production + +| Сервис | Production | Test | +|--------|------------|------| +| Satellite | порт 10700 | порт 10701 + WebSocket :8675 | +| Wake Word | порт 10400 | порт 10401 | +| Event | порт 10500 | порт 10501 | + +### Вариант 1: Установка TEST сервисов (рекомендуется) + +**Установка:** + +```bash +cd ~/projects/satellite-dev +sudo ./install_test_services.sh +``` + +**Запуск:** + +```bash +# Запуск всех test сервисов +sudo systemctl start wyoming-event-test.service +sudo systemctl start wyoming-satelite-vosk-test.service +sudo systemctl start wyoming-wakeword-vosk-test.service + +# Проверка статуса +sudo systemctl status wyoming-satelite-vosk-test.service + +# Логи +journalctl -u wyoming-satelite-vosk-test.service -f +``` + +**Преимущества:** +- ✅ Автоматический перезапуск при ошибке +- ✅ Production службы не затрагиваются +- ✅ Легко переключаться между test/prod + +### Вариант 2: Быстрый запуск в tmux + +**Требования:** `tmux` установлен (`sudo apt-get install tmux`) + +**Запуск:** + +```bash +cd ~/projects/satellite-dev +./services/test/start_test.sh +``` + +**Управление:** + +```bash +# Подключиться к сессии +tmux attach -t satellite-test + +# Остановить все сервисы +tmux kill-session -t satellite-test +``` + +**Структура окон:** +- **Окно 0:** Wake Word (порт 10401) +- **Окно 1:** Event Service (порт 10501) +- **Окно 2:** Satellite (порт 10701 + WebSocket :8675) + +### Тестирование WebSocket + +**Проверка подключения:** + +```bash +cd ~/projects/satellite-dev +source .venv/bin/activate + +# Python тест клиент +python3 examples/websocket-service/test_client.py --uri ws://127.0.0.1:8675 + +# Или браузер +# Откройте examples/websocket-service/client.html +``` + +**Проверка audio level:** + +```javascript +// В browser console (client.html) +// Уровень микрофона должен обновляться 10 раз в секунду +// {"type": "audio-level", "data": {"level": 0.42}} +``` + +### Остановка TEST сервисов + +```bash +# systemd сервисы +sudo systemctl stop wyoming-event-test.service +sudo systemctl stop wyoming-satelite-vosk-test.service +sudo systemctl stop wyoming-wakeword-vosk-test.service + +# tmux сессия +tmux kill-session -t satellite-test +``` diff --git a/install_test_services.sh b/install_test_services.sh new file mode 100755 index 0000000..8ac9fcc --- /dev/null +++ b/install_test_services.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# +# Установка TEST systemd сервисов для Wyoming Satellite (dev branch) +# Автоматически определяет пути и подставляет их в service файлы +# + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SERVICE_DIR="${SCRIPT_DIR}/services/test" +SYSTEMD_DIR="/etc/systemd/system" + +echo "🔧 Установка TEST systemd сервисов для Wyoming Satellite (dev)" +echo "==============================================================" + +# Определяем текущего пользователя +CURRENT_USER="${SUDO_USER:-$(whoami)}" +HOME_DIR=$(getent passwd "$CURRENT_USER" | cut -d: -f6) + +echo "👤 Пользователь: $CURRENT_USER" +echo "🏠 Домашняя директория: $HOME_DIR" + +# Ищем виртуальное окружение +VENV_PATH="" +for candidate in \ + "${HOME_DIR}/projects/.venv_satellite" \ + "${HOME_DIR}/.venv_satellite" \ + "${SCRIPT_DIR}/.venv" \ + "${SCRIPT_DIR}/.venv_satellite" +do + if [ -f "${candidate}/bin/python3" ]; then + VENV_PATH="${candidate}" + break + fi +done + +if [ -z "$VENV_PATH" ]; then + echo "❌ Виртуальное окружение не найдено!" + echo " Создайте его: cd ${SCRIPT_DIR} && ./setup_dev.sh" + exit 1 +fi + +echo "✅ VENV: $VENV_PATH" + +# Создаём временную директорию для обработанных сервисов +TEMP_DIR=$(mktemp -d) +trap "rm -rf ${TEMP_DIR}" EXIT + +# Обрабатываем каждый test service файл +for service_file in "${SERVICE_DIR}"/*.service; do + [ -f "$service_file" ] || continue + + filename=$(basename "$service_file") + echo "📄 Обработка: $filename" + + # Заменяем плейсхолдеры на актуальные пути + sed -e "s|__SAT_BASE_DIR__|${SCRIPT_DIR}|g" \ + -e "s|__SAT_VENV__|${VENV_PATH}|g" \ + -e "s|__CURRENT_USER__|${CURRENT_USER}|g" \ + -e "s|__HOME_DIR__|${HOME_DIR}|g" \ + "$service_file" > "${TEMP_DIR}/${filename}" + + # Копируем в systemd + sudo cp "${TEMP_DIR}/${filename}" "${SYSTEMD_DIR}/" + echo " ✅ Установлен в ${SYSTEMD_DIR}/${filename}" +done + +# Перезагружаем systemd +echo "" +echo "🔄 Перезагрузка systemd..." +sudo systemctl daemon-reload + +echo "" +echo "✅ TEST сервисы установлены!" +echo "" +echo "📋 TEST сервисы (не влияют на production):" +echo " - wyoming-event-test.service (LED управление, порт 10501)" +echo " - wyoming-satelite-vosk-test.service (спутник, порт 10701)" +echo " - wyoming-wakeword-vosk-test.service (wake word, порт 10401)" +echo "" +echo "🚀 Команды управления:" +echo " # Запуск всех test сервисов" +echo " sudo systemctl start wyoming-event-test.service" +echo " sudo systemctl start wyoming-satelite-vosk-test.service" +echo " sudo systemctl start wyoming-wakeword-vosk-test.service" +echo "" +echo " # Проверка статуса" +echo " sudo systemctl status wyoming-satelite-vosk-test.service" +echo "" +echo " # Остановка" +echo " sudo systemctl stop wyoming-satelite-vosk-test.service" +echo "" +echo "📊 Просмотр логов:" +echo " journalctl -u wyoming-event-test.service -f" +echo " journalctl -u wyoming-satelite-vosk-test.service -f" +echo " journalctl -u wyoming-wakeword-vosk-test.service -f" +echo "" +echo "🌐 WebSocket для тестирования:" +echo " ws://127.0.0.1:8675" +echo "" +echo "💡 Пример подключения:" +echo " python3 examples/websocket-service/test_client.py --uri ws://127.0.0.1:8675" +echo "" diff --git a/services/test/start_test.sh b/services/test/start_test.sh new file mode 100755 index 0000000..e2b1d44 --- /dev/null +++ b/services/test/start_test.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +# +# Быстрый запуск TEST сервисов в tmux +# Не требует установки systemd сервисов +# + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +VENV_PATH="${SCRIPT_DIR}/.venv" +PYTHON="${VENV_PATH}/bin/python3" + +# Проверка venv +if [ ! -f "$PYTHON" ]; then + echo "❌ Виртуальное окружение не найдено: $VENV_PATH" + echo "💡 Запустите: cd ${SCRIPT_DIR} && ./setup_dev.sh" + exit 1 +fi + +echo "🚀 Запуск TEST сервисов в tmux..." +echo "==================================" +echo "" + +# Проверка tmux +if ! command -v tmux &> /dev/null; then + echo "❌ tmux не найден!" + echo "💡 Установите: sudo apt-get install tmux" + exit 1 +fi + +# Очистка старой сессии если существует +tmux kill-session -t satellite-test 2>/dev/null || true + +# Создание новой сессии +echo "📡 Создание сессии 'satellite-test'..." + +# Окно 1: Wake Word (порт 10401) +tmux new-session -d -s satellite-test -n "wakeword" \ + "cd ${SCRIPT_DIR} && source ${VENV_PATH}/bin/activate && \ + python3 local/vosk-wake-dev/script/run \ + --uri tcp://0.0.0.0:10401 \ + --model-path /home/${USER}/projects/models/vosk-model-small-ru-0.22 \ + --rate 16000 \ + --wake-word 'привет дройд'" + +echo " ✅ Wake Word запущен (порт 10401)" + +# Окно 2: Event Service (порт 10501) +tmux split-window -t satellite-test:0 -h \ + "cd ${SCRIPT_DIR}/examples && source ${VENV_PATH}/bin/activate && \ + python3 wyoming-led.py --host 127.0.0.1 --port 10501" + +echo " ✅ Event Service запущен (порт 10501)" + +# Окно 3: Satellite (порт 10701 + WebSocket) +tmux new-window -t satellite-test -n "satellite" \ + "cd ${SCRIPT_DIR} && source ${VENV_PATH}/bin/activate && \ + python3 -m wyoming_satellite \ + --uri tcp://0.0.0.0:10701 \ + --name 'Wyoming Satellite Test' \ + --mic-command 'arecord -D plughw:CARD=Array,DEV=0 -q -r 16000 -c 1 -f S16_LE -t raw' \ + --snd-command 'aplay -D plughw:CARD=Array,DEV=0 -q -r 22050 -c 1 -f S16_LE -t raw' \ + --event-uri tcp://127.0.0.1:10501 \ + --websocket-enabled \ + --websocket-port 8675 \ + --audio-level-enabled \ + --audio-level-interval-ms 100 \ + --debug" + +echo " ✅ Satellite запущен (порт 10701 + WebSocket :8675)" + +# Возврат к первому окну +tmux select-window -t satellite-test:0 + +echo "" +echo "✅ Запуск завершён!" +echo "" +echo "📋 Сессия tmux: 'satellite-test'" +echo "" +echo " Окна:" +echo " 0: Wake Word (порт 10401)" +echo " 1: Event (порт 10501)" +echo " 2: Satellite (порт 10701 + WebSocket :8675)" +echo "" +echo "🎮 Управление tmux:" +echo " tmux attach -t satellite-test # Подключиться" +echo " tmux kill-session -t satellite-test # Остановить" +echo "" +echo "🌐 WebSocket:" +echo " ws://127.0.0.1:8675" +echo "" +echo "💡 Пример подключения:" +echo " source ${VENV_PATH}/bin/activate" +echo " python3 examples/websocket-service/test_client.py --uri ws://127.0.0.1:8675" +echo "" diff --git a/services/test/wyoming-event-test.service b/services/test/wyoming-event-test.service new file mode 100644 index 0000000..191badb --- /dev/null +++ b/services/test/wyoming-event-test.service @@ -0,0 +1,37 @@ +[Unit] +Description=Wyoming Event Service Test (LED control) +After=network.target + +[Service] +Type=simple + +# 🔹 Запуск от имени вашего пользователя +User=__CURRENT_USER__ +Group=__CURRENT_USER__ + +# 🔹 Рабочая директория — где лежит wyoming-led.py +WorkingDirectory=__SAT_BASE_DIR__/examples + +# 🔹 Test порт 10501 вместо 10500 +ExecStart=satellite-python __SAT_BASE_DIR__/examples/wyoming-led.py --host 127.0.0.1 --port 10501 + +# 🔹 Критически важно: передаём окружение +Environment="HOME=__HOME_DIR__" +Environment="USER=__CURRENT_USER__" +Environment="PATH=__SAT_VENV__/bin:/usr/local/bin:/usr/bin:/bin" +Environment="VIRTUAL_ENV=__SAT_VENV__" + +# 🔹 Разрешаем доступ к устройству (на всякий случай) +PrivateDevices=false + +# 🔹 Перезапуск при ошибке +Restart=on-failure +RestartSec=3 + +# 🔹 Логирование в journal +StandardOutput=journal +StandardError=journal +SyslogIdentifier=wyoming-event-test + +[Install] +WantedBy=multi-user.target diff --git a/services/test/wyoming-satelite-vosk-test.service b/services/test/wyoming-satelite-vosk-test.service new file mode 100644 index 0000000..233976f --- /dev/null +++ b/services/test/wyoming-satelite-vosk-test.service @@ -0,0 +1,27 @@ +[Unit] +Description=Wyoming Satellite Test (dev branch) +Requires=network.target + +[Service] +Type=simple +User=__CURRENT_USER__ +WorkingDirectory=__SAT_BASE_DIR__ + +# Запуск satellite с WebSocket и Audio Level +ExecStart=__SAT_VENV__/bin/python3 -m wyoming_satellite \ + --uri tcp://0.0.0.0:10701 \ + --name 'Wyoming Satellite Test' \ + --mic-command 'arecord -D plughw:CARD=Array,DEV=0 -q -r 16000 -c 1 -f S16_LE -t raw' \ + --snd-command 'aplay -D plughw:CARD=Array,DEV=0 -q -r 22050 -c 1 -f S16_LE -t raw' \ + --event-uri tcp://127.0.0.1:10501 \ + --websocket-enabled \ + --websocket-port 8675 \ + --audio-level-enabled \ + --audio-level-interval-ms 100 \ + --debug + +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target diff --git a/services/test/wyoming-wakeword-vosk-test.service b/services/test/wyoming-wakeword-vosk-test.service new file mode 100644 index 0000000..5082c7b --- /dev/null +++ b/services/test/wyoming-wakeword-vosk-test.service @@ -0,0 +1,20 @@ +[Unit] +Description=voskWakeWord Test + +[Service] +Type=simple +User=__CURRENT_USER__ + +# Test порт 10401 вместо 10400 +ExecStart=satellite-python __SAT_BASE_DIR__/local/vosk-wake-dev/script/run \ + --uri tcp://0.0.0.0:10401 \ + --model-path /home/__CURRENT_USER__/projects/models/vosk-model-small-ru-0.22 \ + --rate 16000 \ + --wake-word "привет дройд" + +WorkingDirectory=__SAT_BASE_DIR__/local/vosk-wake-dev +Restart=always +RestartSec=1 + +[Install] +WantedBy=default.target