F7_HPB/f7hpb.sh

191 lines
10 KiB
Bash
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
# Установка F7_HPB (signaling, конфиг, systemd). Запускается на сервере HPB.
# Использование: ./f7hpb.sh [/path/to/f7cloud-install.env] [KEY=value ...]
# Переменные: из env-файла, из аргументов KEY=value (переопределяют файл), или ввод в диалоге.
set -e
ROLE="f7hpb"
ERROR_LOG="/tmp/install-error-${ROLE}.log"
log_error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $*" >> "$ERROR_LOG"; echo "ERROR: $*" >&2; }
log_warn() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARN: $*" >> "$ERROR_LOG"; echo "WARN: $*" >&2; }
# Два режима: если переменная передана (не пустая) — использовать; иначе — запросить ввод.
# Использование: get_var ИМЯ_ПЕРЕМЕННОЙ "Подсказка для пользователя"
get_var() {
local name="$1"
local prompt="$2"
local val="${!name}"
if [ -z "$val" ]; then
read -rp "$prompt: " val
[ -z "$val" ] && { log_error "Переменная $name не задана."; exit 1; }
printf -v "$name" '%s' "$val"
fi
}
# Опциональная переменная: запрос с возможностью оставить пустым
get_var_optional() {
local name="$1"
local prompt="$2"
local val="${!name}"
if [ -z "$val" ]; then
read -rp "$prompt: " val
printf -v "$name" '%s' "$val"
fi
}
# Аргументы: 1-й — путь к env-файлу, остальные — KEY=value (переменные переопределяют env-файл)
ENV_FILE="${1:-}"
shift 2>/dev/null || true
CLI_ARGS=("$@")
# Применяем KEY=value из аргументов (чтобы ENV_FILE мог быть передан как ENV_FILE=path)
for arg in "${CLI_ARGS[@]}"; do
if [[ "$arg" == *=* ]]; then
export "$arg"
[[ "$arg" == ENV_FILE=* ]] && ENV_FILE="${arg#ENV_FILE=}"
fi
done
get_var ENV_FILE "Путь к файлу конфигурации (например /path/to/f7cloud-install.env)"
if [ ! -f "$ENV_FILE" ]; then
log_error "Файл конфигурации не найден: $ENV_FILE"
exit 1
fi
# shellcheck source=/dev/null
set -a && source "$ENV_FILE" && set +a
# Аргументы KEY=value переопределяют переменные из env-файла
for arg in "${CLI_ARGS[@]}"; do
[[ "$arg" == *=* ]] && export "$arg"
done
# Переменные из env/аргументов или диалог, если не заданы
get_var HPB_HASHKEY "HPB hashkey"
get_var HPB_BLOCKKEY "HPB blockkey"
get_var HPB_INTERNAL_SECRET "HPB internal_secret"
get_var HPB_BACKEND_SECRET "HPB backend secret"
get_var F7CLOUD_URL "URL F7 Cloud (например https://cloud.example.com)"
HPB_DOMAIN="${F7CLOUD_URL}"
get_var STATIC_AUTH_SECRET "TURN static-auth-secret (источник уточняется)"
# TURN REST API key для Janus (пока не задан, позже — из конфига coturn)
get_var_optional TURN_REST_API_KEY "TURN REST API key для Janus (Enter — пропустить)"
> "$ERROR_LOG"
echo "=== Лог установки F7_HPB ===" >> "$ERROR_LOG"
echo "Начало: $(date '+%Y-%m-%d %H:%M:%S')" >> "$ERROR_LOG"
if ! command -v git >/dev/null 2>&1; then
echo "Установка git..."
apt-get update -qq && apt-get install -y git || { log_error "Не удалось установить git"; exit 1; }
fi
rm -rf /tmp/F7_HPB
echo "Клонирование репозитория F7_HPB..."
if ! (cd /tmp && git clone https://git.f7cloud.ru/root/F7_HPB.git); then
log_error "Не удалось клонировать репозиторий F7_HPB"
exit 1
fi
sleep 1
if ! [ -d /tmp/F7_HPB ]; then
log_error "Директория /tmp/F7_HPB не существует после клонирования"
exit 1
fi
# Секреты должны быть в env (переданы из главного скрипта)
if [ -f /tmp/hpb-secrets.env ]; then
# shellcheck source=/dev/null
set -a && source /tmp/hpb-secrets.env && set +a
fi
R=/tmp/F7_HPB
SIGNALING_CONF_DIR="/etc/f7cloud-talk-signaling"
mkdir -p "$SIGNALING_CONF_DIR"
if [ -f "$R/overlay/etc/f7cloud-talk-signaling/server.conf" ]; then
cp "$R/overlay/etc/f7cloud-talk-signaling/server.conf" "$SIGNALING_CONF_DIR/"
else
[ -f "$R/server.conf.example" ] && cp "$R/server.conf.example" "$SIGNALING_CONF_DIR/server.conf"
fi
if [ -f "$SIGNALING_CONF_DIR/server.conf" ]; then
sed -i "s|hashkey = .*|hashkey = \"${HPB_HASHKEY}\"|i" "$SIGNALING_CONF_DIR/server.conf"
sed -i "s|blockkey = .*|blockkey = \"${HPB_BLOCKKEY}\"|i" "$SIGNALING_CONF_DIR/server.conf"
sed -i "s|internalsecret = .*|internalsecret = \"${HPB_INTERNAL_SECRET}\"|i" "$SIGNALING_CONF_DIR/server.conf"
sed -i "s|secret = YOUR_NEXTCLOUD_BACKEND_SECRET|secret = \"${HPB_BACKEND_SECRET}\"|g" "$SIGNALING_CONF_DIR/server.conf"
sed -i "s|url = https://[^ ]*|url = ${F7CLOUD_URL}|" "$SIGNALING_CONF_DIR/server.conf"
REALM="${F7CLOUD_URL#*://}"; REALM="${REALM%%/*}"; REALM="${REALM%%:*}"
[ -n "$TURN_REST_API_KEY" ] && sed -i "s|apikey = YOUR_TURN_API_KEY|apikey = ${TURN_REST_API_KEY}|" "$SIGNALING_CONF_DIR/server.conf"
[ -n "$STATIC_AUTH_SECRET" ] && sed -i "s|secret = YOUR_TURN_SHARED_SECRET|secret = ${STATIC_AUTH_SECRET}|" "$SIGNALING_CONF_DIR/server.conf"
[ -n "$REALM" ] && sed -i "s|servers = turn:.*|servers = turn:${REALM}:9991?transport=udp,turn:${REALM}:9991?transport=tcp|" "$SIGNALING_CONF_DIR/server.conf"
fi
# Бинарник signaling только из overlay (signaling-server убран как дубликат)
if [ -f "$R/overlay/usr/bin/signaling" ]; then
cp "$R/overlay/usr/bin/signaling" /usr/bin/ && chmod +x /usr/bin/signaling
else
log_error "Бинарник signaling не найден: $R/overlay/usr/bin/signaling"
exit 1
fi
# Юниты: coturn, nats-server, janus, signaling
find "$R" -name "*.service" -exec cp {} /etc/systemd/system/ \;
# Overlay: файлы и каталоги из репозитория на те же пути в системе
if [ -d "$R/overlay" ]; then
echo "Установка overlay (nats, janus, coturn, бинарники)..."
REALM="${F7CLOUD_URL#*://}"; REALM="${REALM%%/*}"; REALM="${REALM%%:*}"
[ -f "$R/overlay/etc/nats-server.conf" ] && cp "$R/overlay/etc/nats-server.conf" /etc/
[ -d "$R/overlay/etc/janus" ] && cp -a "$R/overlay/etc/janus" /etc/
# janus.jcfg: stun_server = домен, turn_rest_api_key = переменная (пока пусто)
if [ -f /etc/janus/janus.jcfg ] && [ -n "$REALM" ]; then
sed -i "s|stun_server = \".*\"|stun_server = \"$REALM\"|" /etc/janus/janus.jcfg
fi
[ -n "$TURN_REST_API_KEY" ] && [ -f /etc/janus/janus.jcfg ] && sed -i "s|turn_rest_api_key = \".*\"|turn_rest_api_key = \"$TURN_REST_API_KEY\"|" /etc/janus/janus.jcfg
[ -d "$R/overlay/etc/coturn" ] && cp -a "$R/overlay/etc/coturn" /etc/
[ -f "$R/overlay/etc/turnserver.conf" ] && cp "$R/overlay/etc/turnserver.conf" /etc/
# Библиотеки и плагины Janus
if [ -d "$R/overlay/usr/lib/x86_64-linux-gnu/janus" ]; then
mkdir -p /usr/lib/x86_64-linux-gnu
cp -a "$R/overlay/usr/lib/x86_64-linux-gnu/janus" /usr/lib/x86_64-linux-gnu/
fi
# Подстановка в turnserver.conf: реальный IP, realm (домен), static-auth-secret
if [ -f /etc/turnserver.conf ]; then
REAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
[ -z "$REAL_IP" ] && REAL_IP=$(ip -4 route get 8.8.8.8 2>/dev/null | grep -oP 'src \K[^ ]+' || true)
[ -n "$REAL_IP" ] && sed -i "s|listening-ip=192.168.70.81|listening-ip=$REAL_IP|g" /etc/turnserver.conf && sed -i "s|relay-ip=192.168.70.81|relay-ip=$REAL_IP|g" /etc/turnserver.conf
[ -n "$REALM" ] && sed -i "s|^realm=.*|realm=$REALM|" /etc/turnserver.conf
[ -n "$STATIC_AUTH_SECRET" ] && sed -i "s|^static-auth-secret=.*|static-auth-secret=$STATIC_AUTH_SECRET|" /etc/turnserver.conf
fi
[ -f "$R/overlay/usr/sbin/nats-server" ] && cp "$R/overlay/usr/sbin/nats-server" /usr/sbin/ && chmod +x /usr/sbin/nats-server
[ -f "$R/overlay/usr/bin/janus" ] && cp "$R/overlay/usr/bin/janus" /usr/bin/ && chmod +x /usr/bin/janus
[ -f "$R/overlay/usr/bin/turnserver" ] && cp "$R/overlay/usr/bin/turnserver" /usr/bin/ && chmod +x /usr/bin/turnserver
[ -f "$R/overlay/usr/bin/signaling" ] && cp "$R/overlay/usr/bin/signaling" /usr/bin/ && chmod +x /usr/bin/signaling
# Права для coturn: пользователь turnserver, каталоги 750
if [ -d /etc/coturn ] || [ -f /etc/turnserver.conf ]; then
getent passwd turnserver >/dev/null 2>&1 || (useradd -r -s /usr/sbin/nologin turnserver 2>/dev/null || true)
[ -f /etc/turnserver.conf ] && chown turnserver:turnserver /etc/turnserver.conf && chmod 640 /etc/turnserver.conf
if [ -d /etc/coturn ]; then
chown -R turnserver:turnserver /etc/coturn
find /etc/coturn -type d -exec chmod 750 {} \;
find /etc/coturn -type f -exec chmod 640 {} \;
fi
fi
fi
# Пользователи для служб (если ещё не созданы)
getent passwd nats >/dev/null 2>&1 || (useradd -r -s /usr/sbin/nologin nats 2>/dev/null || true)
getent passwd _signaling >/dev/null 2>&1 || (useradd -r -s /usr/sbin/nologin _signaling 2>/dev/null || true)
systemctl daemon-reload 2>/dev/null || true
# Включить и запустить службы
for svc in coturn nats-server janus signaling; do
systemctl enable "$svc" 2>/dev/null || true
systemctl start "$svc" 2>/dev/null || true
done
# Совместимость со старыми именами
systemctl enable f7cloud-spreed-signaling 2>/dev/null || systemctl enable signaling 2>/dev/null || true
systemctl start f7cloud-spreed-signaling 2>/dev/null || systemctl start signaling 2>/dev/null || true
echo "Конец: $(date '+%Y-%m-%d %H:%M:%S')" >> "$ERROR_LOG"
echo "F7_HPB установлен. Лог ошибок: $ERROR_LOG"
exit 0