# Системная информация

# Системные требования

### Операционная система

Linux Ubuntu 22.04 или выше; Debian 12 или выше; Windows 7 или выше

### Процессор

Рекомендуемое кол-во ядер: 16 или больше

### Оперативная память

Рекомендуемый объем: 64 Gb или больше

### Дисковое пространство

Тип диска: SSD  
Рекомендуемый объем: 300 Gb

### Технологический стэк

Docker version 20.10.17 или выше,   
Docker-compose version 1.25.4 или выше

### Базы данных

PostgreSQL 16  
Clickhouse v23.8.2.7

# Технические рекомендации

### Процессор

Fastboard использует для обработки данных СУБД российской разработки Clickhouse. ClickHouse реализует параллельную обработку данных и использует все доступные аппаратные ресурсы. При выборе процессора учитывайте, что ClickHouse работает более эффективно в конфигурациях с большим количеством ядер, но с более низкой тактовой частотой, чем в конфигурациях с меньшим количеством ядер и более высокой тактовой частотой. Например, 16 ядер с 2600 MHz предпочтительнее, чем 8 ядер с 3600 MHz.

Рекомендуется использовать технологии Turbo Boost и hyper-threading. Их использование существенно улучшает производительность при типичной нагрузке.

### RAM

Мы рекомендуем использовать как минимум 16 ГБ оперативной памяти, чтобы иметь возможность выполнять нетривиальные запросы. Сервер ClickHouse может работать с гораздо меньшим объёмом RAM, память требуется для обработки запросов.

Необходимый объём RAM зависит от:

- Сложности запросов.
- Объёма данных, обрабатываемых в запросах.

Для расчета объёма RAM необходимо оценить размер промежуточных данных для операций GROUP BY, DISTINCT, JOIN а также других операций, которыми вы пользуетесь.

ClickHouse может использовать внешнюю память для промежуточных данных.

### Дисковое пространство

Для установки ClickHouse необходимо 2ГБ свободного места на диске.

Объём дискового пространства, необходимый для хранения ваших данных, необходимо рассчитывать отдельно. Расчёт должен включать:

