#!/bin/bash # Развёртывание F7cloud Talk Recording на целевой машине (Debian/Ubuntu). # Запуск: sudo ./install.sh # Секреты и адреса задайте через переменные окружения перед запуском: # F7CLOUD_NEXTCLOUD_URL — URL сервера Nextcloud (например https://forbion.f7cloud.ru) # F7CLOUD_SECRET — общий секрет (backend + nextcloud) # F7CLOUD_TALK_URL — URL signaling (HPB), например https://hpb-prod.f7cloud.ru/standalone-signaling # F7CLOUD_TALK_INTERNALSECRET — internalsecret для доступа к signaling # Пример: export F7CLOUD_NEXTCLOUD_URL=... F7CLOUD_SECRET=... F7CLOUD_TALK_URL=... F7CLOUD_TALK_INTERNALSECRET=... ; sudo -E ./install.sh set -e if [ "$(id -u)" -ne 0 ]; then echo "Запустите скрипт с правами root: sudo $0" exit 1 fi REPO_ROOT="$(cd "$(dirname "$0")" && pwd)" echo "=== 1. Зависимости (Python 3.12, xvfb, ffmpeg через apt) ===" NEED_PYTHON=0 NEED_XVFB=0 NEED_FFMPEG=0 NEED_PULSEAUDIO=0 NEED_DBUS=0 if ! command -v python3.12 >/dev/null 2>&1; then NEED_PYTHON=1 fi if ! command -v Xvfb >/dev/null 2>&1 && ! command -v xvfb-run >/dev/null 2>&1; then NEED_XVFB=1 fi if ! command -v ffmpeg >/dev/null 2>&1; then NEED_FFMPEG=1 fi if ! command -v pulseaudio >/dev/null 2>&1; then NEED_PULSEAUDIO=1 fi if ! command -v dbus-launch >/dev/null 2>&1; then NEED_DBUS=1 fi # Пытаемся доустановить Python 3.12, xvfb и ffmpeg через apt, если их нет if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 ] || [ "$NEED_PULSEAUDIO" -eq 1 ] || [ "$NEED_DBUS" -eq 1 ]; then echo "Не все зависимости найдены. Попытка установки через apt-get." apt-get update -qq || echo "Предупреждение: apt-get update завершился с ошибкой, продолжаю попытку установки пакетов." >&2 if [ "$NEED_PYTHON" -eq 1 ]; then echo "Установка Python 3.12: apt-get install -y python3.12" apt-get install -y python3.12 || echo "Не удалось установить python3.12 через apt-get." >&2 echo "Установка python3.12-venv: apt-get install -y python3.12-venv" apt-get install -y python3.12-venv || echo "Не удалось установить python3.12-venv через apt-get." >&2 fi if [ "$NEED_XVFB" -eq 1 ]; then echo "Установка Xvfb: apt-get install -y xvfb" apt-get install -y xvfb || echo "Не удалось установить xvfb через apt-get." >&2 fi if [ "$NEED_FFMPEG" -eq 1 ]; then echo "Установка ffmpeg: apt-get install -y ffmpeg" apt-get install -y ffmpeg || echo "Не удалось установить ffmpeg через apt-get." >&2 fi if [ "$NEED_PULSEAUDIO" -eq 1 ]; then echo "Установка pulseaudio: apt-get install -y pulseaudio" apt-get install -y pulseaudio || echo "Не удалось установить pulseaudio через apt-get." >&2 fi if [ "$NEED_DBUS" -eq 1 ]; then echo "Установка dbus-x11 (dbus-launch для PulseAudio): apt-get install -y dbus-x11" apt-get install -y dbus-x11 || apt-get install -y dbus || echo "Не удалось установить dbus-x11/dbus через apt-get." >&2 fi # Перепроверяем наличие после apt-get NEED_PYTHON=0 NEED_XVFB=0 NEED_FFMPEG=0 NEED_PULSEAUDIO=0 NEED_DBUS=0 if ! command -v python3.12 >/dev/null 2>&1; then NEED_PYTHON=1 fi if ! command -v Xvfb >/dev/null 2>&1 && ! command -v xvfb-run >/dev/null 2>&1; then NEED_XVFB=1 fi if ! command -v ffmpeg >/dev/null 2>&1; then NEED_FFMPEG=1 fi if ! command -v pulseaudio >/dev/null 2>&1; then NEED_PULSEAUDIO=1 fi if ! command -v dbus-launch >/dev/null 2>&1; then NEED_DBUS=1 fi fi if [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ] && [ "$NEED_PULSEAUDIO" -eq 0 ] && [ "$NEED_DBUS" -eq 0 ]; then echo "Python 3.12, Xvfb, ffmpeg, pulseaudio и dbus уже установлены — продолжаем установку." else echo "Не найдены обязательные системные зависимости:" [ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)" [ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)" [ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg" [ "$NEED_PULSEAUDIO" -eq 1 ] && echo " - pulseaudio" [ "$NEED_DBUS" -eq 1 ] && echo " - dbus-x11 (dbus-launch для PulseAudio)" echo "" echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.)," echo "затем перезапустите ./install.sh." exit 1 fi echo "" echo "=== 2. Firefox ESR и GeckoDriver (копирование из репо) ===" if [ ! -x "$REPO_ROOT/vendor/firefox-esr/firefox" ]; then echo "Ошибка: в репо не найден vendor/firefox-esr/firefox. Положите сюда установленный Firefox ESR (скопируйте с машины сборки из /opt/firefox-esr)." >&2 exit 1 fi if [ ! -x "$REPO_ROOT/vendor/geckodriver/geckodriver" ]; then echo "Ошибка: в репо не найден vendor/geckodriver/geckodriver. Положите сюда бинарь geckodriver (скопируйте с машины сборки из /usr/local/bin/geckodriver)." >&2 exit 1 fi rm -rf /opt/firefox-esr cp -r "$REPO_ROOT/vendor/firefox-esr" /opt/ if [ ! -x /opt/firefox-esr/firefox ]; then echo "Ошибка: после копирования не найден /opt/firefox-esr/firefox. Проверьте наличие vendor/firefox-esr/ в репо." >&2 exit 1 fi ln -sf /opt/firefox-esr/firefox /usr/local/bin/firefox-esr echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr." cp "$REPO_ROOT/vendor/geckodriver/geckodriver" /usr/local/bin/geckodriver chmod +x /usr/local/bin/geckodriver echo "GeckoDriver скопирован из vendor/ в /usr/local/bin/geckodriver." echo "" echo "=== 3. Пользователь и каталоги ===" if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then groupadd --system f7cloud-talk-recording fi if ! id f7cloud-talk-recording >/dev/null 2>&1; then useradd --system -g f7cloud-talk-recording -d /var/lib/f7cloud-talk-recording -s /usr/sbin/nologin f7cloud-talk-recording fi mkdir -p /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings chown -R f7cloud-talk-recording:f7cloud-talk-recording /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings echo "" echo "=== 4. Копирование systemd unit ===" cp "$REPO_ROOT/systemd/f7cloud-talk-recording.service" /etc/systemd/system/ chmod 644 /etc/systemd/system/f7cloud-talk-recording.service echo "" echo "=== 5. Конфиг приложения ===" mkdir -p /etc/f7cloud-talk-recording TEMPLATE="$REPO_ROOT/etc/f7cloud-talk-recording/server.conf.template" if [ -f "$TEMPLATE" ]; then if [ -n "$F7CLOUD_NEXTCLOUD_URL" ] && [ -n "$F7CLOUD_SECRET" ] && [ -n "$F7CLOUD_TALK_URL" ] && [ -n "$F7CLOUD_TALK_INTERNALSECRET" ]; then sed -e "s|F7CLOUD_NEXTCLOUD_URL|$F7CLOUD_NEXTCLOUD_URL|g" \ -e "s|F7CLOUD_SECRET|$F7CLOUD_SECRET|g" \ -e "s|F7CLOUD_TALK_URL|$F7CLOUD_TALK_URL|g" \ -e "s|F7CLOUD_TALK_INTERNALSECRET|$F7CLOUD_TALK_INTERNALSECRET|g" \ "$TEMPLATE" > /etc/f7cloud-talk-recording/server.conf echo "Конфиг создан из шаблона (значения из переменных окружения)." else cp "$TEMPLATE" /etc/f7cloud-talk-recording/server.conf echo "Конфиг скопирован как шаблон. Заполните вручную секреты и URL в /etc/f7cloud-talk-recording/server.conf" echo " (F7CLOUD_NEXTCLOUD_URL, F7CLOUD_SECRET, F7CLOUD_TALK_URL, F7CLOUD_TALK_INTERNALSECRET)" fi chown root:f7cloud-talk-recording /etc/f7cloud-talk-recording/server.conf chmod 640 /etc/f7cloud-talk-recording/server.conf else echo "Не найден шаблон $TEMPLATE" >&2 exit 1 fi echo "" echo "=== 6. Исходники и venv в /opt ===" mkdir -p /opt/f7cloud-talk-recording if [ -d "$REPO_ROOT/opt/f7cloud-talk-recording-src" ]; then cp -r "$REPO_ROOT/opt/f7cloud-talk-recording-src" /opt/ else echo "Не найдена папка opt/f7cloud-talk-recording-src" >&2 exit 1 fi if [ -f "$REPO_ROOT/opt/f7cloud-talk-recording/requirements.txt" ]; then cp "$REPO_ROOT/opt/f7cloud-talk-recording/requirements.txt" /opt/f7cloud-talk-recording/ fi echo "Создание виртуального окружения..." /usr/bin/python3.12 -m venv /opt/f7cloud-talk-recording/venv /opt/f7cloud-talk-recording/venv/bin/pip install -q -r /opt/f7cloud-talk-recording/requirements.txt /opt/f7cloud-talk-recording/venv/bin/pip install -q -e /opt/f7cloud-talk-recording-src chown -R f7cloud-talk-recording:f7cloud-talk-recording /opt/f7cloud-talk-recording /opt/f7cloud-talk-recording-src echo "" echo "=== 7. Systemd ===" systemctl daemon-reload systemctl enable f7cloud-talk-recording.service if [ -n "$F7CLOUD_NEXTCLOUD_URL" ] && [ -n "$F7CLOUD_SECRET" ] && [ -n "$F7CLOUD_TALK_URL" ] && [ -n "$F7CLOUD_TALK_INTERNALSECRET" ]; then systemctl start f7cloud-talk-recording.service echo "Сервис f7cloud-talk-recording запущен." else echo "После заполнения секретов в /etc/f7cloud-talk-recording/server.conf выполните:" echo " systemctl start f7cloud-talk-recording.service" fi echo "" echo "Готово. Логи: journalctl -u f7cloud-talk-recording.service -f"