Справка

Проверка архитектуры Linux

VoceSpace имеет два типа образов:

  • amd: privoce/vocespace:latest
  • arm: privoce/vocespace:latest_arm

Поэтому вам нужно знать архитектуру вашего сервера для выбора

1. Использование команды uname

Команда uname может отображать информацию о ядре системы, включая аппаратную архитектуру.

Выполните следующую команду:

1uname -m
  • Если вывод x86_64, то система основана на архитектуре AMD64 или Intel64 (обычно называется x86_64).
  • Если вывод aarch64 или arm64, то система основана на архитектуре ARM64.
  • Если вывод armv7l или подобное, то система основана на архитектуре ARMv7.

2. Использование команды arch

Команда arch также может отображать тип архитектуры системы.

Выполните следующую команду:

1arch
  • Если вывод x86_64, то система основана на архитектуре AMD64 или Intel64.
  • Если вывод aarch64 или arm64, то система основана на архитектуре ARM64.
  • Если вывод armv7l или подобное, то система основана на архитектуре ARMv7.

Как получить key и secret

1docker pull livekit/generate
2docker run --rm -it -v $PWD:/output livekit/generate

С помощью livekit/generate вы получите файл livekit.yaml, который является файлом конфигурации вашего livekit-server, в нем будут сгенерированы key и secret

Как повысить качество видео/демонстрации экрана

Разрешение Пиксели FPS Кодек Рекомендуемый битрейт Высокое качество Максимальное качество
540p (qHD) 960×540 30fps H.264 800 Kbps 1 Mbps 1.5 Mbps
VP9 600 Kbps 800 Kbps 1.2 Mbps
AV1 400 Kbps 700 Kbps 1 Mbps
720p (HD) 1280×720 30fps H.264 1.5 Mbps 2 Mbps 2.5 Mbps
60fps H.264 2.5 Mbps 3.5 Mbps 4 Mbps
VP9 1.2 Mbps 1.8 Mbps 2.2 Mbps
AV1 1 Mbps 1.5 Mbps 2 Mbps
1080p (Full HD) 1920×1080 30fps H.264 3 Mbps 4.5 Mbps 6 Mbps
60fps H.264 4.5 Mbps 6 Mbps 8 Mbps
VP9 2.5 Mbps 4 Mbps 5 Mbps
AV1 1.8 Mbps 3 Mbps 4 Mbps
1440p (2K/QHD) 2560×1440 30fps H.264 6 Mbps 8 Mbps 10 Mbps
60fps H.264 8 Mbps 10 Mbps 14 Mbps
VP9 4.5 Mbps 7 Mbps 9 Mbps
AV1 3.5 Mbps 5 Mbps 7 Mbps
2160p (4K/UHD) 3840×2160 30fps H.264 10 Mbps 14 Mbps 20 Mbps
60fps H.264 15 Mbps 20 Mbps 25 Mbps
VP9 8 Mbps 12 Mbps 18 Mbps
AV1 6 Mbps 10 Mbps 14 Mbps

Пояснения

  • Рекомендуемый битрейт: подходит для ежедневных трансляций, конференций, потоковой передачи с низкой задержкой.

  • Высокое качество: подходит для загрузки на YouTube или записи, баланс между качеством и размером файла.

  • Максимальное качество: для высококачественного сохранения или профессиональных сценариев, таких как сбор материалов, исходники для видеомонтажа.

  • Описание кодеков:

    • H.264: лучшая совместимость, широкая аппаратная поддержка.

    • VP9: разработан Google, широко используется YouTube, эффективность немного выше, чем у H.264.

    • AV1: кодек следующего поколения с высоким коэффициентом сжатия, меньший размер файла, но более длительное время кодирования.

Соответствующие параметры запуска

  • Разрешение: NEXT_PUBLIC_RESOLUTION
  • Битрейт: NEXT_PUBLIC_MAXBITRATE
  • Частота кадров: NEXT_PUBLIC_MAXFRAMERATE
  • Приоритет: NEXT_PUBLIC_PRIORITY
    • high
    • medium
    • low
    • very-low

Пример

Когда вам нужно использовать 720p + 60fps + стратегию высокой точности

1bash ./local_deploy.sh \
2-e NEXT_PUBLIC_RESOLUTION=720p \
3-e NEXT_PUBLIC_MAXFRAMERATE=60 \
4-e NEXT_PUBLIC_PRIORITY=high

Скрипт локального развертывания

