Перейти к содержимому

Установка — Docker Compose

import { Aside, Steps } from ‘@astrojs/starlight/components’;

  • Docker Engine и Docker Compose
  • Bluetooth-адаптер на хосте
  • PulseAudio или PipeWire на хосте
  • Music Assistant в вашей сети

Публикуемый образ поддерживает linux/amd64, linux/arm64 и linux/arm/v7.

  1. Сначала сопрягите колонку на хосте

    Окно терминала
    bluetoothctl
    scan on
    pair AA:BB:CC:DD:EE:FF
    trust AA:BB:CC:DD:EE:FF
    connect AA:BB:CC:DD:EE:FF
    exit
  2. Создайте .env

    AUDIO_UID=1000
    TZ=Europe/Moscow
    WEB_PORT=8080
    BASE_LISTEN_PORT=8928
  3. Создайте docker-compose.yml

    services:
    sendspin-client:
    image: ghcr.io/trudenboy/sendspin-bt-bridge:latest
    container_name: sendspin-client
    restart: unless-stopped
    network_mode: host
    volumes:
    - /var/run/dbus:/var/run/dbus
    - /run/user/${AUDIO_UID:-1000}/pulse:/run/user/${AUDIO_UID:-1000}/pulse
    - /run/user/${AUDIO_UID:-1000}/pipewire-0:/run/user/${AUDIO_UID:-1000}/pipewire-0
    - /etc/docker/Sendspin:/config
    environment:
    - SENDSPIN_SERVER=auto
    - TZ=${TZ:-UTC}
    - WEB_PORT=${WEB_PORT:-8080}
    - BASE_LISTEN_PORT=${BASE_LISTEN_PORT:-8928}
    - CONFIG_DIR=/config
    - PULSE_SERVER=unix:/run/user/${AUDIO_UID:-1000}/pulse/native
    - XDG_RUNTIME_DIR=/run/user/${AUDIO_UID:-1000}
    devices:
    - /dev/bus/usb:/dev/bus/usb
    cap_add:
    - NET_ADMIN
    - NET_RAW
  4. Запустите контейнер

    Окно терминала
    mkdir -p /etc/docker/Sendspin
    docker compose up -d
  5. Откройте веб-интерфейс

    http://<ip-хоста>:<WEB_PORT>
  • WEB_PORT управляет прямым listener’ом веб-интерфейса/API в Docker-режиме.
  • BASE_LISTEN_PORT задаёт базовый Sendspin-порт для устройств без явного listen_port.
  • Каждое устройство без ручного порта получает BASE_LISTEN_PORT + индекс_устройства.
  • В сложных схемах можно задать listen_port и listen_host на уровне устройства через веб-интерфейс или /config/config.json после первого запуска.

Пример блока устройства в /config/config.json:

{
"mac": "11:22:33:44:55:66",
"player_name": "Колонка на кухне",
"listen_port": 8935,
"listen_host": "192.168.1.50"
}

listen_host меняет только рекламируемый host/IP для плеера и не влияет на bind-адрес внутри контейнера.

Если вы запускаете несколько bridge-контейнеров на одной машине:

  • задайте каждому контейнеру уникальный WEB_PORT
  • задайте каждому контейнеру уникальный BASE_LISTEN_PORT
  • не настраивайте одну и ту же Bluetooth-колонку в двух работающих контейнерах

network_mode: host обязателен для:

  • mDNS-обнаружения при SENDSPIN_SERVER=auto
  • доступа к Bluetooth-стеку хоста через D-Bus

Необходимые capabilities:

CapabilityНазначение
NET_ADMINУправление Bluetooth-адаптером
NET_RAWRaw Bluetooth/HCI socket access
Окно терминала
docker logs -f sendspin-client
curl -s http://localhost:${WEB_PORT:-8080}/api/preflight | python3 -m json.tool

Изменения устройств, адаптеров, WEB_PORT, BASE_LISTEN_PORT и настроек подключения к Music Assistant требуют перезапуска контейнера.