feat: добавить TEST сервисы для разработки
- services/test/*.service — 3 test сервиса (порты +1) - install_test_services.sh — установка test сервисов - services/test/start_test.sh — быстрый запуск в tmux - docs/deployment/systemd-services.md — документация TEST сервисы: - wyoming-satelite-vosk-test.service :10701 + WebSocket :8675 - wyoming-wakeword-vosk-test.service :10401 - wyoming-event-test.service :10501 Использование: 1. sudo ./install_test_services.sh — установка 2. sudo systemctl start wyoming-*-test.service — запуск 3. ./services/test/start_test.sh — запуск в tmux Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
Executable
+103
@@ -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 ""
|
||||
Executable
+95
@@ -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 ""
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user