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

Введение

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

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

  • bary запускает server.js как постоянный сервис
  • install.js запускается внутри уже работающего контейнера bary
  • bary использует host network для корректной работы discovery, mDNS и HomeKit
  • весь рабочий runtime BARY хранится на хосте в каталоге runtime, который монтируется в контейнер как /srv
  • SSH-ключи контейнера хранятся отдельно в каталоге .ssh, который монтируется в /root/.ssh
  • при необходимости позже можно перейти на 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 smbclient python3
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:
      - ./runtime:/srv
      - ./.ssh:/root/.ssh

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

mysql в compose уже подготовлен для последующего перехода на MySQL.

В этой схеме весь runtime смонтирован целиком как ./runtime:/srv. Это означает, что рабочие файлы BARY живут на хосте в одном каталоге и сохраняются после пересоздания контейнера.

Каталог .ssh вынесен отдельно, чтобы ключи для внешних SSH-драйверов не терялись после пересоздания контейнера.

Важно про host network

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

4. Создайте каталоги runtime и SSH-ключей

mkdir -p runtime mysql .ssh

Каталог runtime будет наполняться самим BARY в процессе установки, поэтому заранее создавать в нём ничего не требуется.

Если планируются внешние SSH-драйверы, поместите ключи в .ssh:

chmod 700 .ssh
chmod 600 .ssh/id_rsa
chmod 644 .ssh/id_rsa.pub

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

chmod 755 runtime mysql
ls -ld runtime mysql .ssh
ls -l .ssh

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

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

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

ls -ld /opt/stacks/bary /opt/stacks/bary/runtime /opt/stacks/bary/mysql /opt/stacks/bary/.ssh
ls -la /opt/stacks/bary/.ssh

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

  • каталоги runtime, mysql и .ssh существуют
  • у текущего пользователя есть права на запись в /opt/stacks/bary
  • если используются внешние SSH-драйверы, в .ssh есть id_rsa и id_rsa.pub

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

Контейнер читает конфиг из /srv/config/config.js, то есть фактически из runtime/config/config.js.

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

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

module.exports = config;

Если файла ещё нет, это не критично: после установки он обычно появляется внутри runtime.

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

sudo docker compose up --build -d bary

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

install.js запускается внутри уже работающего контейнера bary.

sudo docker exec bary node /srv/install.js

После завершения install.js основной сервис bary продолжит работать в фоне, а runtime останется на хосте в ./runtime, на экране появится QR-код.

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

sudo docker ps -a
sudo docker compose logs bary --tail=100
ls -la runtime

После установки в runtime должны появиться рабочие файлы BARY, например:

  • server.js
  • config
  • logs
  • persist
  • plugins
  • package.json
  • node_modules

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

Если в дальнейшем потребуется перейти на MySQL, контейнер bary-mysql уже готов. Для этого нужно будет изменить конфиг внутри runtime/config/config.js.

Пример секции production:

production: {
  username: 'root',
  password: 'password',
  database: 'bary',
  host: '127.0.0.1',
  dialect: 'mysql',
}

После изменения конфига перезапустите bary.

Примечания

  • runtime монтируется в /srv целиком, поэтому это основной рабочий каталог BARY
  • содержимое /srv, собранное в образе, при запуске перекрывается bind mount’ом ./runtime:/srv
  • поэтому актуальное рабочее состояние всегда нужно смотреть в runtime
  • логи находятся в runtime/logs