Выгрузка F7cloud_HPB: скрипт установки с автогенерацией секретов

This commit is contained in:
root 2026-02-18 11:34:28 +00:00
parent 43a290149b
commit 81f7f4af95
3 changed files with 494 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
# Конфиг с секретами — не выгружать в git
server.conf
.secrets.txt
# Резервные копии и временные файлы
*.bak

196
INSTALL.md Normal file
View File

@ -0,0 +1,196 @@
# Инструкция по установке HPB - Nextcloud Spreed Signaling Stack
Этот репозиторий содержит все необходимое для развертывания стека Nextcloud Talk на новом сервере.
## Быстрая установка
### Требования
- Linux (Debian/Ubuntu рекомендуется)
- Root доступ
- Открытые порты:
- 8080 (signaling HTTP, можно изменить)
- 8188 (Janus WebSocket)
- 4222 (NATS)
- 3478/5349 (coTURN UDP/TCP/TLS)
- 9991 (coTURN для signaling, можно изменить)
### Автоматическая установка
```bash
# Клонируйте репозиторий
git clone https://git.f7cloud.ru/root/F7_HPB.git /tmp/f7cloud-hpb
cd /tmp/f7cloud-hpb
# Запустите скрипт установки (от root)
sudo ./install.sh
```
Скрипт автоматически:
- ✅ Генерирует все необходимые секреты
- ✅ Создает системных пользователей
- ✅ Устанавливает бинарники в `/usr/bin` и `/usr/sbin`
- ✅ Копирует конфиги с подстановкой секретов
- ✅ Настраивает systemd unit файлы
- ✅ Сохраняет секреты в `/etc/f7cloud-spreed-signaling/.secrets.txt`
### После установки
**ВАЖНО: Обязательно отредактируйте конфиги перед запуском!**
1. **Signaling server** (`/etc/f7cloud-spreed-signaling/server.conf`):
```bash
nano /etc/f7cloud-spreed-signaling/server.conf
```
- Укажите реальные URL бэкендов Nextcloud в секции `[nextcloud-backend-0]`
- Проверьте секреты (они уже сгенерированы)
2. **coTURN** (`/etc/turnserver.conf`):
```bash
nano /etc/turnserver.conf
```
- Укажите реальные IP адреса в `listening-ip` и `relay-ip`
- Укажите `realm` (домен вашего сервера)
- Укажите пути к TLS сертификатам (если используете HTTPS)
3. **Janus** (`/etc/janus/janus.jcfg`):
- Проверьте пути к плагинам и транспортам
- Admin secret уже сгенерирован
### Запуск сервисов
```bash
# Включить автозапуск
sudo systemctl enable signaling janus nats-server coturn
# Запустить сервисы
sudo systemctl start signaling janus nats-server coturn
# Проверить статус
sudo systemctl status signaling janus nats-server coturn
```
### Проверка работы
```bash
# Логи signaling
sudo journalctl -u signaling -f
# Логи janus
sudo journalctl -u janus -f
# Логи NATS
sudo journalctl -u nats-server -f
# Логи coTURN
sudo journalctl -u coturn -f
```
## Структура установки
После установки файлы будут находиться:
```
/usr/bin/
├── signaling # Signaling server
├── janus # Janus WebRTC Gateway
└── turnserver # coTURN TURN server
/usr/sbin/
└── nats-server # NATS Server
/usr/lib/x86_64-linux-gnu/janus/
├── plugins/ # Janus плагины
├── transports/ # Janus транспорты
├── events/ # Janus event handlers
└── loggers/ # Janus loggers
/etc/f7cloud-spreed-signaling/
├── server.conf # Конфиг signaling (с секретами!)
└── .secrets.txt # Сохраненные секреты
/etc/janus/ # Конфиги Janus
/etc/turnserver.conf # Конфиг coTURN
/etc/nats-server.conf # Конфиг NATS
/etc/systemd/system/
├── signaling.service
├── janus.service
├── nats-server.service
└── coturn.service
```
## Секреты
Все секреты автоматически генерируются при установке и сохраняются в:
```
/etc/f7cloud-spreed-signaling/.secrets.txt
```
**ВАЖНО:** Сохраните этот файл в безопасном месте! Он понадобится для:
- Настройки Nextcloud (backend secret)
- Восстановления конфигурации
- Синхронизации секретов между серверами
## Ручная установка
Если автоматический скрипт не подходит, можно установить вручную:
1. Скопируйте бинарники из `signaling-server/` в соответствующие директории
2. Скопируйте конфиги из `config/` и `systemd/`
3. Сгенерируйте секреты вручную:
```bash
# Генерация hex секрета (64 символа)
openssl rand -hex 32
# Генерация base64 секрета
openssl rand -base64 16
```
4. Подставьте секреты в конфиги
5. Создайте пользователей и настройте права доступа
6. Установите systemd unit файлы
## Обновление
Для обновления:
```bash
# Остановите сервисы
sudo systemctl stop signaling janus nats-server coturn
# Обновите бинарники из репозитория
git pull
sudo cp signaling-server/* /usr/bin/ # или соответствующие пути
# Перезапустите сервисы
sudo systemctl start signaling janus nats-server coturn
```
## Удаление
```bash
# Остановите и отключите сервисы
sudo systemctl stop signaling janus nats-server coturn
sudo systemctl disable signaling janus nats-server coturn
# Удалите файлы
sudo rm -rf /etc/f7cloud-spreed-signaling
sudo rm -f /usr/bin/signaling /usr/bin/janus /usr/bin/turnserver
sudo rm -f /usr/sbin/nats-server
sudo rm -rf /usr/lib/x86_64-linux-gnu/janus
sudo rm -f /etc/systemd/system/{signaling,janus,nats-server,coturn}.service
sudo systemctl daemon-reload
# Удалите пользователей (опционально)
sudo userdel _signaling nats turnserver
```
## Поддержка
При возникновении проблем проверьте:
- Логи сервисов: `journalctl -u <service-name>`
- Права доступа к файлам
- Открыты ли необходимые порты
- Правильность конфигурации