- Приблизительную оценку объёма данных. Можно взять образец данных и получить из него средний размер строки. Затем умножьте полученное значение на количество строк, которое вы планируете хранить. `
- Оценку коэффициента сжатия данных. Чтобы оценить коэффициент сжатия данных, загрузите некоторую выборку данных в ClickHouse и сравните действительный размер данных с размером сохранённой таблицы. Например, данные типа clickstream обычно сжимаются в 6-10 раз.

Для оценки объёма хранилища, примените коэффициент сжатия к размеру данных. Если вы планируете хранить данные в нескольких репликах, то необходимо полученный объём умножить на количество реплик.

### Файл подкачки

Отключайте файл подкачки в продуктовых средах.

### Поддержка мобильных устройств

Интерфейс Fastboard спроектирован с учетом поддержки работы на мобильных устройствах. Используемые элементы управления позволяют выбирать и просматривать существующие группы, проекты, страницы дашбордов.

[![telegram-cloud-photo-size-2-5213308742601396368-y.jpg](https://book.winsolutions.ru/uploads/images/gallery/2023-09/scaled-1680-/telegram-cloud-photo-size-2-5213308742601396368-y.jpg) ](https://book.winsolutions.ru/uploads/images/gallery/2023-09/telegram-cloud-photo-size-2-5213308742601396368-y.jpg)[![image.jpeg](https://book.winsolutions.ru/uploads/images/gallery/2023-09/scaled-1680-/image.jpeg) ](https://book.winsolutions.ru/uploads/images/gallery/2023-09/image.jpeg)[![telegram-cloud-photo-size-2-5213308742601396370-y.jpg](https://book.winsolutions.ru/uploads/images/gallery/2023-09/scaled-1680-/telegram-cloud-photo-size-2-5213308742601396370-y.jpg)](https://book.winsolutions.ru/uploads/images/gallery/2023-09/telegram-cloud-photo-size-2-5213308742601396370-y.jpg)

### Сеть

По возможности, используйте сети 10G и более высокого класса.

Пропускная способность сети критически важна для обработки распределенных запросов с большим количеством промежуточных данных. Также, скорость сети влияет на задержки в процессах репликации.

Продукт может быть развернут внутри закрытого контура без доступа к интернету.

### Распределение нагрузки

Cистемное устройство Fastboard состоит из следующих компонентов:

**• 5 сервисов:**

1. HTTP-сервис
2. Планировщик заданий (CRON)
3. Загрузчик данных из внешних источников
4. Блок трансформации файлов
5. Сервис трансформации данных для визуализаций

**• Сервисное хранилище PostgreSQL для настроек проектов и системных параметров • Хранилище и расчеты данных для визуализаций ClickHouse  
• Для обмена сообщений между сервисами и кеширование данных используется REDIS  
• Менеджер процессов PM2 обеспечивает балансировку нагрузки между сервисами в рамках одного сервера**

<p class="callout info">Каждый из этих компонентов может быть запущен на разных серверах для оптимзации нагрузки</p>

<p class="callout info">На одном сервере может быть запущено несколько экземпляров одного или нескольких компонентов</p>

<p class="callout info">В мультисерверных решениях для работы системы можно использовать любые системы кластеризации и балансировщики нагрузки</p>

##### **Данная архитектура обеспечивает следующие преимущества:**

Каждый узел (компонент/сервис) выполняет свою задачу. Например, расчет данных, в том числе многопоточный, выполняет ClickHouse, а преобразование данных в формат для визуализаций выполняет сервис трансформации. Таким образом достигается оптимальное распределение нагрузки между всеми компонентами системы.

Менеджер процесов PM2 обеспечивает балансировку нагрузки выделенных для системы ресурсов. Также система готова к работе с любой существующей системой управления кластерами. Установка максимально допустимых параметров потребления происходит на уровне операционной системы или выбранной пользователем системы кластеризации.

# Установка системы с SSL (https)

#### **1. Для разворачивания контейнеров создаем директории для баз данных и обратного прокси**

```
mkdir resources
mkdir traefik
```

<div id="bkmrk-mkdir-resources---%D0%B4%D0%B8"></div><div id="bkmrk--1"></div><div id="bkmrk--2">  
</div>#### **2. Переходим в директорию баз данных и создаем директорию для postgres**

```
cd resources/
mkdir postgres
```

<div id="bkmrk--4">  
</div>#### **3. Переходим в директорию postgres, копируем в нее файл docker-compose.yml из предоставленного дистрибутива.** 

Создаем сеть для контейнеров базами данных и запускаем контейнер с postgres

```
cd postgres/
docker network create resources
docker-compose up -d
```

<div id="bkmrk-cd-postgres%2F"></div><div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0">После запуска, скачается необходимый образ и запустится контейнер postgres.</div><div id="bkmrk-%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%3A-">**Логин по умолчанию:** postgres</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-postgres">**Пароль:** postgres</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9">*изменить можно в файле **docker-compose.yml** перед запуском контейнера*</div><div id="bkmrk-"></div><div id="bkmrk--6"></div><div id="bkmrk--7">  
</div>#### **4. Создаем базу данных postgres, например с именем fastboard\_back, создать можно разными способами, например подключиться к контейнеру при помощи PgAdmin**

<div id="bkmrk-%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-%D0%B1%D0%B0%D0%B7%D1%83">Восстанавливаем базу postgres, файл с бэкапом чистой базы **fastboard\_back.sql,** который находится в директории 1. Postgres переданного дистрибутива, восстанавливать например через PgAdmin.</div><div id="bkmrk-%D0%92-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BC%D0%BE%D0%BC%D0%B5%D0%BD%D1%82-%D0%B2-%D0%BC%D0%BE">В момент запуска конейнера, пройдут миграции и создастся база данных с логином и паролем по умолчанию.</div><div id="bkmrk--9"></div><div id="bkmrk-%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD%3A-admin">**Логин:** admin</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-yyyy-mm-dd-%28">**Пароль:** YYYY-MM-DD (дата первого запуска контейнеров)</div><div id="bkmrk--3"></div><div id="bkmrk--10"></div><div id="bkmrk--11">  
</div>#### **5. Переходим на директорию выше, т.е. в директорию resources**

```
cd ..
```

<div id="bkmrk--13"></div><div id="bkmrk-%C2%A0-%C2%A0%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8">Создаем директории для Clickhouse переходим в нее</div><div id="bkmrk--14">  
</div>```
mkdir clickhouse
cd  clickhouse/
```


#### **6. Копируем в директорию clickhouse файл docker-compose.yml и директорию с конфигами etc из предоставленного дистрибутива Clickhouse.** 

Меняем параметры выделенной памяти для контейнера в файле **docker-compose.yml** (по умолчанию выставлено от 2 до 8 Гб ОЗУ) и запускаем контейнер с clickhouse

```
docker-compose up -d
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0-1">После запуска, скачается необходимый образ и запустится контейнер с clickhouse. </div><div id="bkmrk-%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD%3A-admin-1">**Логин:** admin</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-passw0rd">**Пароль:** Passw0rd</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9-1">*изменить можно в файле **docker-compose.yml** перед запуском контейнера*</div><div id="bkmrk--17"></div><div id="bkmrk--18">  
</div>#### **7. Переходим на директорию выше, т.е. в директорию resources**

