install: dbus-x11, проверка firefox после копирования, без фикс. GID/UID; конфиг/код: правки под f7cloud, signaling по префиксу
This commit is contained in:
parent
fd8cbb8c8d
commit
cf5ce849cb
|
|
@ -1,7 +1,7 @@
|
||||||
[logs]
|
[logs]
|
||||||
level = 20
|
level = 20
|
||||||
|
|
||||||
[https]
|
[http]
|
||||||
listen = 127.0.0.1:8000
|
listen = 127.0.0.1:8000
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@ trustedproxies = 127.0.0.1
|
||||||
|
|
||||||
[backend]
|
[backend]
|
||||||
allowall = false
|
allowall = false
|
||||||
backends = nextcloud
|
backends = f7cloud
|
||||||
skipverify = false
|
skipverify = false
|
||||||
maxmessagesize = 10240
|
maxmessagesize = 10240
|
||||||
videowidth = 1920
|
videowidth = 1920
|
||||||
|
|
@ -18,7 +18,7 @@ videoheight = 1080
|
||||||
directory = /var/lib/f7cloud-recordings
|
directory = /var/lib/f7cloud-recordings
|
||||||
secret = F7CLOUD_SECRET
|
secret = F7CLOUD_SECRET
|
||||||
|
|
||||||
[nextcloud]
|
[f7cloud]
|
||||||
url = F7CLOUD_NEXTCLOUD_URL
|
url = F7CLOUD_NEXTCLOUD_URL
|
||||||
secret = F7CLOUD_SECRET
|
secret = F7CLOUD_SECRET
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ secret = F7CLOUD_SECRET
|
||||||
signalings = talk
|
signalings = talk
|
||||||
|
|
||||||
[talk]
|
[talk]
|
||||||
# URL signaling-сервера (HPB)
|
# URL signaling-сервера (HPB). Для HPB указывайте полный URL с путём, например https://hpb.example.com/standalone-signaling
|
||||||
url = F7CLOUD_TALK_URL
|
url = F7CLOUD_TALK_URL
|
||||||
internalsecret = F7CLOUD_TALK_INTERNALSECRET
|
internalsecret = F7CLOUD_TALK_INTERNALSECRET
|
||||||
|
|
||||||
|
|
|
||||||
44
install.sh
44
install.sh
|
|
@ -22,6 +22,8 @@ echo "=== 1. Зависимости (Python 3.12, xvfb, ffmpeg через apt) =
|
||||||
NEED_PYTHON=0
|
NEED_PYTHON=0
|
||||||
NEED_XVFB=0
|
NEED_XVFB=0
|
||||||
NEED_FFMPEG=0
|
NEED_FFMPEG=0
|
||||||
|
NEED_PULSEAUDIO=0
|
||||||
|
NEED_DBUS=0
|
||||||
|
|
||||||
if ! command -v python3.12 >/dev/null 2>&1; then
|
if ! command -v python3.12 >/dev/null 2>&1; then
|
||||||
NEED_PYTHON=1
|
NEED_PYTHON=1
|
||||||
|
|
@ -32,9 +34,15 @@ fi
|
||||||
if ! command -v ffmpeg >/dev/null 2>&1; then
|
if ! command -v ffmpeg >/dev/null 2>&1; then
|
||||||
NEED_FFMPEG=1
|
NEED_FFMPEG=1
|
||||||
fi
|
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, если их нет
|
# Пытаемся доустановить Python 3.12, xvfb и ffmpeg через apt, если их нет
|
||||||
if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 ]; then
|
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."
|
echo "Не все зависимости найдены. Попытка установки через apt-get."
|
||||||
apt-get update -qq || echo "Предупреждение: apt-get update завершился с ошибкой, продолжаю попытку установки пакетов." >&2
|
apt-get update -qq || echo "Предупреждение: apt-get update завершился с ошибкой, продолжаю попытку установки пакетов." >&2
|
||||||
|
|
||||||
|
|
@ -56,10 +64,22 @@ if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1
|
||||||
apt-get install -y ffmpeg || echo "Не удалось установить ffmpeg через apt-get." >&2
|
apt-get install -y ffmpeg || echo "Не удалось установить ffmpeg через apt-get." >&2
|
||||||
fi
|
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
|
# Перепроверяем наличие после apt-get
|
||||||
NEED_PYTHON=0
|
NEED_PYTHON=0
|
||||||
NEED_XVFB=0
|
NEED_XVFB=0
|
||||||
NEED_FFMPEG=0
|
NEED_FFMPEG=0
|
||||||
|
NEED_PULSEAUDIO=0
|
||||||
|
NEED_DBUS=0
|
||||||
if ! command -v python3.12 >/dev/null 2>&1; then
|
if ! command -v python3.12 >/dev/null 2>&1; then
|
||||||
NEED_PYTHON=1
|
NEED_PYTHON=1
|
||||||
fi
|
fi
|
||||||
|
|
@ -69,15 +89,23 @@ if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1
|
||||||
if ! command -v ffmpeg >/dev/null 2>&1; then
|
if ! command -v ffmpeg >/dev/null 2>&1; then
|
||||||
NEED_FFMPEG=1
|
NEED_FFMPEG=1
|
||||||
fi
|
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
|
fi
|
||||||
|
|
||||||
if [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ]; then
|
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 уже установлены — продолжаем установку."
|
echo "Python 3.12, Xvfb, ffmpeg, pulseaudio и dbus уже установлены — продолжаем установку."
|
||||||
else
|
else
|
||||||
echo "Не найдены обязательные системные зависимости:"
|
echo "Не найдены обязательные системные зависимости:"
|
||||||
[ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)"
|
[ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)"
|
||||||
[ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)"
|
[ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)"
|
||||||
[ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg"
|
[ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg"
|
||||||
|
[ "$NEED_PULSEAUDIO" -eq 1 ] && echo " - pulseaudio"
|
||||||
|
[ "$NEED_DBUS" -eq 1 ] && echo " - dbus-x11 (dbus-launch для PulseAudio)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.),"
|
echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.),"
|
||||||
echo "затем перезапустите ./install.sh."
|
echo "затем перезапустите ./install.sh."
|
||||||
|
|
@ -96,6 +124,10 @@ if [ ! -x "$REPO_ROOT/vendor/geckodriver/geckodriver" ]; then
|
||||||
fi
|
fi
|
||||||
rm -rf /opt/firefox-esr
|
rm -rf /opt/firefox-esr
|
||||||
cp -r "$REPO_ROOT/vendor/firefox-esr" /opt/
|
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
|
ln -sf /opt/firefox-esr/firefox /usr/local/bin/firefox-esr
|
||||||
echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr."
|
echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr."
|
||||||
|
|
||||||
|
|
@ -106,10 +138,10 @@ echo "GeckoDriver скопирован из vendor/ в /usr/local/bin/geckodrive
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== 3. Пользователь и каталоги ==="
|
echo "=== 3. Пользователь и каталоги ==="
|
||||||
if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then
|
if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then
|
||||||
groupadd --system -g 989 f7cloud-talk-recording
|
groupadd --system f7cloud-talk-recording
|
||||||
fi
|
fi
|
||||||
if ! id f7cloud-talk-recording >/dev/null 2>&1; then
|
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
|
useradd --system -g f7cloud-talk-recording -d /var/lib/f7cloud-talk-recording -s /usr/sbin/nologin f7cloud-talk-recording
|
||||||
fi
|
fi
|
||||||
mkdir -p /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings
|
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
|
chown -R f7cloud-talk-recording:f7cloud-talk-recording /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings
|
||||||
|
|
@ -136,7 +168,7 @@ if [ -f "$TEMPLATE" ]; then
|
||||||
echo "Конфиг скопирован как шаблон. Заполните вручную секреты и URL в /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)"
|
echo " (F7CLOUD_NEXTCLOUD_URL, F7CLOUD_SECRET, F7CLOUD_TALK_URL, F7CLOUD_TALK_INTERNALSECRET)"
|
||||||
fi
|
fi
|
||||||
chown root:root /etc/f7cloud-talk-recording/server.conf
|
chown root:f7cloud-talk-recording /etc/f7cloud-talk-recording/server.conf
|
||||||
chmod 640 /etc/f7cloud-talk-recording/server.conf
|
chmod 640 /etc/f7cloud-talk-recording/server.conf
|
||||||
else
|
else
|
||||||
echo "Не найден шаблон $TEMPLATE" >&2
|
echo "Не найден шаблон $TEMPLATE" >&2
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ from secrets import token_urlsafe
|
||||||
from requests import Request, Session
|
from requests import Request, Session
|
||||||
from requests_toolbelt import MultipartEncoder
|
from requests_toolbelt import MultipartEncoder
|
||||||
|
|
||||||
from nextcloud.talk import recording
|
from f7cloud.talk import recording
|
||||||
from .Config import config
|
from .Config import config
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
|
||||||
|
|
@ -255,9 +255,14 @@ class Config:
|
||||||
signalingUrl = signalingUrl.rstrip('/')
|
signalingUrl = signalingUrl.rstrip('/')
|
||||||
if signalingUrl in self._signalingIdsBySignalingUrl:
|
if signalingUrl in self._signalingIdsBySignalingUrl:
|
||||||
signalingId = self._signalingIdsBySignalingUrl[signalingUrl]
|
signalingId = self._signalingIdsBySignalingUrl[signalingUrl]
|
||||||
|
|
||||||
if self._configParser.get(signalingId, 'internalsecret', fallback=None):
|
if self._configParser.get(signalingId, 'internalsecret', fallback=None):
|
||||||
return self._configParser.get(signalingId, 'internalsecret')
|
return self._configParser.get(signalingId, 'internalsecret')
|
||||||
|
# Match by prefix: e.g. request https://host/standalone-signaling vs config https://host
|
||||||
|
for configuredUrl, signalingId in self._signalingIdsBySignalingUrl.items():
|
||||||
|
if signalingUrl == configuredUrl or signalingUrl.startswith(configuredUrl.rstrip('/') + '/'):
|
||||||
|
if self._configParser.get(signalingId, 'internalsecret', fallback=None):
|
||||||
|
return self._configParser.get(signalingId, 'internalsecret')
|
||||||
|
break
|
||||||
|
|
||||||
return self._configParser.get('signaling', 'internalsecret', fallback=None)
|
return self._configParser.get('signaling', 'internalsecret', fallback=None)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ from prometheus_client import Counter, Gauge, make_wsgi_app
|
||||||
from werkzeug.exceptions import BadRequest, Forbidden, NotFound
|
from werkzeug.exceptions import BadRequest, Forbidden, NotFound
|
||||||
from werkzeug.middleware.dispatcher import DispatcherMiddleware
|
from werkzeug.middleware.dispatcher import DispatcherMiddleware
|
||||||
|
|
||||||
from nextcloud.talk import recording
|
from f7cloud.talk import recording
|
||||||
from f7cloud.talk.recording import RECORDING_STATUS_AUDIO_AND_VIDEO
|
from f7cloud.talk.recording import RECORDING_STATUS_AUDIO_AND_VIDEO
|
||||||
from .Config import config
|
from .Config import config
|
||||||
from .Service import Service
|
from .Service import Service
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ Module to provide the command line interface for the recorder.
|
||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from nextcloud.talk import recording
|
from f7cloud.talk import recording
|
||||||
from .Config import config
|
from .Config import config
|
||||||
from .Server import app
|
from .Server import app
|
||||||
|
|
||||||
|
|
@ -39,8 +39,9 @@ def main():
|
||||||
|
|
||||||
listen = config.getListen()
|
listen = config.getListen()
|
||||||
host, port = listen.split(':')
|
host, port = listen.split(':')
|
||||||
|
port = int(port, 10)
|
||||||
|
|
||||||
app.run(host, port, threaded=True)
|
app.run(host=host, port=port, threaded=True)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user