Files
vixy-vision/server/setup.sh
Alex e1171e8ff8 Add TFLite object detection to reduce false positives
Motion detection now optionally runs MobileNet V2 SSD (COCO, quantized)
on frames that trigger motion, identifying objects like people, cats, and
cars. Events without detected objects are suppressed by default. Snapshots
include bounding box annotations. New MCP tool vision_get_detections()
enables label-based queries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 17:04:10 -06:00

163 lines
4.7 KiB
Bash

#!/bin/bash
# vixy-vision Server Setup Script
# Run this on a Raspberry Pi or similar edge device
#
# Usage: ./setup.sh
#
# Reads SERVICE_NAME and PORT from .env file for multi-instance support
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
echo_error() { echo -e "${RED}[ERROR]${NC} $1"; }
echo "=========================================="
echo " vixy-vision Server Setup"
echo " Eyes for the fox 🦊"
echo "=========================================="
echo ""
# Check if running on Linux
if [[ "$(uname)" != "Linux" ]]; then
echo_error "This script is designed for Linux (Raspberry Pi)"
exit 1
fi
# Check for .env file
if [ ! -f "${SCRIPT_DIR}/.env" ]; then
echo_error "No .env file found!"
echo_info "Copy env.example to .env and configure it first:"
echo " cp env.example .env"
echo " nano .env"
exit 1
fi
# Load configuration from .env
source "${SCRIPT_DIR}/.env"
# Set defaults if not in .env
SERVICE_NAME="${SERVICE_NAME:-vixy-vision}"
PORT="${PORT:-8443}"
CAMERA_ID="${CAMERA_ID:-camera}"
echo_info "Configuration:"
echo " SERVICE_NAME: ${SERVICE_NAME}"
echo " PORT: ${PORT}"
echo " CAMERA_ID: ${CAMERA_ID}"
echo ""
# Install directory based on service name
INSTALL_DIR="${HOME}/${SERVICE_NAME}"
# Install system dependencies
echo_info "Installing system dependencies..."
sudo apt-get update
sudo apt-get install -y python3-pip python3-venv libopencv-dev python3-opencv
# Create install directory
echo_info "Creating install directory: ${INSTALL_DIR}"
mkdir -p "${INSTALL_DIR}"
mkdir -p "${INSTALL_DIR}/ssl"
# Copy files
cp "${SCRIPT_DIR}/main.py" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/motion.py" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/detector.py" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/requirements.txt" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/generate_cert.sh" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/download_model.sh" "${INSTALL_DIR}/"
cp "${SCRIPT_DIR}/.env" "${INSTALL_DIR}/"
# Copy model files
mkdir -p "${INSTALL_DIR}/models"
cp "${SCRIPT_DIR}/models/coco_labels.txt" "${INSTALL_DIR}/models/"
# Create virtual environment
echo_info "Creating Python virtual environment..."
cd "${INSTALL_DIR}"
python3 -m venv venv
source venv/bin/activate
# Install Python dependencies
echo_info "Installing Python dependencies..."
pip install --upgrade pip
pip install -r requirements.txt
# Install TFLite runtime for object detection
echo_info "Installing TFLite runtime for object detection..."
pip install tflite-runtime 2>/dev/null || echo_warn "tflite-runtime not available for this platform (object detection will be disabled)"
# Download object detection model (if not already present)
if [ -f "${INSTALL_DIR}/models/ssd_mobilenet_v2_coco_quant_postprocess.tflite" ]; then
echo_info "Object detection model already present"
else
echo_info "Downloading object detection model..."
chmod +x "${INSTALL_DIR}/download_model.sh"
cd "${INSTALL_DIR}" && ./download_model.sh
fi
# Generate SSL certificates if not present
if [ ! -f ssl/cert.pem ]; then
echo_info "Generating SSL certificates..."
chmod +x generate_cert.sh
./generate_cert.sh
else
echo_info "SSL certificates already exist"
fi
# Create systemd service
echo_info "Creating systemd service: ${SERVICE_NAME}"
sudo tee /etc/systemd/system/${SERVICE_NAME}.service > /dev/null << EOF
[Unit]
Description=vixy-vision Camera Server (${CAMERA_ID})
After=network.target
[Service]
Type=simple
User=${USER}
WorkingDirectory=${INSTALL_DIR}
EnvironmentFile=${INSTALL_DIR}/.env
Environment="PATH=${INSTALL_DIR}/venv/bin"
ExecStart=${INSTALL_DIR}/venv/bin/uvicorn main:app --host 0.0.0.0 --port ${PORT} --ssl-keyfile ssl/key.pem --ssl-certfile ssl/cert.pem
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Reload systemd and enable service
sudo systemctl daemon-reload
sudo systemctl enable ${SERVICE_NAME}
echo ""
echo "=========================================="
echo " Setup Complete! 🦊"
echo "=========================================="
echo ""
echo "Service: ${SERVICE_NAME}"
echo "Port: ${PORT}"
echo "Camera ID: ${CAMERA_ID}"
echo ""
echo "Commands:"
echo " Start: sudo systemctl start ${SERVICE_NAME}"
echo " Stop: sudo systemctl stop ${SERVICE_NAME}"
echo " Status: sudo systemctl status ${SERVICE_NAME}"
echo " Logs: sudo journalctl -u ${SERVICE_NAME} -f"
echo ""
echo "Server will be available at:"
echo " https://$(hostname).local:${PORT}/"
echo ""
echo "API Key from .env:"
grep "^API_KEY=" "${INSTALL_DIR}/.env" | cut -d'=' -f2
echo ""
echo_info "Start the server with: sudo systemctl start ${SERVICE_NAME}"