```
cd ..
```

<div id="bkmrk--20"></div>#### **8. Создаем директории для Redis и переходим в нее**

```
mkdir redis
cd  redis/
```

<div id="bkmrk--22">  
</div>#### **9. Создаем директории для баз и логов redis**

```
mkdir -p data/{bases,log}
```

#### **10. Копируем в директорию redis файл docker-compose.yml и директорию с конфигами etc из предоставленного дистрибутива Redis. Запускаем контейнер с Redis**

```
docker-compose up -d
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0-2">После запуска, скачается необходимый образ и запустится контейнер с redis.</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%3A">**Пароль по умолчанию:** Passw0rd,</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9-2">*изменить можно в файле **etc/redis.conf** перед запуском контейнера*</div><div id="bkmrk--5"></div>#### **11. Создаем директории для RabbitMQ и переходим в нее**

<div id="bkmrk-%D0%94%D0%BB%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BA-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD"><div id="bkmrk-%D0%94%D0%BB%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BA-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD-1">Для доступа к веб-интерфейсу Traefik нужно сгенерировать и подставить пароль в файл docker-compose.yml, для этого выполняем следующие шаги:</div><div id="bkmrk--8"></div></div>```
mkdir rabbitmq
cd rabbitmq/
```

<div id="bkmrk-%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D1%83%D0%B5%D0%BC-%D0%B2-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8"><div id="bkmrk--30">Копируем в директорию RabbitMQ файл **docker-compose.yml** из предоставленного дистрибутива RabbitMQ. Запускаем контейнер с RabbitMQ</div><div id="bkmrk--12"></div></div>```
docker-compose up -d
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0-3"><div id="bkmrk-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-passw0rd-%D0%BD%D0%B0">После запуска, скачается необходимый образ и запустится контейнер с RabbitMQ.   
**Логин и пароль** по умолчанию: fb_rabbit,   
*изменить можно в файле **docker-compose.yml** перед запуском контейнера*</div><div id="bkmrk--16"></div><div id="bkmrk-%D0%A2%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C">Теперь нужно создать VHOST для контейнера бэк:</div></div>```bash
docker exec -it rabbitmq_1 bash
    rabbitmqctl add_vhost fb1
    rabbitmqctl list_vhosts
    rabbitmqctl set_permissions -p "fb1" "fb_rabbit" ".*" ".*" ".*"
```

<div id="bkmrk--26"></div>#### **12. Переходим в директорию traefik и копируем в нее файл docker-compose.yml из из предоставленного дистрибутива Traefik**

<div id="bkmrk-%D0%94%D0%BB%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BA-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD-2">Для доступа к веб-интерфейсу Traefik нужно сгенерировать и подставить пароль в файл docker-compose.yml, для этого выполняем следующие шаги:</div><div id="bkmrk--21"></div>```
cd ../../traefik
apt install apache2-utils
```

<div id="bkmrk--29">  
</div><p class="callout info">**ВАЖНО!** Мы должны экранировать каждый символ “$” в нашем зашифрованном пароле (заменить $ на $$), так как мы используем пароль напрямую в docker-compose.yml</p>

<div id="bkmrk--23">  
</div>```
echo $(htpasswd -nb admin Passw0rd) | sed -e s/\\$/\\$\\$/g
```

<div id="bkmrk-%D0%97%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-passw0rd-%D0%BD%D0%B0">Заменить Passw0rd на свой пароль.</div><div id="bkmrk--31">  
</div><div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4">*Пример вывода команды (результат будет разный при каждом запуске команды):*</div><div id="bkmrk--32">  
</div>```
admin:$$2y$$05$$iSGcI0SpukDoOZolGkfghIFe31e47F5vewcjlhzhgf0EHo45H.dFyKW
```

<div id="bkmrk--33"></div><div id="bkmrk-%D0%92%D1%8B%D0%B2%D0%BE%D0%B4-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-">Вывод команды нужно поместить в наш docker-compose.yml внутрь traefik метки, заменив &lt;USER-PASSWORD-OUTPUT&gt; в примере ниже.</div><div id="bkmrk--35">  
</div>```
 "traefik.http.middlewares.auth.basicauth.users=<USER-PASSWORD-OUTPUT>"
```

<div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%22traefik.htt"></div><div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D1%83%D1%81%D1%82">После создания и установки пользователя и пароля, создаем сеть докер для Traefik и запускаем контейнер с Traefik</div><div id="bkmrk--37">  
</div>```
docker network create traefik
docker-compose up -d
```

