Как собрать фронтенд, запустить бэкенд и развернуть SocksTank на роботе.
cd ~/work/SocksTank
# Python (через uv, рекомендуется)
uv venv
source .venv/bin/activate
uv pip install -e .
# Или через pip
python3 -m venv .venv
source .venv/bin/activate
pip install -e .cd frontend
npm install # один раз
npm run build # собрать в frontend/dist/./main.py serve --mockОткрыть: http://localhost:8080
Флаг --mock заменяет GPIO, камеру и сенсоры на заглушки — можно разрабатывать без RPi.
Для работы над фронтендом — два терминала:
# Терминал 1: бэкенд
./main.py serve --mock
# Терминал 2: Vite dev server (hot-reload)
cd frontend && npm run devФронтенд: http://localhost:5173 (с hot-reload, проксирует API на порт 8080).
Перед тем как использовать rpi5 как hostname в командах ниже, убедись, что твоя dev-машина его резолвит. Типовой вариант:
# ~/.ssh/config
Host rpi5
HostName 192.168.0.158
User user
Host blackops
HostName 192.168.0.124
User user
IdentityFile ~/.ssh/blackops
# /etc/hosts (необязательный fallback, если mDNS работает нестабильно)
192.168.0.158 rpi5
192.168.0.124 blackops
См. также: infrastructure.md
Самый удобный сценарий деплоя — встроенная команда:
./main.py deploy rpi5
# Эквивалентная явная форма
./main.py deploy --host rpi5Используй этот путь по умолчанию, если только ты специально не отлаживаешь сам процесс деплоя или не делаешь разовую ручную установку.
Что она делает:
- локально собирает фронтенд (если не указан
--skip-build) - синхронизирует проект в
~/sockstankчерезrsync - ставит runtime-зависимости на RPi (
uv, если доступен, иначеpip) - перезапускает
sockstank.service(через systemd), если unit существует, иначе использует fallback черезnohup python3 main.py serve ... - ждёт health check
/api/statusна порту8080
Полезные флаги:
--skip-build--skip-install--skip-restart--dry-run
Связанные команды для эксплуатации:
# Только перезапустить удалённый сервер
./main.py restart rpi5
# Показать последние логи
./main.py logs rpi5 --lines 100Если хочешь, чтобы deploy и restart использовали systemctl, а не fallback через nohup, один раз установи bundled unit:
./main.py install-service rpi5Требования:
- SSH-пользователь должен уметь выполнять
sudoбез интерактивного запроса пароля (sudo -n)1 - проект уже должен быть на хосте (например, после
./main.py deploy rpi5)
Внутри команда рендерит scripts/sockstank.service под текущего SSH-пользователя, копирует его в /etc/systemd/system/, выполняет daemon-reload и включает сервис. После этого веб-сервер работает от этого пользователя, а не от root.
После этого можно использовать:
./main.py restart rpi5
./main.py logs rpi5Используй этот путь только если нужно пройти деплой по шагам для отладки или если встроенная команда deploy временно недоступна.
rsync -avz --exclude .venv --exclude frontend/node_modules --exclude __pycache__ --exclude .git \
~/work/SocksTank/ rpi5:~/sockstank/ssh rpi5
# Предпочтительно (если установлен uv)
uv pip install --system "typer>=0.9" ultralytics opencv-python-headless numpy "fastapi>=0.104" "uvicorn[standard]>=0.24" "pydantic-settings>=2.0" "websockets>=12.0" "httpx>=0.25" "paramiko>=3.0" "pyyaml>=6.0"
# Fallback (если uv нет)
python3 -m pip install "typer>=0.9" ultralytics opencv-python-headless numpy "fastapi>=0.104" "uvicorn[standard]>=0.24" "pydantic-settings>=2.0" "websockets>=12.0" "httpx>=0.25" "paramiko>=3.0" "pyyaml>=6.0" --break-system-packagespicamera2 уже предустановлен в Raspberry Pi OS.
cd ~/sockstank
# Простой запуск
sudo -E python3 main.py serve --model models/yolo11_best_ncnn_model --conf 0.5
# С NcnnNativeDetector (14.9–15.8 FPS на RPi 5)
sudo -E python3 main.py serve --model models/yolo11_best_ncnn_model --conf 0.5 --ncnn-cpp --ncnn-threads 4
# В фоне (рекомендуется)
sudo -E nohup python3 main.py serve --model models/yolo11_best_ncnn_model --conf 0.5 > /tmp/sockstank.log 2>&1 &Открыть: http://rpi5:8080
Логи: tail -f /tmp/sockstank.log
sudo -E — sudo для доступа к камере и GPIO, -E наследует PYTHONPATH.
| Параметр | По умолчанию | Описание |
|---|---|---|
--model |
auto (.pt на dev/GPU, ncnn на RPi) |
Путь к модели (см. ниже) |
--conf |
0.5 |
Порог уверенности (0.0–1.0) |
--host |
0.0.0.0 |
Адрес привязки |
--port |
8080 |
HTTP/WebSocket порт |
--mock |
false |
Mock-режим (без GPIO/камеры) |
--ncnn-cpp |
false |
NcnnNativeDetector (pip ncnn + OMP workaround) |
--ncnn-threads |
2 |
Количество OMP потоков для ncnn (1–4) |
--pcb-version |
1 |
PCB версия платы Freenove (1 или 2) |
Какую модель указывать в
--model?
- RPi (продакшен):
models/yolo11_best_ncnn_model— NCNN FP32, 15 FPS- GPU-сервер:
models/yolo11_best.pt— PyTorch, 314 FPS на CUDA- macOS / dev:
models/yolo11_best.pt— PyTorch (или--mockбез модели)Если
--modelне указан, SocksTank выбирает автоматически:.ptна dev/GPU-хостах иmodels/yolo11_best_ncnn_modelна Raspberry Pi. Явный путь по-прежнему имеет приоритет.
Все параметры можно задать через переменные окружения с префиксом SOCKSTANK_:
SOCKSTANK_MODEL_PATH="models/yolo11_best_ncnn_model" SOCKSTANK_MOCK=true python3 main.py serveПосле изменений в frontend/:
# На dev-машине
cd frontend && npm run build
# Скопировать на RPi
rsync -avz frontend/dist/ rpi5:~/sockstank/frontend/dist/Перезапустить serve на RPi.
Подробнее: inference.md — Удалённый инференс
# На GPU-сервере (blackops)
python3 -m server.inference_server --port 8090 # на Linux использовать python3; автоматически выберет models/yolo11_best.pt на GPU/dev-хостахВ веб-панели: Inference → + Add GPU Server → ввести хост, порт, SSH-ключ → Save.
| ← Предыдущая | README | Следующая → |
|---|---|---|
| Тренировка модели | Вернуться к README | Запуск на роботе |
Footnotes
-
Пример на RPi: выполни
sudo visudo -f /etc/sudoers.d/sockstank, затем добавь правило видаzeus ALL=(ALL) NOPASSWD: /bin/cp, /bin/systemctl. Замениzeusна своего SSH-пользователя. Так passwordless sudo остаётся ограниченным только командами, которые нужны для установки и перезапуска сервиса. ↩