SanadR1/docker/run.sh

54 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Run SanadR1 as a container on the backpack WITHOUT docker-compose (the backpack
# ships no compose plugin). This mirrors docker-compose.yml exactly. Idempotent:
# recreates the container from the already-loaded sanadr1:latest image.
#
# cd ~/SanadR1/docker && ./run.sh
#
# Auto-start on boot is handled by --restart unless-stopped + the docker service.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
[ -f "$HERE/.env" ] || { echo "!! $HERE/.env missing (set SANAD_GEMINI_API_KEY)"; exit 1; }
docker image inspect sanadr1:latest >/dev/null 2>&1 || {
echo "!! image sanadr1:latest not loaded — docker load < sanadr1-latest-arm64.tar.gz"; exit 1; }
# Pass the host's USB sound cards in when present (Anker/JBL-style external
# audio). gid 29 = the host 'audio' group that owns /dev/snd, so the in-container
# app user can reach it. Absent → the container runs DDS-audio-only as before.
SND_ARGS=()
if [ -e /dev/snd ]; then
SND_ARGS=(--device /dev/snd --group-add 29)
echo ">> /dev/snd found — enabling USB audio passthrough"
fi
# Robot DDS interface — portable across R1 backpacks. If .env pins one
# (install.sh writes the detected value there) we defer to it; otherwise
# auto-detect the NIC holding a 192.168.123.x address (the R1 internal net),
# falling back to eth10 (the standard EDU-backpack name). The entrypoint also
# defaults to eth10, so this is belt-and-suspenders.
IFACE_ARGS=()
if ! grep -q '^SANAD_DDS_INTERFACE=' "$HERE/.env" 2>/dev/null; then
IFACE="$(ip -o -4 addr show 2>/dev/null | awk '$4 ~ /^192\.168\.123\./{print $2; exit}')"
[ -n "$IFACE" ] || IFACE=eth10
IFACE_ARGS=(-e "SANAD_DDS_INTERFACE=$IFACE")
echo ">> DDS interface auto-detected: $IFACE"
fi
docker rm -f sanadr1 2>/dev/null || true
docker run -d --name sanadr1 \
--network host \
--restart unless-stopped \
--env-file "$HERE/.env" \
"${IFACE_ARGS[@]}" \
-e SANAD_DASHBOARD_HOST=0.0.0.0 \
-e SANAD_NAV_TOOLS=0 \
-e SANAD_AUDIO_PROFILE=builtin \
-e SANAD_VOICE_BRAIN=gemini \
"${SND_ARGS[@]}" \
-v sanadr1_data:/opt/SanadR1/data \
-v sanadr1_logs:/opt/SanadR1/logs \
sanadr1:latest
echo ">> started. logs: docker logs -f sanadr1 dashboard: http://<backpack-ip>:8001"