<div id="bkmrk-docker-network-creat-1">После запуска, скачается необходимый образ и запустится контейнер с Traefik.</div><div id="bkmrk--25"></div><div id="bkmrk--38">  
</div><p class="callout danger">**ВАЖНО! Для разворачивания проекта необходимо заранее иметь две DNS-записи на IP сервера, где разворачивается проект. Записи нужны для получения сертификатов от Let's Encrypt и шифрования трафика Они включаются в сборку программы для развертывания на конкретном сервере.**</p>

*Например:*  
front.example.com  
back.example.com

#### **13. Создаем директорию для FastBoard, переходим в нее, копируем docker-compose.yml и образы docker в рабочую директорию проекта**

<div id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D1%8E-%D0%B4">Создаем директорию для FastBoard, переходим в нее, копируем **docker-compose.yml** и образы docker в рабочую директорию проекта</div><div id="bkmrk--39">  
</div>```
cd ..
mkdir fastboard
cd fastboard
```

<div id="bkmrk--40">  
</div><div id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC-%D0%B8-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB">Проверяем и устанавливаем данные для авторизации в базах данных и параметры подключения к контейнерам с базами в файле **docker-compose.yml**, в данный момент там установлены данные для подключения по умолчанию.</div><div id="bkmrk--41">  
</div><div id="bkmrk-%D0%94%D0%B0%D0%BB%D0%B5%D0%B5-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC-%D0%BE%D0%B1">Далее импортируем образы контейнеров **fastboard:back** и **fastboard:front**, для этого выполняем команды:</div><div id="bkmrk--42">  
</div>```
docker load -i fastboard-back.tar
docker load -i fastboard-front.tar
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7">После загрузки образов, запускаем контейнеры бэк и фронт, а также проверяем логи из запуска</div><div id="bkmrk--43">  
</div>```
docker-compose up -d
docker-compose logs -f
```

<div id="bkmrk-docker-compose-up--d-4"></div><div id="bkmrk-%D0%B8%D0%BB%D0%B8%C2%A0">или </div>```
docker-compose up -d
docker-compose ps
docker logs -f container_name
```

<div id="bkmrk-docker-compose-up--d-5"></div><div id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B-%D0%B7%D0%B0%D0%BF%D1%83">Если контейнеры запустились без проблем, то проверяем работу пройдя по ссылке указанной в **docker-compose.yml** для контейнера фронт: https://example.com</div>#### **14. Активация первого ключа 

После успешного развертывания нужно войти в API системы под техническим пользователем для активации первого лицензионного ключа. Этот пользователь имеет права администратора и остается в системе.

##### **Входим в API**

Переходим по адресу: **ваш\_бэкенд/docs/swagger,** находим блок аутентификации и метод **get\_token.** Жмем кнопку **TRY OUT**, вводим учетные данные:

**Логин**: admin  
**Пароль:** дата первого запуска контейнеров ГГГГ-MM-ДД

Далее нажимаем кнопку **EXECUTE**

[![image.png](https://book.winsolutions.ru/uploads/images/gallery/2024-02/scaled-1680-/ppzimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2024-02/ppzimage.png)

##### **Далее активируем лицензионный ключ** 

В блоке «Лицензия» находим метод Acivate, жмем кнопку **TRY OUT**, выбираем файл лицензии и нажимаем кнопку **EXECUTE**

[![image.png](https://book.winsolutions.ru/uploads/images/gallery/2024-02/scaled-1680-/G3Gimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2024-02/G3Gimage.png)

##### **Система готова к работе**

Теперь можно войти спомощью интерфейса и создать пользователей через панель администратора и выдавать им лицензии

# Установка системы без SSL (http)

#### **1. Для разворачивания контейнеров создаем директории для баз данных и обратного прокси**

```
mkdir resources
```

<div id="bkmrk-mkdir-resources---%D0%B4%D0%B8"></div><div id="bkmrk--1"></div><div id="bkmrk--2">  
</div>#### **2. Переходим в директорию баз данных и создаем директорию для postgres**

```
cd resources/
mkdir postgres
```

<div id="bkmrk--4">  
</div>#### **3. Переходим в директорию postgres, копируем в нее файл docker-compose.yml из предоставленного дистрибутива.** 

Создаем сеть для контейнеров базами данных и запускаем контейнер с postgres

```
cd postgres/
docker network create resources
docker-compose up -d
```

<div id="bkmrk-cd-postgres%2F"></div><div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0">После запуска, скачается необходимый образ и запустится контейнер postgres.</div><div id="bkmrk-%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%3A-">**Логин по умолчанию:** postgres</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-postgres">**Пароль:** postgres</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9">*изменить можно в файле **docker-compose.yml** перед запуском контейнера*</div><div id="bkmrk-"></div><div id="bkmrk--6"></div><div id="bkmrk--7">  
</div>#### **4. Создаем базу данных postgres**

C именем fastboard\_back. Cоздать можно разными способами, например подключиться к контейнеру при помощи PgAdmin или psql-16

```bash
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
    curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
    apt update
    apt install postgresql-client-16
    psql -h 127.0.0.1 -U postgres
                \l
                CREATE DATABASE fastboard_back;
                \l
                \q
