F7_recording/install.sh

213 lines
9.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"