297
install.sh Executable file
View File

@ -0,0 +1,297 @@
#!/bin/bash
# Скрипт установки HPB - Nextcloud Spreed Signaling Stack
# Автоматически генерирует секреты и настраивает все сервисы
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="/etc/f7cloud-spreed-signaling"
BIN_DIR="/usr/bin"
SBIN_DIR="/usr/sbin"
LIB_DIR="/usr/lib/x86_64-linux-gnu/janus"
CONFIG_DIR="/etc/janus"
SYSTEMD_DIR="/etc/systemd/system"
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Проверка прав root
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "Этот скрипт должен запускаться от root"
exit 1
fi
}
# Генерация случайных hex строк
generate_hex() {
local length=$1
openssl rand -hex "$length" | tr -d '\n'
}
# Генерация base64 строки
generate_base64() {
local length=$1
openssl rand -base64 "$length" | tr -d '\n' | tr -d '=' | head -c "$length"
}
# Генерация всех секретов
generate_secrets() {
log_info "Генерация секретов..."
# Signaling server секреты
SIGNALING_HASHKEY=$(generate_hex 32) # 32 байта = 64 hex символа
SIGNALING_BLOCKKEY=$(generate_hex 16) # 16 байт = 32 hex символа
SIGNALING_INTERNAL_SECRET=$(generate_hex 32) # 64 hex символа
SIGNALING_BACKEND_SECRET=$(generate_hex 32) # 64 hex символа
# TURN секрет (должен совпадать в signaling и turnserver)
TURN_SECRET=$(generate_hex 32) # 64 hex символа
TURN_API_KEY=$(generate_base64 16) # ~16 символов base64
# Janus admin secret
JANUS_ADMIN_SECRET=$(generate_base64 16) # ~16 символов
log_info "Секреты сгенерированы"
}
# Создание пользователей системы
create_users() {
log_info "Создание системных пользователей..."
# Пользователь для signaling
if ! id "_signaling" &>/dev/null; then
useradd --system --no-create-home --shell /usr/sbin/nologin \
--comment "Nextcloud Talk signaling server" _signaling || true
log_info "Пользователь _signaling создан"
else
log_warn "Пользователь _signaling уже существует"
fi
# Пользователь для NATS (обычно уже есть)
if ! id "nats" &>/dev/null; then
useradd --system --no-create-home --shell /usr/sbin/nologin \
--comment "NATS Server" nats || true
log_info "Пользователь nats создан"
else
log_warn "Пользователь nats уже существует"
fi
# Пользователь для coturn (обычно уже есть)
if ! id "turnserver" &>/dev/null; then
useradd --system --no-create-home --shell /usr/sbin/nologin \
--comment "coTURN STUN/TURN Server" turnserver || true
log_info "Пользователь turnserver создан"
else
log_warn "Пользователь turnserver уже существует"
fi
}
# Копирование бинарников
install_binaries() {
log_info "Установка бинарников..."
# Signaling
if [[ -f "$SCRIPT_DIR/signaling-server/signaling" ]]; then
cp "$SCRIPT_DIR/signaling-server/signaling" "$BIN_DIR/signaling"
chmod 755 "$BIN_DIR/signaling"
log_info "signaling установлен в $BIN_DIR/signaling"
else
log_error "Бинарник signaling не найден!"
exit 1
fi
# Janus
if [[ -f "$SCRIPT_DIR/signaling-server/janus/bin/janus" ]]; then
cp "$SCRIPT_DIR/signaling-server/janus/bin/janus" "$BIN_DIR/janus"
chmod 755 "$BIN_DIR/janus"
log_info "janus установлен в $BIN_DIR/janus"
# Janus библиотеки
mkdir -p "$LIB_DIR"
cp -r "$SCRIPT_DIR/signaling-server/janus/lib/"* "$LIB_DIR/"
log_info "Janus библиотеки установлены в $LIB_DIR"
else
log_error "Бинарник janus не найден!"
exit 1
fi
# NATS Server
if [[ -f "$SCRIPT_DIR/signaling-server/nats-server" ]]; then
cp "$SCRIPT_DIR/signaling-server/nats-server" "$SBIN_DIR/nats-server"
chmod 755 "$SBIN_DIR/nats-server"
log_info "nats-server установлен в $SBIN_DIR/nats-server"
else
log_error "Бинарник nats-server не найден!"
exit 1
fi
# coTURN
if [[ -f "$SCRIPT_DIR/signaling-server/turnserver" ]]; then
cp "$SCRIPT_DIR/signaling-server/turnserver" "$BIN_DIR/turnserver"
chmod 755 "$BIN_DIR/turnserver"
# Создаем симлинк coturn -> turnserver
ln -sf turnserver "$BIN_DIR/coturn"
log_info "turnserver установлен в $BIN_DIR/turnserver"
else
log_error "Бинарник turnserver не найден!"
exit 1
fi
}
# Установка конфигов с подстановкой секретов
install_configs() {
log_info "Установка конфигурационных файлов..."
# Создаем директории
mkdir -p "$INSTALL_DIR"
mkdir -p "$CONFIG_DIR"
# Signaling server.conf
if [[ -f "$SCRIPT_DIR/server.conf.example" ]]; then
sed -e "s|YOUR_32_OR_64_BYTE_HEX_HASHKEY|$SIGNALING_HASHKEY|g" \
-e "s|YOUR_16_24_OR_32_BYTE_HEX_BLOCKKEY|$SIGNALING_BLOCKKEY|g" \
-e "s|YOUR_INTERNAL_CLIENT_SECRET|$SIGNALING_INTERNAL_SECRET|g" \
-e "s|YOUR_NEXTCLOUD_BACKEND_SECRET|$SIGNALING_BACKEND_SECRET|g" \
-e "s|YOUR_TURN_API_KEY|$TURN_API_KEY|g" \
-e "s|YOUR_TURN_SHARED_SECRET|$TURN_SECRET|g" \
"$SCRIPT_DIR/server.conf.example" > "$INSTALL_DIR/server.conf"
chmod 600 "$INSTALL_DIR/server.conf"
chown _signaling:_signaling "$INSTALL_DIR/server.conf"
log_info "server.conf создан в $INSTALL_DIR/server.conf"
log_warn "ВАЖНО: Отредактируйте $INSTALL_DIR/server.conf - укажите реальные URL бэкендов Nextcloud!"
else
log_error "server.conf.example не найден!"
exit 1
fi
# Janus конфиги
if [[ -d "$SCRIPT_DIR/config/janus" ]]; then
cp -r "$SCRIPT_DIR/config/janus/"* "$CONFIG_DIR/"
# Подставляем admin_secret в janus.jcfg
sed -i "s|admin_secret = \"CHANGE_ME\"|admin_secret = \"$JANUS_ADMIN_SECRET\"|g" \
"$CONFIG_DIR/janus.jcfg"
chown -R root:root "$CONFIG_DIR"
log_info "Janus конфиги установлены в $CONFIG_DIR"
else
log_error "Janus конфиги не найдены!"
exit 1
fi
# coTURN turnserver.conf
if [[ -f "$SCRIPT_DIR/config/coturn/turnserver.conf.example" ]]; then
# Получаем публичный IP (если доступен) или оставляем плейсхолдер
PUBLIC_IP=$(curl -s --max-time 2 https://api.ipify.org 2>/dev/null || echo "YOUR_PUBLIC_IP")
DOMAIN=$(hostname -f 2>/dev/null || echo "YOUR_DOMAIN")
sed -e "s|YOUR_TURN_STATIC_AUTH_SECRET|$TURN_SECRET|g" \
-e "s|YOUR_PUBLIC_IP|$PUBLIC_IP|g" \
-e "s|YOUR_DOMAIN|$DOMAIN|g" \
"$SCRIPT_DIR/config/coturn/turnserver.conf.example" > "/etc/turnserver.conf"
chmod 640 "/etc/turnserver.conf"
chown turnserver:turnserver "/etc/turnserver.conf"
log_info "turnserver.conf создан в /etc/turnserver.conf"
log_warn "ВАЖНО: Отредактируйте /etc/turnserver.conf - укажите реальные IP адреса и пути к сертификатам!"
else
log_error "turnserver.conf.example не найден!"
exit 1
fi
# NATS конфиг
if [[ -f "$SCRIPT_DIR/config/nats/nats-server.conf" ]]; then
cp "$SCRIPT_DIR/config/nats/nats-server.conf" "/etc/nats-server.conf"
chmod 644 "/etc/nats-server.conf"
chown nats:nats "/etc/nats-server.conf"
log_info "nats-server.conf установлен в /etc/nats-server.conf"
else
log_error "nats-server.conf не найден!"
exit 1
fi
}
# Установка systemd unit файлов
install_systemd() {
log_info "Установка systemd unit файлов..."
if [[ -d "$SCRIPT_DIR/systemd" ]]; then
cp "$SCRIPT_DIR/systemd/"*.service "$SYSTEMD_DIR/"
systemctl daemon-reload
log_info "Systemd unit файлы установлены"
else
log_error "Systemd unit файлы не найдены!"
exit 1
fi
}
# Сохранение секретов в файл (для справки)
save_secrets() {
SECRETS_FILE="$INSTALL_DIR/.secrets.txt"
cat > "$SECRETS_FILE" <<EOF
# Сгенерированные секреты при установке $(date)
# ВАЖНО: Сохраните этот файл в безопасном месте!
# Signaling Server
hashkey = $SIGNALING_HASHKEY
blockkey = $SIGNALING_BLOCKKEY
internalsecret = $SIGNALING_INTERNAL_SECRET
backend_secret = $SIGNALING_BACKEND_SECRET
# TURN Server (используется в signaling и turnserver)
turn_secret = $TURN_SECRET
turn_apikey = $TURN_API_KEY
# Janus
admin_secret = $JANUS_ADMIN_SECRET
EOF
chmod 600 "$SECRETS_FILE"
log_warn "Секреты сохранены в $SECRETS_FILE"
log_warn "ВАЖНО: Сохраните этот файл в безопасном месте!"
}
# Основная функция установки
main() {
log_info "Начало установки HPB - Nextcloud Spreed Signaling Stack"
check_root
generate_secrets
create_users
install_binaries
install_configs
install_systemd
save_secrets
log_info ""
log_info "=========================================="
log_info "Установка завершена успешно!"
log_info "=========================================="
log_info ""
log_warn "СЛЕДУЮЩИЕ ШАГИ:"
log_warn "1. Отредактируйте $INSTALL_DIR/server.conf - укажите URL бэкендов Nextcloud"
log_warn "2. Отредактируйте /etc/turnserver.conf - укажите реальные IP и пути к сертификатам"
log_warn "3. Проверьте конфиги в $CONFIG_DIR/janus/"
log_warn "4. Секреты сохранены в $INSTALL_DIR/.secrets.txt"
log_info ""
log_info "Для запуска сервисов выполните:"
log_info " systemctl enable signaling janus nats-server coturn"
log_info " systemctl start signaling janus nats-server coturn"
log_info ""
}
# Запуск
main "$@"