```

<div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-yyyy-mm-dd-%28">  
</div><div id="bkmrk--3"></div><div id="bkmrk--10"></div><div id="bkmrk--11">  
</div>#### **5. Переходим на директорию выше, т.е. в директорию resources**

```
cd ..
```

<div id="bkmrk--13"></div><div id="bkmrk-%C2%A0-%C2%A0%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8">Создаем директории для Clickhouse переходим в нее</div><div id="bkmrk--14">  
</div>```
mkdir clickhouse
cd  clickhouse/
```

<div id="bkmrk--15">  
</div>#### **6. Копируем в директорию clickhouse файл docker-compose.yml и директории с конфигами (etc, custom\_config) из предоставленного дистрибутива Clickhouse.** 

Меняем параметры выделенной памяти для контейнера в файле **docker-compose.yml** (по умолчанию выставлено от 2 до 8 Гб ОЗУ) и запускаем контейнер с clickhouse

```
docker-compose up -d
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0-1">После запуска, скачается необходимый образ и запустится контейнер с clickhouse. </div><div id="bkmrk-%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD%3A-admin-1">**Логин:** admin</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%3A-passw0rd">**Пароль:** Passw0rd</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9-1">*изменить можно в файле **etc/users.xml** перед запуском контейнера*</div><div id="bkmrk--17"></div><div id="bkmrk--18">  
</div>#### **7. Переходим на директорию выше, т.е. в директорию resources**

```
cd ..
```

<div id="bkmrk--20"></div>
#### **8. Создаем директории для Redis и переходим в нее**

```
mkdir redis
cd  redis/
```

<div id="bkmrk--22">  
</div>#### **9. Создаем директории для баз и логов redis**

```
mkdir -p data/{bases,log}
```

#### **10. Копируем в директорию redis файл docker-compose.yml и директорию с конфигами etc из предоставленного дистрибутива Redis. Запускаем контейнер с Redis**

```
docker-compose up -d
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%2C-%D1%81%D0%BA%D0%B0%D1%87%D0%B0-2">После запуска, скачается необходимый образ и запустится контейнер с redis.</div><div id="bkmrk-%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%3A">**Пароль по умолчанию:** Passw0rd,</div><div id="bkmrk-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2-%D1%84%D0%B0%D0%B9-2">*изменить можно в файле **etc/redis.conf** перед запуском контейнера*</div><div id="bkmrk--26"></div><div id="bkmrk--27">  
</div>#### **11. Создаем директории для RabbitMQ и переходим в нее**

<div id="bkmrk-%D0%94%D0%BB%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BA-%D0%B2%D0%B5%D0%B1-%D0%B8%D0%BD">Для доступа к веб-интерфейсу Traefik нужно сгенерировать и подставить пароль в файл docker-compose.yml, для этого выполняем следующие шаги:</div><div id="bkmrk--5"></div>```
mkdir rabbitmq
cd rabbitmq/
```

<div id="bkmrk--30">Копируем в директорию RabbitMQ файл **docker-compose.yml** из предоставленного дистрибутива RabbitMQ. Запускаем контейнер с RabbitMQ</div><div id="bkmrk--8"></div>```
docker-compose up -d
```

<div id="bkmrk-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-passw0rd-%D0%BD%D0%B0">После запуска, скачается необходимый образ и запустится контейнер с RabbitMQ.   
**Логин и пароль** по умолчанию: fb_rabbit,   
*изменить можно в файле **docker-compose.yml** перед запуском контейнера*</div><div id="bkmrk--9"></div><div id="bkmrk-%D0%A2%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C">Теперь нужно создать VHOST для контейнера бэк:</div>```bash
docker exec -it rabbitmq_1 bash
    rabbitmqctl add_vhost fb1
    rabbitmqctl list_vhosts
    rabbitmqctl set_permissions -p "fb1" "fb_rabbit" ".*" ".*" ".*"
