Для обновления всех компонентов Форпост центрального сервера необходимо на сервере выполнить следующие команды (заменив ССЫЛКА_НА_ДИСТРИБУТИВ
):
wget http://fpst.ru/files/utils/preupdateforpost
chmod 755 preupdateforpost
source ./preupdateforpost ССЫЛКА_НА_ДИСТРИБУТИВ
tools/sql-diff --new sql/cctv-db.sql --db cctv | mysql cctv
tools/dbdata --new sql/dbdata.txt --db cctv | mysql cctv
mv /usr/local/sbin/cctv-streamer /usr/local/sbin/cctv-streamer.`date '+%Y%m%d-%H%M'`
cp ./sbin/cctv-streamer /usr/local/sbin/cctv-streamer
mv /usr/local/sbin/cctv-master /usr/local/sbin/cctv-master.`date '+%Y%m%d-%H%M'`
cp ./sbin/cctv-master /usr/local/sbin/cctv-master
service cctv-master restart
service cctv-streamer restart
cp -r /var/www/cctv-portal /var/www/cctv-portal.`date '+%Y%m%d-%H%M'`
cp -rf ./cctv-portal /var/www/
rm -rf /var/www/cctv-portal/assets/* && rm -rf /var/www/cctv-portal/assets/.empty-folder
cd /var/www/cctv-portal
chmod 775 images images/partner images/partner/camera images/screenshot assets protected/runtime
chmod 640 protected/config/local.php
Дополнительно в зависимости от операционной системы необходимо выполнить команды:
chgrp -R www-data images assets protected/runtime protected/config/local.php
chgrp -R apache images assets protected/runtime protected/config/local.php
Для обновления выделенного стримера необходимо на сервере выполнить следующие команды (заменив ССЫЛКА_НА_ДИСТРИБУТИВ
):
wget http://fpst.ru/files/utils/preupdateforpost
chmod 755 preupdateforpost
source ./preupdateforpost ССЫЛКА_НА_ДИСТРИБУТИВ
mv /usr/local/sbin/cctv-streamer /usr/local/sbin/cctv-streamer.`date '+%Y%m%d-%H%M'`
cp ./sbin/cctv-streamer /usr/local/sbin/cctv-streamer
service cctv-streamer restart
Чтобы создать резервную копию Форпост на другом (резервном) сервере, необходимо выполнить следующие действия:
adduser --disabled-password --gecos "" forpost-backup
mkdir -p /var/lib/cctv/forpost-backup
chown forpost-backup:forpost-backup /var/lib/cctv/forpost-backup
ssh-keygen
создать пару из публичного и приватного ключа, и содержимое файла публичного ключа id_rsa.pub
скопировать на резервный сервер в файл /home/forpost-backup/.ssh/authorized_keys
mkdir /var/lib/cctv
mkdir /var/lib/cctv/tools
wget -O /var/lib/cctv/tools/forpost-backup.sh https://fpst.ru/files/utils/forpost-backup.sh
chmod 755 /var/lib/cctv/tools/forpost-backup.sh
mkdir -p /var/log/cctv_backup
/etc/crontab
команду для ежедневного создания резервной копии, заменив IP_АДРЕС_РЕЗЕРВНОГО_СЕРВЕРА
и ПУТЬ_К_ФАЙЛУ_ПРИВАТНОГО_КЛЮЧА
:3 3 * * * root /var/lib/cctv/tools/forpost-backup.sh forpost-backup IP_АДРЕС_РЕЗЕРВНОГО_СЕРВЕРА ПУТЬ_К_ФАЙЛУ_ПРИВАТНОГО_КЛЮЧА
При необходимости создавать резервную копию БД на том же сервере, на котором находится СУБД, следует выполнить команды:
mkdir -p /var/lib/cctv/backups
mkdir -p /var/lib/cctv/tools
wget -O /var/lib/cctv/tools/cctv-db-backup https://fpst.ru/files/utils/cctv-db-backup
chmod 755 /var/lib/cctv/tools/cctv-db-backup
Добавить в файл /etc/crontab
команду:
0 5 * * * root /var/lib/cctv/tools/cctv-db-backup
Выполнить на сервере, на котором находится СУБД MySQL, команды:
wget https://fpst.ru/files/cctv-db-clear-202409.tgz
tar xf cctv-db-clear-202409.tgz
cd ./cctv-db-clear-202409
mkdir -p /var/lib/cctv/tools
cp ./cctv-db-clear /var/lib/cctv/tools/
cp ./dbclear.conf /data/cctv/etc/
mkdir -p /data/cctv/sql-backup
mkdir -p /data/cctv/log
Если настройка очистки БД происходит не в процессе установки Форпост, а позже, когда данные в БД уже успели накопиться, рекомендуем первый запуск очистки выполнить вручную:
/var/lib/cctv/tools/cctv-db-clear /data/cctv/etc/dbclear.conf &
Первый запуск может выполняться достаточно продолжительное время. За ходом очистки можно следить по журналу в файле /data/cctv/log/dbclear.log
. О завершении очистки скажет строка finished в журнале.
Для регулярного выполнения очистки БД необходимо в файл /etc/crontab добавить запись:
15 2 * * * root /var/lib/cctv/tools/cctv-db-clear /data/cctv/etc/dbclear.conf
По умолчанию скрипт очистки БД создает в папке /data/cctv/sql-backup
резервные копии удаляемых данных. Чтобы отключить создание резервных копий (например из-за дефицита дискового пространства), необходимо в конфиге /data/cctv/etc/dbclear.conf
закомментировать параметры backup
и compress
:
{ log: /data/cctv/log/dbclear.log,
# backup: /data/cctv/sql-backup/db-,
days: 45,
# compress: gzip,
}
По умолчанию удаление происходит порциями по 1000 записей. Между удалениями делается пауза продолжительностью (время_удаления_последней_порции x 10). Чтобы ускорить удаление, в конфиг /data/cctv/etc/dbclear.conf
необходимо добавить параметры:
event_wait_multiplier: 2,
traffic_wait_multiplier: 2,
translation_wait_multiplier: 2,
record_wait_multiplier: 2,
При таких значениях между удалениями будет делаться пауза продолжительностью (время_удаления_последней_порции x 2).
На сервере, на котором находится веб-портал Форпост, необходимо выполнить команды:
wget https://fpst.ru/files/h265tomp4/h265ToMp4Converter.sh
sudo bash h265ToMp4Converter.sh
Указанные команды предназначены для следующих ОС: Ubuntu, Debian, CentOS.
Если на сервере установлена ОС CentOS с включенным SELinux, то дополнительно к выполнению команд, указанных выше, необходимо сделать попытку скачивания архива через интерфейс пользователя, после чего на сервере выполнить команды:
grep h265tomp4 /var/log/audit/audit.log | audit2allow -M h265tomp4
semodule -i h265tomp4.pp
По умолчанию для подготовки mp4-файлов на сервере используется папка /var/www/cctv-portal/protected/runtime
. Чтобы изменить папку, необходимо на сервере в конфиг /var/www/cctv-portal/protected/config/local.php
в секцию params
добавить строку, заменив PATH_TO_MP4_FOLDER
(владельцем папки должен быть пользователь www-data
):
'MediaRuntimeFolder' => 'PATH_TO_MP4_FOLDER',
В случае неработоспособности скачивания в формате MP4 необходимо на сервере, на котором находится веб-портал Форпост, в файл /etc/ssl/openssl.cnf
внести следующие изменения:
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = 'DEFAULT:!DH'
Чтобы Форпост мог отправлять электронные письма, необходимо задать параметры подключения к SMTP-серверу через административную панель в разделе Настройки сайта на вкладке SMTP.
Если SMTP-сервер использует не TLS-шифрование, то на сервере в конфиг /var/www/cctv-portal/protected/config/local.php в секцию components необходимо добавить:
'mail' => array(
'transportOptions' => array(
'encryption'=>'ENCRYPTION',
),
),
ENCRYPTION может принимать значение: ssl, tls, пустое значение (без шифрования).
Чтобы использовать для SMTP-авторизации другой логин, чем email, указанный в поле ”E-mail для сообщений пользователя”, необходимо на сервере добавить в файл /var/www/cctv-portal/protected/config/local.php
в секцию params строку, указав нужный логин:
'SMTPUsername' => 'login',
Некоторые типы служебных оповещений, которые отправляются на электронную почту, могут быть отключены, если на сервере, где установлен веб-портал Форпост, в файл /var/www/cctv-portal/protected/config/local.php
в секцию params добавить следующие строки:
'DisableCameraMotionDetectorError' => true, // От камер нет уведомлений о движении
'DisableTooHighBitrateNotifications' => true, // Камера превысила допустимую скорость
'NoEmailOnCameraEdit' => true, // Камера отредактирована
Чтобы настроить отправку оповещений о недоступности любой на определенные адреса электронной почты, необходимо на сервере, на котором установлен веб-портал Форпост выполнить:
/var/www/cctv-portal/protected/config/local.php
в секцию params
добавить строку, указав необходимые адреса электронной почты и заменив на число ПРОДОЛЖИТЕЛЬНОСТЬ_НЕДОСТУПНОСТИ_КАМЕРЫ_В_МИНУТАХ_НЕОБХОДИМАЯ_ДЛЯ_ОПОВЕЩЕНИЯ
:'UnavailableCamerasNoticeEmail' => 'EMAIL1;EMAIL2;EMAIL3',
'UnavailableCamerasNoticeTimeoutInMinutes' => ПРОДОЛЖИТЕЛЬНОСТЬ_НЕДОСТУПНОСТИ_КАМЕРЫ_В_МИНУТАХ_НЕОБХОДИМАЯ_ДЛЯ_ОПОВЕЩЕНИЯ,
/etc/crontab
добавить строку:*/5 * * * * www-data /usr/bin/php /var/www/cctv-portal/protected/cron.php unavailablecamerasnotice CameraID
Для отображения камер на карте необходимо установить OSM (OpenStreetMaps):
apt install docker.io
docker volume create osm-data
РЕГИОН-latest.osm.pbf
для нужного регионаИМЯ_ФАЙЛА.osm.pbf
, и выполнить импорт карты из скачанного файла:wget -O /var/www/cctv-portal/protected/config/region.osm.pbf http://download.geofabrik.de/russia/ИМЯ_ФАЙЛА.osm.pbf
docker run -v /var/www/cctv-portal/protected/config/region.osm.pbf:/data/region.osm.pbf -v osm-data:/data/database/ overv/openstreetmap-tile-server import
Если на карте требуется отобразить несколько регионов, то необходимо скачать файлы этих регионов, после чего выполнить команду osmium merge
. Например:
osmium merge central-fed-district-latest.osm.pbf volga-fed-district-latest.osm.pbf northwestern-fed-district-latest.osm.pbf -o region.osm.pbf
После чего выполнить команду docker run (
заменив ПУТЬ_К_ПАПКЕ)
:
docker run -v ПУТЬ_К_ПАПКЕ/region.osm.pbf:/data/region.osm.pbf -v osm-data:/data/database/ overv/openstreetmap-tile-server import
В зависимости от того, использует веб-портал протокол HTTPS или HTTP, выполнить на сервере действия, указанные ниже.
Запустить docker-контейнер, который будет принимать подключения на 127.0.0.1 (по умолчанию порт 20081):
docker run --name osm --restart always -d -p 127.0.0.1:20081:80 -v osm-data:/data/database/ -d overv/openstreetmap-tile-server run
Настроить веб-сервер Apache:
a2enmod proxy
a2enmod proxy_http
Listen 20080
VirtualHost
, который использует SSL-сертификат, полученный от Let's Encrypt
для домена WEB_DOMAIN
:<VirtualHost *:20080>
ServerName WEB_DOMAIN
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/WEB_DOMAIN/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/WEB_DOMAIN/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:20081/
ProxyPassReverse / http://127.0.0.1:20081/
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
/var/www/cctv-portal/protected/config/local.php
в секцию components
добавить параметры, заменив WEB_DOMAIN
:'geomaps'=>[
'vendor' => 'osm',
'tileHost' => 'https://WEB_DOMAIN:20080/tile/{z}/{x}/{y}.png',
],
service apache2 restart
docker run --name osm --restart always -d -p 20080:80 -v osm-data:/data/database/ -d overv/openstreetmap-tile-server run
http://HOST:20080/tile/0/0/0.png
, заменив HOST/var/www/cctv-portal/protected/config/local.php
в секцию components
добавить параметры, заменив WEB_DOMAIN
:'geomaps'=>[
'vendor' => 'osm',
'tileHost' => 'http://WEB_DOMAIN:20080/tile/{z}/{x}/{y}.png',
],
Для разрешения доступа к административной панели только с определенных IP-адресов нужно в настройках веб-сервера Apache в настройке VirtualHost добавить директивы Location. В данном примере будет разрешен доступ только с адреса 192.168.0.100:
<Location /admin/*>
order deny,allow
deny from all
allow from 192.168.0.100
</Location>
<Location /admin.html>
order deny,allow
deny from all
allow from 192.168.0.100
</Location>
<Location /system-api/*>
order deny,allow
deny from all
allow from 192.168.0.100
</Location>
Для ограничения доступа к веб-порталу только с IP-адресов определённой страны нужно:
sudo apt-get install libapache2-mod-geoip
sudo a2enmod geoip
/etc/apache2/mods-available/geoip.conf
<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>
<Location "/">
SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry
Deny from all
Allow from env=AllowCountry
</Location>
В этом примере, запросы от пользователей из России будет разрешены, а все остальные запросы будут блокироваться.
Варианты ограничения доступа к потокам камер по статическим RTSP-ссылкам:
1. Ограничить сетевой интерфейс стримера (например, только тем сетевым интерфейсом сервера, который доступен из внутренней сети), через который стример будет транслировать потоки статических RTSP-ссылок. Для ограничения сетевого интерфейса стримера, который будет использоваться для трансляции потоков статических RTSP-ссылок, необходимо в конфиг стримера streamer.conf добавить параметр public_translation_server_address
, заменив STREAMER_IP
на нужное значение:
public_translation_server_address: "STREAMER_IP",
2. Ограничить список IP-адресов, которые могут подключаться по статической RTSP-ссылке камеры. Для этого необходимо через административную панель Форпост:
3. Ограничить доступ по логину и паролю пользователя Форпост, который согласно правам доступа имеет доступ к камере. Для этого RTSP-клиент должен подключаться к стримеру Форпост по ссылке в формате:rtsp://FORPOST_USER_LOGIN:FORPOST_USER_PASSORD@STREAMER_HOST:STREAMER_PORT/camera/CAMERA_ID/online
Квота камеры - это объем дискового пространства, который потребуется для хранения архива камеры. Квота рассчитывается для каждой камеры как произведение битрейта камеры и длительности архива, выбранной в настройках камеры в Форпост.
При добавлении/редактировании камеры квота камеры сравнивается с доступным дисковым пространством. Доступное дисковое пространство рассчитывается как разница между общим дисковым пространством и суммой квот уже существующих камер.
Чтобы открыть список камер с информацией об их квотах, необходимо в административной панели на странице "Обзор" нажать ссылку "Статистика по всем камерам".
По умолчанию используется статический расчет квот. При таком способе в расчете квоты используется битрейт, указанный в настройках камер со стороны Форпост:
Динамический расчет квот позволяет рассчитывать квоты таким образом, чтобы при определении дискового пространства, которое требуется для записи камер, использовался фактический битрейт, с которым каждая камера выполняла запись за предыдущие 24 часа.
Чтобы изменить способ расчета квот со статического на динамический, необходимо на сервере, где установлен веб-портал Форпост, в файл /etc/crontab добавить строку:
Для ОС Ubuntu/Debian:
15 2 * * * www-data /usr/bin/php /var/www/cctv-portal/protected/cron.php QuotaRatio
Для ОС CentOS:
15 2 * * * apache php /var/www/cctv-portal/protected/cron.php QuotaRatio
После строки необходимо обязательно добавить пустую строку (перевод строки).
Изменения вступят в силу после 02:15 следующего дня.
Отключить проверку дискового пространства при добавлении/редактировании камер можно следующим образом:
Streamer
в поле ReservedSpace
указать отрицательное значение -43980465111040. Указанное значение – это 40 ТБ, на которые система при валидации будет увеличивать доступное пространство, и проверка будет гарантированно успешной:mysql cctv
update Streamer set ReservedSpace = -43980465111040;
service cctv-master restart
Для настройки отправки push уведомлений в Telegram необходимо:
/newbot
и сохранить значение значение HTTP API токен
, которое вернет @BotFather/var/www/cctv-portal/protected/config/local.php
в секцию params
добавить параметр TelegramBotToken
, заменив заменив BOT_TOKEN
на значение HTTP API токен
:'TelegramBotToken' => 'BOT_TOKEN',
/etc/crontab
новую строку:Для ОС Ubuntu/Debian:
*/5 * * * * www-data /usr/bin/php /var/www/cctv-portal/protected/cron.php gettelegrambotupdates
Для ОС CentOS:
*/5 * * * * apache php /var/www/cctv-portal/protected/cron.php gettelegrambotupdates
Настройки
Личные данные
указать значение в поле Username в Telegram
, которое скопировать из настроек своего профиля в Telegram (без символа @)Оповещения
для камеры, для которой требуется включить оповещения, кликнуть ссылку Настройки
и активировать опцию Через Telegram
Username
был ранее указан в Личных данных
, открыть чат с ботом и нажать кнопку Start
В случае, если push уведомления необходимо отправлять в группу в Telegram, необходимо дополнительно выполнить следующие действия:
BOT_NAME
(можно скопировать из профиля бота - значение после символа @):/getchatid @BOT_NAME
CHAT_ID
, выполнив в командной строке Linux следующую команду, заменив {BOT_TOKEN}
на значение параметра TelegramBotToken
из конфига /var/www/cctv-portal/protected/config/local.php
:curl -X POST -s https://api.telegram.org/bot{BOT_TOKEN}/getUpdates | grep -Poza '"chat":{"id":-.+?,'
CHAT_ID
(вместе со знаком -):"chat":{"id":CHAT_ID,
LOGIN
и CHAT_ID
:update User set TelegramBotChatID = 'CHAT_ID' where Login = 'LOGIN';
Отправка push уведомлений доступна только для брендированных версий мобильных приложений.
Для настройки отправки push уведомлений в брендированное Android-приложение необходимо через веб-консоль Firebase:
Service accounts
создать новый приватный ключ (Generate new private key
) и скачать егоНа сервере, на котором установлен веб-портал Форпост, выполнить следующие действия:
/var/www/cctv-portal/protected/config/android_push.json
chmod 644 /var/www/cctv-portal/protected/config/android_push.json
В URL embed.html можно добавить следующие параметры:
Чтобы для пользователей, включая администраторов, появилась возможность при входе в приложения Форпост проверять пароль с помощью внешнего сервера, доступного по протоколу LDAP, на сервере, на котором установлен веб-портал Форпост, необходимо выполнить следующие действия:
/var/www/cctv-portal/protected/config/local.php
в секцию params
добавить строку:'EnableUserAuthProviders' => true,
INSERT INTO `AuthProvider` (`TypeID`, `Params`, `Name`, `IsDefault`) VALUES (6, NULL, 'LDAP', 0);
apt-get install php-ldap
service apache2 restart
Настройки сайта
на вкладке LDAP
указать параметры подключения к LDAP-серверу. В зависимости от того, указан или нет параметр Атрибут поиска пользователя
, будет по-разному через LDAP-сервер выполняться проверка пользователя, который выполняет вход:Атрибут поиска пользователя
указан:Атрибут поиска пользователя=Логин пользователя,Базовое имя для каталога
Атрибут поиска пользователя=Логин пользователя
Атрибут поиска пользователя
не указан:Логин пользователя@Доменное имя сервера
(&(sAMAccountName=Логин пользователя))
Способ проверки пароля
и выбрать вариант LDAP
Подготовить к репликации первый сервер MySQL:
/etc/mysql/my.cnf
первого сервера добавить, заменив SERVER_IP
:[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
expire_logs_days = 7
bind-address = SERVER_IP
PASSWORD
:create user 'replication1'@'%' identified by 'PASSWORD';
grant replication slave on *.* to 'replication1'@'%';
flush privileges;
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
service mysql restart
Подготовить к репликации второй сервер MySQL:
/etc/mysql/my.cnf
второго сервера добавить, заменив SERVER_IP
:[mysqld]
server_id = 2
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
expire_logs_days = 7
bind-address = SERVER_IP
PASSWORD
:create user 'replication2'@'%' identified by 'PASSWORD';
grant replication slave on *.* to 'replication2'@'%';
flush privileges;
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
service mysql restart
Запустить репликацию с первого на второй сервер MySQL:
mysql -e "show master status;"
SERVER_1_IP
, PASSWORD
, SERVER_1_STATUS_LOG_FILE_NAME
, SERVER_1_STATUS_LOG_POSITION
:STOP SLAVE;
CHANGE MASTER TO MASTER_HOST = 'SERVER_1_IP', MASTER_USER = 'replication1', MASTER_PASSWORD = 'PASSWORD', MASTER_LOG_FILE = 'SERVER_1_STATUS_LOG_FILE_NAME', MASTER_LOG_POS = SERVER_1_STATUS_LOG_POSITION;
START SLAVE;
SHOW SLAVE STATUS \G;
Запустить репликацию с второго на первый сервер MySQL:
mysql -e "show master status;"
SERVER_2_IP
, PASSWORD
, SERVER_2_STATUS_LOG_FILE_NAME
, SERVER_2_STATUS_LOG_POSITION
:STOP SLAVE;
CHANGE MASTER TO MASTER_HOST = 'SERVER_2_IP', MASTER_USER = 'replication2', MASTER_PASSWORD = 'PASSWORD', MASTER_LOG_FILE = 'SERVER_2_STATUS_LOG_FILE_NAME', MASTER_LOG_POS = SERVER_2_STATUS_LOG_POSITION;
START SLAVE;
SHOW SLAVE STATUS \G;