#!/bin/bash # Скрипт установки F7cloud Talk Recording Server # Этот скрипт устанавливает все необходимые зависимости и настраивает сервер # # Использование: # sudo ./install.sh [OPTIONS] # # Опции: # --hpb-url URL URL сервера HPB (signaling server) # --hpb-secret SECRET Секрет для подключения к HPB (internalsecret) # --f7cloud-url URL URL сервера F7cloud (опционально) # --f7cloud-secret SECRET Секрет для подключения к F7cloud (опционально) # --listen ADDRESS:PORT Адрес и порт для прослушивания (по умолчанию: 127.0.0.1:8000) # # Пример: # sudo ./install.sh --hpb-url https://hpb.example.com --hpb-secret your-secret-here set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Функция для вывода сообщений info() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" } # Функция для вывода справки show_help() { echo "Использование: $0 [OPTIONS]" echo "" echo "Опции:" echo " --hpb-url URL URL сервера HPB (signaling server) - ОБЯЗАТЕЛЬНО" echo " --hpb-secret SECRET Секрет для подключения к HPB (internalsecret) - ОБЯЗАТЕЛЬНО" echo " --f7cloud-url URL URL сервера F7cloud (опционально)" echo " --f7cloud-secret SECRET Секрет для подключения к F7cloud (опционально)" echo " --listen ADDRESS:PORT Адрес и порт для прослушивания (по умолчанию: 127.0.0.1:8000)" echo " --help Показать эту справку" echo "" echo "Пример:" echo " sudo $0 --hpb-url https://hpb.example.com --hpb-secret your-secret-here" } # Парсинг аргументов HPB_URL="" HPB_SECRET="" F7CLOUD_URL="" F7CLOUD_SECRET="" LISTEN_ADDRESS="127.0.0.1:8000" while [[ $# -gt 0 ]]; do case $1 in --hpb-url) HPB_URL="$2" shift 2 ;; --hpb-secret) HPB_SECRET="$2" shift 2 ;; --f7cloud-url) F7CLOUD_URL="$2" shift 2 ;; --f7cloud-secret) F7CLOUD_SECRET="$2" shift 2 ;; --listen) LISTEN_ADDRESS="$2" shift 2 ;; --help) show_help exit 0 ;; *) error "Неизвестный параметр: $1" show_help exit 1 ;; esac done # Проверка обязательных параметров if [ -z "$HPB_URL" ] || [ -z "$HPB_SECRET" ]; then error "Ошибка: --hpb-url и --hpb-secret являются обязательными параметрами" echo "" show_help exit 1 fi # Проверка прав root if [ "$EUID" -ne 0 ]; then error "Пожалуйста, запустите скрипт с правами root (sudo)" exit 1 fi info "Начинаем установку F7cloud Talk Recording Server..." # Определение дистрибутива if [ -f /etc/debian_version ]; then DISTRO="debian" PKG_MANAGER="apt-get" elif [ -f /etc/redhat-release ]; then DISTRO="redhat" PKG_MANAGER="yum" else error "Неподдерживаемый дистрибутив Linux" exit 1 fi # Получение директории скрипта SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd "$SCRIPT_DIR" # 1. Установка системных зависимостей info "Установка системных зависимостей..." if [ "$DISTRO" = "debian" ]; then $PKG_MANAGER update -y $PKG_MANAGER install -y \ python3 \ python3-pip \ python3-venv \ pulseaudio \ xvfb \ ffmpeg \ libpulse0 \ libpulse-dev \ libx11-dev \ libxext-dev \ libxrender-dev \ libxtst6 \ libxi6 \ libgconf-2-4 \ libasound2-dev \ curl \ wget else error "Установка для RedHat-based дистрибутивов пока не поддерживается автоматически" exit 1 fi # 2. Установка Firefox ESR info "Установка Firefox ESR..." if [ -d "dependencies/firefox-esr" ]; then info "Копирование Firefox ESR из dependencies..." cp -r dependencies/firefox-esr /opt/firefox-esr if [ -f /opt/firefox-esr/firefox ]; then ln -sf /opt/firefox-esr/firefox /usr/local/bin/firefox-esr chmod +x /usr/local/bin/firefox-esr info "Firefox ESR установлен в /opt/firefox-esr" else error "Firefox ESR не найден в dependencies/firefox-esr" exit 1 fi else warn "Firefox ESR не найден в dependencies/, пропускаем..." fi # 3. Установка Geckodriver info "Установка Geckodriver..." if [ -f "dependencies/geckodriver" ]; then cp dependencies/geckodriver /usr/local/bin/geckodriver chmod +x /usr/local/bin/geckodriver info "Geckodriver установлен в /usr/local/bin/geckodriver" elif [ -f "dependencies/geckodriver.tar.gz" ]; then info "Распаковка geckodriver из архива..." cd dependencies tar -xzf geckodriver.tar.gz chmod +x geckodriver cp geckodriver /usr/local/bin/geckodriver cd .. info "Geckodriver установлен в /usr/local/bin/geckodriver" else warn "Geckodriver не найден в dependencies/, пропускаем..." fi # 4. Создание виртуального окружения Python info "Создание виртуального окружения Python..." if [ ! -d "venv" ]; then python3 -m venv venv info "Виртуальное окружение создано" else warn "Виртуальное окружение уже существует, пропускаем создание..." fi # Активация виртуального окружения и установка зависимостей info "Установка Python-зависимостей..." source venv/bin/activate pip install --upgrade pip pip install -e . info "Python-зависимости установлены" # 5. Создание пользователя для запуска сервера info "Создание пользователя f7cloud-talk-recording..." if ! id "f7cloud-talk-recording" &>/dev/null; then useradd -r -s /bin/false -d /var/lib/f7cloud-talk-recording f7cloud-talk-recording info "Пользователь f7cloud-talk-recording создан" else warn "Пользователь f7cloud-talk-recording уже существует" fi # Создание директорий для пользователя mkdir -p /var/lib/f7cloud-talk-recording chown f7cloud-talk-recording:f7cloud-talk-recording /var/lib/f7cloud-talk-recording # 6. Настройка конфигурации info "Настройка конфигурации..." mkdir -p /etc/f7cloud-talk-recording CONFIG_FILE="/etc/f7cloud-talk-recording/server.conf" if [ ! -f "$CONFIG_FILE" ]; then cp server.conf.in "$CONFIG_FILE" info "Конфигурационный файл создан в $CONFIG_FILE" # Настройка параметров конфигурации info "Настройка параметров конфигурации..." # Установка адреса прослушивания sed -i "s|#listen = 127.0.0.1:8000|listen = $LISTEN_ADDRESS|" "$CONFIG_FILE" # Настройка HPB (signaling server) if [ -n "$HPB_URL" ] && [ -n "$HPB_SECRET" ]; then info "Настройка HPB (signaling server)..." # Создаем ID для signaling сервера из URL HPB_ID=$(echo "$HPB_URL" | sed 's|https\?://||' | sed 's|/.*||' | sed 's|[^a-zA-Z0-9]|-|g' | sed 's|--*|-|g' | sed 's|^-\||' | sed 's|-$||') if [ -z "$HPB_ID" ]; then HPB_ID="hpb-signaling" fi # Раскомментируем и настраиваем секцию signaling sed -i "s|#signalings = signaling-id, another-signaling|signalings = $HPB_ID|" "$CONFIG_FILE" sed -i "s|#internalsecret = the-shared-secret-for-internal-clients|internalsecret = $HPB_SECRET|" "$CONFIG_FILE" # Добавляем секцию для конкретного signaling сервера if ! grep -q "^\[$HPB_ID\]" "$CONFIG_FILE"; then # Добавляем новую секцию после секции [signaling] cat >> "$CONFIG_FILE" << EOF [$HPB_ID] # URL of the signaling server url = $HPB_URL # Shared secret for authenticating as an internal client of signaling servers. # This must be the same value as configured in the signaling server # configuration file. internalsecret = $HPB_SECRET EOF else # Если секция уже существует, обновляем значения sed -i "/^\[$HPB_ID\]/,/^\[/ { s|^#url = .*|url = $HPB_URL| s|^url = .*|url = $HPB_URL| s|^#internalsecret = .*|internalsecret = $HPB_SECRET| s|^internalsecret = .*|internalsecret = $HPB_SECRET| }" "$CONFIG_FILE" fi info "HPB настроен: URL=$HPB_URL, ID=$HPB_ID" fi # Настройка F7cloud backend (опционально) if [ -n "$F7CLOUD_URL" ] && [ -n "$F7CLOUD_SECRET" ]; then info "Настройка F7cloud backend..." # Создаем ID для backend из URL BACKEND_ID=$(echo "$F7CLOUD_URL" | sed 's|https\?://||' | sed 's|/.*||' | sed 's|[^a-zA-Z0-9]|-|g' | sed 's|--*|-|g' | sed 's|^-\||' | sed 's|-$||') if [ -z "$BACKEND_ID" ]; then BACKEND_ID="f7cloud-backend" fi # Раскомментируем и настраиваем секцию backend sed -i "s|#backends = backend-id, another-backend|backends = $BACKEND_ID|" "$CONFIG_FILE" # Добавляем секцию для конкретного backend if ! grep -q "^\[$BACKEND_ID\]" "$CONFIG_FILE"; then # Добавляем новую секцию после секции [backend] cat >> "$CONFIG_FILE" << EOF [$BACKEND_ID] # URL of the F7cloud instance url = $F7CLOUD_URL # Shared secret for requests from and to the backend servers. This must be the # same value as configured in the F7cloud admin ui. secret = $F7CLOUD_SECRET EOF else # Если секция уже существует, обновляем значения sed -i "/^\[$BACKEND_ID\]/,/^\[/ { s|^#url = .*|url = $F7CLOUD_URL| s|^url = .*|url = $F7CLOUD_URL| s|^#secret = .*|secret = $F7CLOUD_SECRET| s|^secret = .*|secret = $F7CLOUD_SECRET| }" "$CONFIG_FILE" fi info "F7cloud backend настроен: URL=$F7CLOUD_URL, ID=$BACKEND_ID" fi # Настройка путей к браузеру и драйверу sed -i "s|#driverPath =|driverPath = /usr/local/bin/geckodriver|" "$CONFIG_FILE" sed -i "s|#browserPath =|browserPath = /usr/local/bin/firefox-esr|" "$CONFIG_FILE" chown f7cloud-talk-recording:f7cloud-talk-recording "$CONFIG_FILE" chmod 600 "$CONFIG_FILE" info "Конфигурация настроена автоматически" else warn "Конфигурационный файл уже существует, пропускаем создание..." warn "Если нужно обновить конфигурацию, отредактируйте $CONFIG_FILE вручную" fi # 7. Создание systemd service файла info "Создание systemd service..." cat > /etc/systemd/system/f7cloud-talk-recording.service << EOF [Unit] Description=F7cloud Talk Recording Server After=network.target [Service] Type=simple User=f7cloud-talk-recording Group=f7cloud-talk-recording WorkingDirectory=$SCRIPT_DIR Environment="PATH=$SCRIPT_DIR/venv/bin:/usr/local/bin:/usr/bin:/bin" ExecStart=$SCRIPT_DIR/venv/bin/f7cloud-talk-recording --config /etc/f7cloud-talk-recording/server.conf Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload info "Systemd service создан" # Итоговая информация info "" info "==========================================" info "Установка завершена успешно!" info "==========================================" info "" info "Настроенные параметры:" info " HPB URL: $HPB_URL" info " Listen: $LISTEN_ADDRESS" if [ -n "$F7CLOUD_URL" ]; then info " F7cloud URL: $F7CLOUD_URL" fi info "" info "Следующие шаги:" if [ -z "$F7CLOUD_URL" ] || [ -z "$F7CLOUD_SECRET" ]; then info "1. Настройте F7cloud backend в конфигурации: $CONFIG_FILE" info " Добавьте секцию [backend-id] с url и secret" fi info "2. Проверьте конфигурацию: $CONFIG_FILE" info "3. Запустите сервис:" info " sudo systemctl start f7cloud-talk-recording" info "4. Включите автозапуск:" info " sudo systemctl enable f7cloud-talk-recording" info "5. Проверьте статус:" info " sudo systemctl status f7cloud-talk-recording" info "" info "Для получения дополнительной информации см. INSTALL.md" info ""