```

#### **12. Создаем директорию для FastBoard,** 

Переходим в нее, копируем **docker-compose.yml**, **license\_rsa.pub** и образы docker из архива **fastboard.tar.gz** в рабочую директорию проекта

```
cd ..
mkdir fastboard
cd fastboard
```

<div id="bkmrk--40">  
</div><div id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC-%D0%B8-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB">Проверяем и устанавливаем данные для авторизации в базах данных и параметры подключения к контейнерам с базами в файле **docker-compose.yml**, в данный момент там установлены данные для подключения по умолчанию.</div><div id="bkmrk--41">  
</div><div id="bkmrk-%D0%94%D0%B0%D0%BB%D0%B5%D0%B5-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC-%D0%BE%D0%B1">Далее импортируем образы контейнеров **fastboard:back** и **fastboard:front**, для этого выполняем команды:</div><div id="bkmrk--42">  
</div>```
docker load -i fastboard-back.tar
docker load -i fastboard-front.tar
```

<div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7">После загрузки образов, запускаем контейнеры бэк и фронт, а также проверяем логи из запуска</div><div id="bkmrk--43">  
</div>```
docker-compose up -d
docker-compose logs -f
```

<div id="bkmrk-docker-compose-up--d-4"></div><div id="bkmrk-%D0%B8%D0%BB%D0%B8%C2%A0">или </div>```
docker-compose up -d
docker-compose ps
docker logs -f container_name
```

<div id="bkmrk-docker-compose-up--d-5"></div><div id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B-%D0%B7%D0%B0%D0%BF%D1%83">В момент запуска конейнера c бэкенд приложения, пройдут миграции и создастся база данных с логином и паролем по умолчанию. Логин admin пароль YYYY-MM-DD (дата первого запуска контейнеров)</div><div id="bkmrk--16"></div><div id="bkmrk-%D0%95%D1%81%D0%BB%D0%B8-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B-%D0%B7%D0%B0%D0%BF%D1%83-1">Если контейнеры запустились без проблем, то проверяем работу пройдя по ссылке указанной в **docker-compose.yml** для контейнера фронт: https://example.com</div>#### **13. Превый вход в систему и пользователи** 

После успешного развертывания нужно войти в API системы под техническим пользователем для активации первого лицензионного ключа. Этот пользователь имеет права администратора и остается в системе.

##### **Входим в API**

Переходим по адресу: **ваш\_бэкенд/docs/swagger,** находим блок аутентификации и метод **get\_token.** Жмем кнопку **TRY OUT**, вводим учетные данные:

**Логин**: admin  
**Пароль:** дата первого запуска контейнеров ГГГГ-MM-ДД

Далее нажимаем кнопку **EXECUTE**

[![image.png](https://book.winsolutions.ru/uploads/images/gallery/2024-02/scaled-1680-/ppzimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2024-02/ppzimage.png)

##### **Далее активируем лицензионный ключ** 

В блоке «Лицензия» находим метод Acivate, жмем кнопку **TRY OUT**, выбираем файл лицензии и нажимаем кнопку **EXECUTE**

[![image.png](https://book.winsolutions.ru/uploads/images/gallery/2024-02/scaled-1680-/G3Gimage.png)](https://book.winsolutions.ru/uploads/images/gallery/2024-02/G3Gimage.png)

##### **Система готова к работе**

Теперь можно войти спомощью интерфейса и создать пользователей через панель администратора и выдавать им лицензии

# Обновление системы

1\. Скачиваем архив с новой сборкой по ссылке (предоставляется отдельно)

2\. Распаковываем

3\. Заливаем на сервер новые образы докер

4\. На сервере из директории с образами выполняем:  
`docker load -i fastboard-back.tar`  
`docker load -i fastboard-front.tar`

5\. На сервере из деректории фастборда выполняем   
`docker-compose up -d`

# Технологический стек

####   
**React JS**

Фронтенд-библиотека используемая для разработки интерфейса ПО

####  

#### **Node JS**

Основной фреймворк на котором построен бэкенд ПО

####  

#### **Echarts JS**

Основная библиотека для построения визуализаций

####  

#### **D3 JS**

Дополнительная библиотека для построения визуализаций

####  

#### **Click House**

Колоночная база данных, используемая для хранения аналитических данных проектов

####   
**Postgres**

Реляционная база данных, используемая для хранения настроек и служебной информации системы. Файлы настроек проектов, пользователи, потоки, данные источников, действия пользователей, настройки системы и системных событий

####  

#### **SQL**

Основной язык запросов используемый для получения данных из источников и агрегаций в визуализациях проекта

####  

#### **Golang**

Язык программирования используемый для некоторых преобразований данных

####  

#### **Docker**

Платформа используемая для «упаковки» и развертывания ПО

####  

#### **Rabbit MQ**

Брокер сообщений, используется для обмена данными между компонентами ПО

####  

#### **Redis**

NoSQL база данных, используется для кеширования запросов и хранит эти данные в оперативной памяти (in-memory) для мгновенного доступа

# Рекомендации по железу

### **Результаты последнего тестирования** 

*Ноябрь 2024*

<p class="callout info">**Важно понимать**  
Каждый виджет на странице делает запрос к БД. Оценка производилась исходя из кейса, что на странице 20 виджетов и указанное количество пользователей не одномоментно заходят в систему, а 30% в пике.</p>


##### **Тест 1** 

<table border="1" id="bkmrk-%D0%96%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D0%9E%D0%B4%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B4%D0%B0-cli" style="border-collapse: collapse; width: 100%; height: 58.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 28.7969px;"><td style="height: 28.7969px;">Железо</td><td style="height: 28.7969px;">Одна нода CLICK HOUSE

12 CPU/64 RAM

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Объем данных</td><td style="height: 29.7969px;">1 млн строк</td></tr><tr><td>Количество лицензий</td><td>30</td></tr></tbody></table>

##### **Тест 2** 

<table border="1" id="bkmrk-%D0%96%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D0%94%D0%B2%D0%B5-%D0%BD%D0%BE%D0%B4%D1%8B-clic-1" style="border-collapse: collapse; width: 100%; height: 58.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 28.7969px;"><td style="height: 28.7969px;">Железо</td><td style="height: 28.7969px;">Две ноды CLICK HOUSE в кластере

по 16 CPU/32 RAM

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Объем данных</td><td style="height: 29.7969px;">170 млн строк</td></tr><tr><td>Количество лицензий</td><td>40</td></tr></tbody></table>

**Тест 3**

<table border="1" id="bkmrk-%D0%96%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D0%94%D0%B2%D0%B5-%D0%BD%D0%BE%D0%B4%D1%8B-clic" style="border-collapse: collapse; width: 100%; height: 58.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 28.7969px;"><td style="height: 28.7969px;">Железо</td><td style="height: 28.7969px;">Две ноды CLICK HOUSE в кластере

по 32 CPU/64 RAM

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Объем данных</td><td style="height: 29.7969px;">170 млн строк</td></tr><tr><td>Количество лицензий</td><td>120</td></tr></tbody></table>

##### **Тест 4** 

<table border="1" id="bkmrk-%D0%96%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D0%A7%D0%B5%D1%82%D1%8B%D1%80%D0%B5-%D0%BD%D0%BE%D0%B4%D1%8B-c" style="border-collapse: collapse; width: 100%; height: 58.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 28.7969px;"><td style="height: 28.7969px;">Железо</td><td style="height: 28.7969px;">Одна нода CLICK HOUSE

24 CPU/256 RAM

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Объем данных</td><td style="height: 29.7969px;">1 млн строк</td></tr><tr><td>Количество лицензий</td><td>150</td></tr></tbody></table>

##### **Тест 5** 

<table border="1" id="bkmrk-%D0%96%D0%B5%D0%BB%D0%B5%D0%B7%D0%BE-%D0%A7%D0%B5%D1%82%D1%8B%D1%80%D0%B5-%D0%BD%D0%BE%D0%B4%D1%8B-c-1" style="border-collapse: collapse; width: 100%; height: 58.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 28.7969px;"><td style="height: 28.7969px;">Железо</td><td style="height: 28.7969px;">Четыре ноды CLICK HOUSE в кластере

по 32 CPU/256 RAM

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Объем данных</td><td style="height: 29.7969px;">1-10 млн строк</td></tr><tr><td>Количество лицензий</td><td>1000</td></tr></tbody></table>

# Сведения по безопасности

#### <span lang="EN-US">Аутентификация и авторизация</span>

- <span style="mso-ansi-language: RU;">Поддерживается аутентификация по логину/паролю или через корпоративную </span><span lang="EN-US">Active Directory (при наличии у заказчика).</span>
- <span style="mso-ansi-language: RU;">Сессии пользователей управляются с использованием </span><span lang="EN-US">JWT</span><span style="mso-ansi-language: RU;">-токенов с ограниченным сроком действия.</span>
- <span style="mso-ansi-language: RU;">Для каждой роли заданы права доступа к разделам и функциям системы</span><span style="mso-ansi-language: RU;">.</span>
- <span style="mso-ansi-language: RU;">Настраивается </span><span lang="EN-US">Row</span><span style="mso-ansi-language: RU;">-</span><span lang="EN-US">Level</span><span lang="EN-US" style="mso-ansi-language: RU;"> </span><span lang="EN-US">Security</span><span style="mso-ansi-language: RU;"> через представления в </span><span lang="EN-US">ClickHouse</span><span style="mso-ansi-language: RU;"> — индивидуально по проектам.</span>
- <span lang="EN-US">Page</span><span style="mso-ansi-language: RU;">-</span><span lang="EN-US">Level</span><span lang="EN-US" style="mso-ansi-language: RU;"> </span><span lang="EN-US">Security</span><span style="mso-ansi-language: RU;"> позволяет задавать доступ к страницам и объектам внутри проектов — как индивидуально, так и для групп.</span>

#### <span lang="EN-US">Хранение и передача данных</span>

- <span style="mso-ansi-language: RU;">Передача данных между клиентом и сервером защищена через </span><span lang="EN-US">SSL</span><span style="mso-ansi-language: RU;">/</span><span lang="EN-US">TLS</span><span style="mso-ansi-language: RU;">, при условии наличия действующего сертификата на стороне заказчика.</span>
- <span style="mso-ansi-language: RU;">При развёртывании в контуре заказчика используются стандартные меры защиты сети и хостов, определяемые службой ИБ заказчика.</span>
- <span style="mso-ansi-language: RU;">При необходимости и запросе заказчика могут быть представлены дополнительные рекомендации по настройке инфраструктуры.</span>

#### <span lang="EN-US">Логирование и аудит</span>

<span lang="EN-US">Система логирует:</span>

- <span lang="EN-US" style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt 'Times New Roman';"> </span></span></span><span lang="EN-US">успешные и неуспешные аутентификации;</span>
- <span style="mso-ansi-language: RU;">действия пользователей: экспорт, создание и изменение дашбордов;</span>
- <span lang="EN-US">административные изменения (права, настройки).</span>

<span style="mso-ansi-language: RU;">Логи хранятся централизованно с возможностью настройки очистки</span><span style="mso-ansi-language: RU;">.</span>

#### <span lang="EN-US">Управление отчетами и доступом</span>

- <span style="mso-ansi-language: RU;">Доступ к отчетам возможен только в рамках назначенных прав: через интерфейс приложения или прямые ссылки.</span>
- <span style="mso-ansi-language: RU;">При попытке доступа к проекту пользователем без прав — в том числе по прямой ссылке — система возвращает отказ.</span>

#### <span lang="EN-US">Обновления, уязвимости и устойчивость</span>

- <span style="mso-ansi-language: RU;">Все сторонние системы, библиотеки и фреймворки (</span><span lang="EN-US">Go</span><span style="mso-ansi-language: RU;">, </span><span lang="EN-US">React</span><span style="mso-ansi-language: RU;">, </span><span lang="EN-US">ClickHouse</span><span style="mso-ansi-language: RU;">-драйверы) регулярно обновляются.</span>
- <span style="mso-ansi-language: RU;">Перед каждым релизом проводится проверка на наличие критических уязвимостей (</span><span lang="EN-US">CVE</span><span style="mso-ansi-language: RU;">).</span>
- <span style="mso-ansi-language: RU;">Поддерживаются средства автоматического анализа зависимостей и контейнеров (например, </span><span lang="EN-US">Trivy</span><span style="mso-ansi-language: RU;">, </span><span lang="EN-US">Dependabot</span><span style="mso-ansi-language: RU;">).</span>

#### <span lang="EN-US">Интеграции и API</span>

- <span style="mso-ansi-language: RU;">Все </span><span lang="EN-US">API</span><span style="mso-ansi-language: RU;">-интерфейсы по умолчанию недоступны без авторизации. Доступ осуществляется через </span><span lang="EN-US">JWT</span><span style="mso-ansi-language: RU;"> или </span><span lang="EN-US">OAuth</span><span style="mso-ansi-language: RU;">2.</span>
- <span style="mso-ansi-language: RU;">Поддерживаются механизмы ограничения по </span><span lang="EN-US">IP</span><span style="mso-ansi-language: RU;">, времени жизни токенов (</span><span lang="EN-US">TTL</span><span style="mso-ansi-language: RU;">) и настройка </span><span lang="EN-US">CORS</span><span style="mso-ansi-language: RU;">.</span>

#### <span lang="EN-US">Обучение и ответственность</span>

- <span lang="EN-US">Предоставляется базовая пользовательская документация.</span>
- <span style="mso-ansi-language: RU;">Для клиентов, развёртывающих систему в своём контуре, доступны инструкции по установке и рекомендациям по безопасности.</span>
- <span style="mso-ansi-language: RU;">Ведётся разработка обучающих материалов и процессов онбординга для пользователей.</span>