Linux/macOS
Windows
1#!/bin/bash
2
3# Скрипт автоматического развертывания VoceSpace
4# Для систем macOS и Linux
5
6set -e # Выход при ошибке
7
8# Переменные окружения по умолчанию
9CUSTOM_ENV_VARS=()
10
11# Показать справку по использованию
12show_help() {
13echo "================================================"
14echo "Скрипт автоматического развертывания VoceSpace"
15echo "================================================"
16echo ""
17echo "Использование: $0 [опции]"
18echo ""
19echo "Опции:"
20echo " -e, --env KEY=VALUE Установить пользовательскую переменную окружения"
21echo " -h, --help Показать эту справку"
22echo ""
23echo "Примеры:"
24echo " $0 -e NEXT_PUBLIC_RESOLUTION=4k
25echo " $0 -e NEXT_PUBLIC_RESOLUTION=1080p"
26echo " $0 -e NEXT_PUBLIC_RESOLUTION=4k -e CUSTOM_VAR=value"
27echo " $0 -e NEXT_PUBLIC_MAXBITRATE=8000 -e NEXT_PUBLIC_RESOLUTION=720p"
28echo ""
29echo "Общие переменные окружения:
30echo " - NEXT_PUBLIC_RESOLUTION: Установить разрешение (4k, 2k, 1080p, 720p, 480p)"
31echo " - NEXT_PUBLIC_MAXBITRATE: Установить максимальный битрейт"
32echo " - NEXT_PUBLIC_MAXFRAMERATE: Установить максимальную частоту кадров"
33echo " - NEXT_PUBLIC_PRIORITY: Установить приоритет"
34echo ""
35}
36
37# Разбор аргументов командной строки
38parse_args() {
39    while [[ $# -gt 0 ]]; do
40        case $1 in
41            -e|--env)
42                CUSTOM_ENV_VARS+=("$2")
43                shift 2
44                ;;
45            -h|--help)
46                show_help
47                exit 0
48                ;;
49            *)
50                echo "❌ Неизвестный параметр: $1"
51                echo "Используйте $0 --help для просмотра справки"
52                exit 1
53                ;;
54        esac
55    done
56}
57
58echo "=========================================="
59echo "Скрипт автоматического развертывания VoceSpace"
60echo "=========================================="
61
62# Определение операционной системы
63OS=$(uname -s)
64ARCH=$(uname -m)
65
66echo "Операционная система: $OS"
67echo "Архитектура: $ARCH"
68
69# Функция: Проверка существования команды
70check_command() {
71    if ! command -v "$1" &> /dev/null; then
72        echo "❌ $1 не установлен"
73        return 1
74    else
75        echo "✅ $1 установлен"
76        return 0
77    fi
78}
79
80# Функция: Проверка установки Docker
81check_docker() {
82    if check_command docker; then
83        echo "Версия Docker: $(docker --version)"
84        return 0
85    else
86        echo "❌ Docker не установлен, установите Docker сначала"
87        echo "Посетите следующие ссылки для установки Docker:"
88        case $OS in
89            "Darwin")
90                echo "  macOS: https://docs.docker.com/desktop/install/mac-install/"
91                ;;
92            "Linux")
93                echo "  Linux: https://docs.docker.com/engine/install/"
94                ;;
95            *)
96                echo "  другие: https://docs.docker.com/get-docker/"
97                ;;
98        esac
99        return 1
100    fi
101}
102
103# Установка LiveKit Server
104install_livekit() {
105    echo "=========================================="
106    echo "Установка LiveKit Server"
107    echo "=========================================="
108    
109    if check_command livekit-server; then
110        echo "LiveKit Server уже установлен"
111        return 0
112    fi
113    
114    case $OS in
115        "Darwin")
116            echo "Установка LiveKit Server на macOS..."
117            if check_command brew; then
118                brew update && brew install livekit
119            else
120                echo "❌ Homebrew не установлен, установите Homebrew или установите LiveKit Server вручную"
121                echo "Команда установки Homebrew: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
122                return 1
123            fi
124            ;;
125        "Linux")
126            echo "Установка LiveKit Server на Linux..."
127            curl -sSL https://get.livekit.io | bash
128            ;;
129        *)
130            echo "❌ Неподдерживаемая операционная система: $OS"
131            echo "Установите LiveKit Server вручную: https://github.com/livekit/livekit/releases"
132            return 1
133            ;;
134    esac
135}
136
137# Функция: Получить Docker образ
138get_docker_image() {
139    case $ARCH in
140        "x86_64"|"amd64")
141            echo "privoce/vocespace:latest"
142            ;;
143        "arm64"|"aarch64")
144            echo "privoce/vocespace:latest_arm"
145            ;;
146        *)
147            echo "❌ Неподдерживаемая архитектура: $ARCH"
148            echo "Поддерживаемые архитектуры: x86_64, amd64, arm64, aarch64"
149            exit 1
150            ;;
151    esac
152}
153
154# Функция: Загрузить образ VoceSpace
155pull_vocespace_image() {
156    echo "=========================================="
157    echo "Загрузка образа VoceSpace Docker"
158    echo "=========================================="
159    
160    IMAGE=$(get_docker_image)
161    echo "Загрузка образа: $IMAGE"
162
163    docker pull "$IMAGE"
164    echo "✅ Образ успешно загружен"
165}
166
167# Функция: Запустить контейнер VoceSpace
168start_vocespace_container() {
169    echo "=========================================="
170    echo "Запуск контейнера VoceSpace"
171    echo "=========================================="
172    
173    IMAGE=$(get_docker_image)
174    CONTAINER_NAME="vocespace"
175
176    # Построить аргументы переменных окружения
177    ENV_ARGS=()
178
179    # Добавить пользовательские переменные окружения
180    for env_var in "${CUSTOM_ENV_VARS[@]}"; do
181        ENV_ARGS+=("-e" "$env_var")
182        echo "Установка переменной окружения: $env_var"
183    done
184
185    # Проверить, существует ли контейнер
186    if docker ps -a --format "table {{.Names}}" | grep -q "^$CONTAINER_NAME$"; then
187        echo "Обнаружен существующий контейнер $CONTAINER_NAME"
188        read -p "Остановить и удалить существующий контейнер? (y/n): " -n 1 -r
189        echo
190        if [[ $REPLY =~ ^[Yy]$ ]]; then
191            echo "Остановка и удаление существующего контейнера..."
192            docker stop "$CONTAINER_NAME" 2>/dev/null || true
193            docker rm "$CONTAINER_NAME" 2>/dev/null || true
194        else
195            echo "Операция отменена"
196            return 1
197        fi
198    fi
199
200    echo "Запуск нового контейнера..."
201    if [[ ${#ENV_ARGS[@]} -gt 0 ]]; then
202        echo "Использование переменных окружения: ${ENV_ARGS[*]}"
203        docker run -d \
204            -p 3000:3000 \
205            --name "$CONTAINER_NAME" \
206            "${ENV_ARGS[@]}" \
207            "$IMAGE"
208    else
209        docker run -d \
210            -p 3000:3000 \
211            --name "$CONTAINER_NAME" \
212            "$IMAGE"
213    fi
214
215    echo "✅ Контейнер VoceSpace запущен"
216    echo "Имя контейнера: $CONTAINER_NAME"
217    echo "URL доступа: http://localhost:3000"
218}
219
220# Функция: Запустить LiveKit Server
221start_livekit_server() {
222    echo "=========================================="
223    echo "Запуск LiveKit Server"
224    echo "=========================================="
225
226    echo "Проверка, запущен ли LiveKit Server..."
227    if pgrep -f "livekit-server" > /dev/null; then
228        echo "⚠️  LiveKit Server уже запущен"
229        read -p "Перезапустить LiveKit Server? (y/n): " -n 1 -r
230        echo
231        if [[ $REPLY =~ ^[Yy]$ ]]; then
232            echo "Остановка существующего LiveKit Server..."
233            pkill -f "livekit-server" || true
234            sleep 2
235        else
236            echo "Оставить существующий LiveKit Server запущенным"
237            return 0
238        fi
239    fi
240
241    echo "Запуск LiveKit Server..."
242    echo "Примечание: LiveKit Server будет работать в фоновом режиме"
243    echo "Для остановки используйте: pkill -f livekit-server"
244
245    nohup livekit-server --dev --bind 0.0.0.0 > livekit-server.log 2>&1 &
246    
247    sleep 3
248    
249    if pgrep -f "livekit-server" > /dev/null; then
250        echo "✅ LiveKit Server успешно запущен"
251        echo "Файл логов: $(pwd)/livekit-server.log"
252    else
253        echo "❌ Не удалось запустить LiveKit Server"
254        echo "Проверьте файл логов: $(pwd)/livekit-server.log"
255        return 1
256    fi
257}
258
259# Функция: Показать статус
260show_status() {
261    echo "=========================================="
262    echo "Текущий статус"
263    echo "=========================================="
264    
265    echo "Статус контейнера Docker:"
266    docker ps --filter "name=vocespace" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
267    
268    echo ""
269    echo "Статус LiveKit Server:"
270    if pgrep -f "livekit-server" > /dev/null; then
271        echo "✅ LiveKit Server запущен"
272    else
273        echo "❌ LiveKit Server не запущен"
274    fi
275    
276    echo ""
277    echo "=========================================="
278    echo "Информация о доступе"
279    echo "=========================================="
280    echo "VoceSpace App: http://localhost:3000"
281    echo "LiveKit Server: ws://localhost:7880"
282    echo ""
283    echo "Для просмотра логов контейнера: docker logs vocespace"
284    echo "Для просмотра логов LiveKit: tail -f livekit-server.log"
285}
286
287# Главная функция
288main() {
289    # Разбор аргументов командной строки
290    parse_args "$@"
291
292    echo "Начало процесса развертывания..."
293
294    # Показать информацию о конфигурации
295    if [[ ${#CUSTOM_ENV_VARS[@]} -gt 0 ]]; then
296        echo "=========================================="
297        echo "Информация о конфигурации"
298        echo "=========================================="
299        for env_var in "${CUSTOM_ENV_VARS[@]}"; do
300            echo "Переменная окружения: $env_var"
301        done
302        echo ""
303    fi
304
305    # Проверка Docker
306    if ! check_docker; then
307        exit 1
308    fi
309
310    # Установка LiveKit Server
311    if ! install_livekit; then
312        echo "❌ Не удалось установить LiveKit Server"
313        exit 1
314    fi
315
316    # Загрузка образа Docker
317    if ! pull_vocespace_image; then
318        echo "❌ Не удалось загрузить образ Docker"
319        exit 1
320    fi
321
322    # Запуск контейнера
323    if ! start_vocespace_container; then
324        echo "❌ Не удалось запустить контейнер"
325        exit 1
326    fi
327
328    # Запуск LiveKit Server
329    if ! start_livekit_server; then
330        echo "❌ Не удалось запустить LiveKit Server"
331        exit 1
332    fi
333    
334    echo ""
335    echo "Ожидание запуска служб..."
336    sleep 5
337
338    # Показать статус
339    show_status
340    
341    echo ""
342    echo "==========================================="
343    echo "🎉 Развертывание завершено!"
344    echo "==========================================="
345    echo "Откройте http://localhost:3000 в браузере"
346    echo "Если возникли проблемы, проверьте соответствующие файлы логов"
347}
348
349# Запустить главную функцию
350main "$@"

Тайм-аут сетевого подключения Docker

👍 Использование зеркал для Китая

AMD64

1docker pull crpi-0u8xaje6k9g42uky.cn-hangzhou.personal.cr.aliyuncs.com/vocespace/vocespace:latest

ARM64

1docker pull crpi-0u8xaje6k9g42uky.cn-hangzhou.personal.cr.aliyuncs.com/vocespace/vocespace:latest_arm

Настройка Docker

Пользователи в Китае могут столкнуться с проблемами тайм-аута при доступе к Docker Hub. Следуйте приведенным ниже инструкциям для настройки.

Создание daemon.json

1sudo mkdir -p /etc/docker
2sudo touch /etc/docker/daemon.json

Добавление зеркал репозиториев

  • Tencent: https://mirror.ccs.tencentyun.com
  • USTC: https://docker.mirrors.ustc.edu.cn
  • Alibaba: см. Консоль -> Поиск -> Сервис контейнерных образов ACR -> Инструменты образов -> Ускорение образов
1sudo tee /etc/docker/daemon.json <<-'EOF'
2{
3  "registry-mirrors": ["https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn"]
4}
5EOF

Перезапуск Docker

1sudo systemctl daemon-reload
2sudo systemctl restart docker

Смена сервера

В Китае, даже если сервер имеет публичный IP, могут возникнуть проблемы с доступом к внешним сервисам, таким как Docker Hub и GitHub. Это в основном связано со сложностью сетевой среды и связанными с ней ограничениями. Возможные причины и решения: Общие причины

  • Проблемы с разрешением DNS: DNS-серверы по умолчанию могут не корректно разрешать доменные имена Docker Hub или GitHub
  • Сетевые ограничения: некоторые сетевые среды (например, сети операторов, корпоративные сети) могут ограничивать или блокировать доступ к определенным внешним сервисам
  • Брандмауэр или политики безопасности: брандмауэр сервера или правила группы безопасности могут блокировать доступ к определенным сервисам
  • Влияние GFW: в Китае некоторые внешние сервисы могут быть ограничены GFW
TIP

Поэтому мы рекомендуем выбирать серверы в следующих регионах:

  1. Гонконг (Китай)
  2. Япония
  3. Корея
  4. Сингапур
  5. Страны Европы и Америки

Часто используемые команды Docker

Просмотр образов

1docker image ls
2# или используйте
3docker images

Просмотр всех контейнеров

1docker ps -a

Просмотр запущенных контейнеров

1docker ps

Остановка контейнера

1docker stop container_name_or_id

Принудительное завершение контейнера

1docker kill container_name_or_id

Удаление контейнера

1docker rm container_name_or_id
2
3# Удаление остановленных контейнеров
4docker container prune
5# Удаление всех, включая запущенные
6docker rm -f $(docker ps -aq)

Удаление образа

1docker rmi image_name_or_id
2
3# Удаление всех образов
4docker rmi -f $(docker images -q)