Пошаговая инструкция по развёртыванию Hub через Docker

Установка через Docker

Рекомендуемый способ для одного сервера. Один Docker-образ Hub (bidder-hub) запускает приложение — REST API и веб-интерфейс на одном порту (8082), — а рядом поднимается PostgreSQL. Отдельного контейнера с фронтендом нет: веб-интерфейс отдаёт сам Hub.

i

Перед началом убедитесь, что Docker установлен и запущен: приложение Docker (Docker Desktop) должно быть открыто и работать. Без запущенного Docker команды docker compose выполняться не будут.

Шаг 1. Создайте файл docker-compose.yml

Создайте на сервере отдельную папку для Hub (например, bidder-hub) — в ней будут лежать оба файла развёртывания. В этой папке создайте файл docker-compose.yml со следующим содержимым:

yaml
x-logging: &default-logging
  driver: json-file
  options:
    max-size: "20m"
    max-file: "5"

services:
  hub:
    image: ${HUB_IMAGE}
    ports:
      - "${HUB_PORT:-8082}:8082"
      - "${HUB_MANAGEMENT_PORT:-8081}:8081"
    environment:
      TZ: UTC
      SPRING_PROFILES_ACTIVE: "PROD,COMPOSE"
      MANAGEMENT_SERVER_PORT: "${HUB_MANAGEMENT_PORT:-8081}"
      JAVA_OPTS: "${JAVA_OPTS:--Xmx512m -Xms256m -XX:+UseG1GC -Duser.timezone=UTC}"

      DATABASE_URL: "${DATABASE_URL:-r2dbc:postgresql://postgres:5432/hub}"
      DATABASE_JDBC_URL: "${DATABASE_JDBC_URL:-jdbc:postgresql://postgres:5432/hub}"
      DATABASE_USERNAME: "${DATABASE_USERNAME:-hub}"
      DATABASE_PASSWORD: "${DATABASE_PASSWORD}"
      DATABASE_POOL_INITIAL_SIZE: "${DATABASE_POOL_INITIAL_SIZE:-5}"
      DATABASE_POOL_MAX_SIZE: "${DATABASE_POOL_MAX_SIZE:-10}"
      DATABASE_POOL_MAX_IDLE_TIME: "${DATABASE_POOL_MAX_IDLE_TIME:-30m}"

      HUB_NAME: "${HUB_NAME:-Hub}"
      HUB_ADMIN_USERNAME: "${HUB_ADMIN_USERNAME}"
      HUB_ADMIN_PASSWORD: "${HUB_ADMIN_PASSWORD}"

      CORE_GRPC_HOST: "${CORE_GRPC_HOST}"
      CORE_PORTAL_URL: "${CORE_PORTAL_URL}"

      CIPHER_SALT: "${CIPHER_SALT}"

      LOG_PATH: "/tmp/logs"
    volumes:
      - ${HUB_LOG_DIR:-./logs}:/tmp/logs
    logging: *default-logging
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    command: ["postgres", "-c", "timezone=UTC", "-c", "log_timezone=UTC"]
    environment:
      POSTGRES_DB: hub
      POSTGRES_USER: hub
      POSTGRES_PASSWORD: "${DATABASE_PASSWORD}"
      PGTZ: UTC
      TZ: UTC
    ports:
      - "${POSTGRES_PORT:-5432}:5432"
    volumes:
      - hub-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U hub -d hub"]
      interval: 5s
      timeout: 5s
      retries: 5
    logging: *default-logging
    restart: unless-stopped

volumes:
  hub-data:

Шаг 2. Создайте файл .env

Рядом с docker-compose.yml, в той же папке, создайте файл .env — в нём хранятся настройки Hub. Скопируйте в него шаблон ниже:

dotenv
# Образ Hub. Реестр публичный на чтение — авторизация не нужна.
# Актуальную версию (тег) при необходимости уточните у вендора.
HUB_IMAGE=cr.yandex/crph7576m5ukcpvf6o0t/bidder-hub:1.0.8

# Подключение к Core
CORE_GRPC_HOST=grpc.bidder-box.ru
CORE_PORTAL_URL=app.bidder-box.ru

# База данных — придумайте надёжный пароль
DATABASE_PASSWORD=

# Первый администратор Hub
HUB_ADMIN_USERNAME=admin
HUB_ADMIN_PASSWORD=

# Соль для шифрования — случайная строка (например, openssl rand -hex 32)
CIPHER_SALT=

Адрес образа и параметры подключения к Core уже заполнены — осталось задать пароли и соль (следующий шаг).

Шаг 3. Заполните пароли и соль

Откройте .env любым текстовым редактором и заполните пустые значения:

Обязательные параметры

