Установка BARY в Docker

Введение

Эта инструкция описывает установку BARY в Docker на Linux-сервере.

Схема запуска такая:

  • bary запускает server.js как постоянный сервис
  • install.js запускается внутри уже работающего контейнера bary
  • bary использует host network для корректной работы discovery, mDNS и HomeKit
  • SQLite база, logs и persist сохраняются на хосте
  • при необходимости позже можно перейти на MySQL

Что понадобится

  • Linux-сервер с установленными Docker и Docker Compose
  • доступ к терминалу с правами на запуск Docker
  • свободный TCP-порт 80 для веб-интерфейса
  • свободный UDP-порт 5353 для mDNS/Bonjour

Проверьте, что Docker доступен:

docker --version
docker compose version

1. Создайте рабочую директорию

mkdir -p /opt/stacks/bary
cd /opt/stacks/bary

2. Создайте Dockerfile

FROM node:16-bullseye
RUN apt-get -y update
RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata
RUN apt-get install -y iproute2 dnsmasq hostapd iw autoconf automake libtool g++ pkg-config mosquitto sqlite3 samba samba-client ntp libudev-dev build-essential
RUN apt-get install -y git wget zip
RUN apt-get install -y ffmpeg
RUN apt-get install -y avahi-daemon avahi-discover libnss-mdns libavahi-compat-libdnssd-dev
RUN mkdir -p /srv
WORKDIR /srv
RUN wget http://bary.io/bary-core-dev.zip -O core.zip
RUN wget http://bary.io/bary-client-latest.zip -O www.zip
RUN unzip -o core.zip
RUN rm core.zip
RUN rm -rf www
RUN mkdir -p www
RUN unzip -o www.zip -d /srv/www
RUN rm www.zip
RUN cp -n ./package_example.json ./package.json
RUN npm install
RUN npm install mysql2
RUN sed -i 's/#enable-dbus=yes/enable-dbus=yes/g' /etc/avahi/avahi-daemon.conf
EXPOSE 80/tcp
EXPOSE 5353/udp
CMD /etc/init.d/dbus restart && /etc/init.d/avahi-daemon restart && node /srv/server.js

3. Создайте docker-compose.yml

services:
  mysql:
    image: mysql:8.0
    container_name: bary-mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: bary
      MYSQL_USER: bary
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    command:
      - --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - '3306:3306'

  bary:
    build: .
    container_name: bary
    restart: unless-stopped
    depends_on:
      - mysql
    network_mode: host
    volumes:
      - ./config:/srv/config
      - ./database.sqlite:/srv/database.sqlite
      - ./logs:/srv/logs
      - ./persist:/srv/persist

bary запускается в host network. Это рекомендуется для Linux-сервера, если используются HomeKit, mDNS и discovery в локальной сети.

mysql в compose уже подготовлен для последующего перехода на MySQL, но для базовой установки можно использовать SQLite.

mysql2 устанавливается в образ явно, чтобы BARY мог работать с MySQL даже если в архивном package_example.json этот модуль отсутствует.

Важно про host network

  • Эта схема рассчитана на Linux-сервер. На macOS и Windows поведение host network отличается.
  • Порт 80 на хосте должен быть свободен, так как bary будет слушать его напрямую.
  • Порт 5353/udp нужен для mDNS/Bonjour discovery. Если он уже занят другим сервисом на хосте, обнаружение устройств и сетевые объявления будут конфликтовать.
  • HomeKit использует не только mDNS, поэтому для корректной работы важна вся сетевая схема целиком, а не только один порт.
  • Если на сервере уже работает reverse proxy или другой веб-сервис на 80, эту схему нужно адаптировать отдельно.

4. Создайте каталоги и пустую SQLite базу

mkdir -p config logs persist mysql
touch database.sqlite

Проверьте, что database.sqlite создан именно как файл:

ls -l database.sqlite
file database.sqlite

Ожидается обычный файл, а не директория.

5. Проверьте права

chmod 755 config logs persist mysql
chmod 664 database.sqlite
ls -ld config logs persist mysql
ls -l database.sqlite

Если файлы и каталоги были созданы от root, назначьте владельца:

sudo chown -R $USER:$USER /opt/stacks/bary

Быстрая проверка перед запуском

ls -ld /opt/stacks/bary /opt/stacks/bary/config /opt/stacks/bary/logs /opt/stacks/bary/persist /opt/stacks/bary/mysql
ls -l /opt/stacks/bary/database.sqlite
file /opt/stacks/bary/database.sqlite

Ожидаемый результат:

  • database.sqlite существует
  • database.sqlite определяется как обычный файл
  • каталоги config, logs, persist, mysql существуют
  • у текущего пользователя есть права на запись в /opt/stacks/bary

6. Создайте config/config.js

Контейнер читает конфиг только из config/config.js.

Пример минимального конфига для SQLite (будет создан автоматически при установке):

const config = {
  environment: 'production',
  production: {
    dialect: 'sqlite',
    database: 'main',
    storage: './database.sqlite',
  },
  log: {
    path: './logs',
  },
};

module.exports = config;

7. Соберите образ и запустите сервер

sudo docker compose up --build -d bary

8. Выполните установочный скрипт

install.js запускается внутри уже работающего контейнера bary, чтобы не поднимать второй экземпляр BARY с конфликтом HomeKit/mDNS.

sudo docker exec bary node /srv/install.js

После завершения install.js основной сервис bary продолжит работать в фоне.

9. Проверьте запуск

sudo docker ps -a
sudo docker compose logs bary --tail=100

Если всё запустилось успешно, веб-интерфейс будет доступен по адресу:

http://IP_СЕРВЕРА

10. Переход с SQLite на MySQL

mysql уже присутствует в docker-compose.yml, поэтому переход сводится к изменению конфига BARY и подготовке каталога для данных MySQL.

10.1. Убедитесь, что каталог для MySQL существует

mkdir -p /opt/stacks/bary/mysql
chmod 755 /opt/stacks/bary/mysql
ls -ld /opt/stacks/bary/mysql

10.2. Измените config/config.js

Замените SQLite-конфиг на MySQL-конфиг. Так как bary работает в host network, подключение к MySQL должно идти через 127.0.0.1 или localhost, а не через имя сервиса mysql.

{
  "production": {
    "dialect": "mysql",
    "database": "bary",
    "username": "bary",
    "password": "password",
    "host": "127.0.0.1",
    "port": 3306,
    "timezone": "+00:00"
  }
}

Параметры должны совпадать с docker-compose.yml:

  • database -> MYSQL_DATABASE
  • username -> MYSQL_USER
  • password -> MYSQL_PASSWORD
  • host -> 127.0.0.1 или localhost
  • port -> 3306

10.3. Запустите стек уже с MySQL

sudo docker compose up --build -d

После старта выполните установочный скрипт:

sudo docker exec bary node /srv/install.js

10.4. Проверьте MySQL

sudo docker compose logs mysql --tail=100
ls -la /opt/stacks/bary/mysql

Если MySQL стартовал корректно, в каталоге /opt/stacks/bary/mysql появятся файлы базы.

Полезные команды

Остановить сервисы:

sudo docker compose down

Пересобрать и запустить заново:

sudo docker compose up --build -d bary
sudo docker exec bary node /srv/install.js

Проверить, что база и логи сохраняются на хосте:

ls -l database.sqlite
ls -la logs
ls -la persist
ls -la mysql