143 lines
6.7 KiB
Bash
Executable File
143 lines
6.7 KiB
Bash
Executable File
#!/bin/bash
|
||
# Развёртывание F7cloud Talk Recording на целевой машине (Debian/Ubuntu).
|
||
# Запуск: sudo ./install
|
||
# Секреты и адреса задайте через переменные окружения перед запуском:
|
||
# 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
|
||
|
||
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 — остальное в репо) ==="
|
||
|
||
NEED_PYTHON=0
|
||
NEED_XVFB=0
|
||
NEED_FFMPEG=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 [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ]; then
|
||
echo "Python 3.12, Xvfb и ffmpeg уже установлены — продолжаем установку."
|
||
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"
|
||
echo ""
|
||
echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.),"
|
||
echo "затем перезапустите ./install. Сам скрипт install больше не вызывает apt-get."
|
||
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/
|
||
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 -g 989 f7cloud-talk-recording
|
||
fi
|
||
if ! id f7cloud-talk-recording >/dev/null 2>&1; then
|
||
useradd --system -u 999 -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:root /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"
|