ПеременнаяЧто вписать
DATABASE_PASSWORDПридумайте надёжный пароль для базы данных
HUB_ADMIN_USERNAMEЛогин первого администратора Hub (по умолчанию admin)
HUB_ADMIN_PASSWORDПридумайте надёжный пароль администратора
CIPHER_SALTСоль для шифрования данных — просто набор случайных символов
i

HUB_IMAGE, CORE_GRPC_HOST и CORE_PORTAL_URL уже заполнены в шаблоне — менять их не нужно.

i

Как получить CIPHER_SALT. Это просто длинная строка случайных символов — сгенерируйте её любым удобным способом: например, найдите в браузере по запросу «сгенерировать соль онлайн» или просто случайно понажимайте клавиши на клавиатуре.

!

Сохраните HUB_ADMIN_USERNAME, DATABASE_PASSWORD, HUB_ADMIN_PASSWORD и CIPHER_SALT в безопасном месте. После первого запуска их нельзя изменить без пересоздания базы данных.

Необязательные параметры

ПеременнаяПо умолчаниюОписание
HUB_PORT8082Порт хоста для веб-интерфейса и REST API (на нём Hub доступен в браузере)
HUB_MANAGEMENT_PORT8081Порт служебных эндпоинтов: проверка состояния (/actuator/health) и метрики
POSTGRES_PORT5432Порт, на котором база данных видна снаружи контейнера. Нужен, только если вы подключаетесь к базе напрямую (например, инструментом администрирования). Оставьте пустым — и PostgreSQL будет доступен лишь самому Hub внутри Docker (безопаснее)
HUB_NAMEHubОтображаемое имя Hub в интерфейсе
JAVA_OPTS-Xmx512m -Xms256m -XX:+UseG1GCПараметры JVM

Параметры базы данных (при использовании внешнего PostgreSQL)

По умолчанию PostgreSQL запускается в отдельном контейнере. Чтобы использовать внешнюю базу данных, задайте все три переменные одновременно — Hub использует и R2DBC (реактивный доступ), и JDBC (для Liquibase-миграций):

ПеременнаяПо умолчаниюОписание
DATABASE_URLr2dbc:postgresql://postgres:5432/hubR2DBC URL базы данных
DATABASE_JDBC_URLjdbc:postgresql://postgres:5432/hubJDBC URL для Liquibase-миграций
DATABASE_USERNAMEhubПользователь базы данных

Шаг 4. Запустите Hub

Откройте терминал, перейдите командой cd в папку с файлами docker-compose.yml и .env и выполните команду запуска:

bash
docker compose up -d

При первом запуске происходит следующее:

1
PostgreSQL инициализируется.
2
Liquibase автоматически применяет миграции базы данных.
3
Создаётся учётная запись администратора из HUB_ADMIN_USERNAME / HUB_ADMIN_PASSWORD.
4
Генерируется и сохраняется (зашифровано) пара JWT-ключей.
5
Hub устанавливает gRPC-соединение с Core (с автоматическими повторными попытками).

Шаг 5. Проверьте, что Hub запустился

Откройте в браузере веб-интерфейс — его отдаёт сам Hub на том же порту, что и API:

http://localhost:8082/

Если открылась страница входа/привязки Hub — значит, всё работает, можно переходить к активации.

(по желанию, из терминала) проверить ответ Hub можно командой:

bash
curl http://localhost:8082/public/api/v1/activation/status

Если страница не открывается или что-то идёт не так — см. Устранение неполадок.

Просмотр логов

bash
docker compose logs -f hub
docker compose logs -f postgres

Обновление Hub

1
Создайте резервную копию базы данных:
bash
docker compose exec postgres pg_dump -U hub hub > backup_$(date +%Y%m%d_%H%M%S).sql
2
Обновите значение HUB_IMAGE в .env на новый тег (выдаёт вендор).
3
Скачайте и запустите новый образ:
bash
docker compose pull hub
docker compose up -d hub
4
Проверьте, что Hub снова доступен — откройте http://localhost:8082/ в браузере или выполните:
bash
curl http://localhost:8082/public/api/v1/activation/status

Откат к предыдущей версии

1
Остановите Hub:
bash
docker compose stop hub
2
Восстановите базу из резервной копии:
bash
docker compose exec -T postgres psql -U hub hub < backup_YYYYMMDD_HHMMSS.sql
3
Верните предыдущее значение HUB_IMAGE в .env.
4
Запустите Hub:
bash
docker compose up -d hub

Резервное копирование

bash
docker compose exec postgres pg_dump -U hub hub > backup_$(date +%Y%m%d_%H%M%S).sql

Восстановление:

bash
docker compose exec -T postgres psql -U hub hub < backup_YYYYMMDD_HHMMSS.sql
!

Перед обновлением Hub всегда создавайте резервную копию базы данных.

Следующий шаг

После успешного запуска активируйте Hub и подключитесь к Core.