#!/usr/bin/env bash # test-profiles.sh — проверка таблицы профилей производительности (AGENT.md 10.10). # Значения из профиля обязаны совпадать со спецификацией: профиль меняет только # лимиты и тюнинг, поэтому расхождение — дефект установщика. # # bash scripts/test-profiles.sh # таблица профилей # bash scripts/test-profiles.sh --env /opt/glchat/.env # установленный инстанс set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # shellcheck source=../deploy/lib/common.sh source "${REPO_DIR}/deploy/lib/common.sh" ENV_FILE="" case "${1:-}" in "") ;; --env) ENV_FILE="${2:?укажите путь к .env}" [ -f "$ENV_FILE" ] || die "не найден ${ENV_FILE}" ;; *) die "неизвестный аргумент: $1 (поддерживается --env <файл>)" ;; esac failures=0 checks=0 # expect <профиль> <параметр> <ожидаемое> expect() { local tier="$1" name="$2" want="$3" local got="${!name:-}" checks=$((checks + 1)) if [ "$got" != "$want" ]; then printf 'FAIL %s: %s = %s, ожидалось %s\n' "$tier" "$name" "$got" "$want" >&2 failures=$((failures + 1)) else printf 'ok %s: %s = %s\n' "$tier" "$name" "$got" fi } check_lite() { profile_values lite expect lite PROFILE_SQLITE_CACHE_MB 8 expect lite PROFILE_SQLITE_MMAP_MB 128 expect lite PROFILE_SQLITE_READ_POOL 2 expect lite PROFILE_GOMAXPROCS 1 expect lite PROFILE_LRU_ENTRIES 2000 expect lite PROFILE_LIVEKIT_MAX_PARTICIPANTS 10 expect lite PROFILE_LIVEKIT_MAX_VIDEO 4 expect lite PROFILE_LIVEKIT_SIMULCAST 0 expect lite PROFILE_UPLOAD_MB 25 expect lite PROFILE_APP_LIMIT 384m expect lite PROFILE_LIVEKIT_LIMIT 640m expect lite PROFILE_SWAP_GB 2 expect lite PROFILE_BACKUP_KEEP 7 expect lite PROFILE_SHARE_SOFT 1440p/30 } check_standard() { profile_values standard expect standard PROFILE_SQLITE_CACHE_MB 16 expect standard PROFILE_SQLITE_MMAP_MB 256 expect standard PROFILE_SQLITE_READ_POOL 4 expect standard PROFILE_GOMAXPROCS 2 expect standard PROFILE_LRU_ENTRIES 10000 expect standard PROFILE_LIVEKIT_MAX_PARTICIPANTS 25 expect standard PROFILE_LIVEKIT_MAX_VIDEO 8 expect standard PROFILE_LIVEKIT_SIMULCAST 2 expect standard PROFILE_UPLOAD_MB 50 expect standard PROFILE_APP_LIMIT 768m expect standard PROFILE_LIVEKIT_LIMIT 1536m expect standard PROFILE_SWAP_GB 2 expect standard PROFILE_BACKUP_KEEP 14 expect standard PROFILE_SHARE_SOFT 1440p/30 } check_plus_and_pro() { profile_values plus expect plus PROFILE_SQLITE_CACHE_MB 32 expect plus PROFILE_SQLITE_MMAP_MB 512 expect plus PROFILE_UPLOAD_MB 100 expect plus PROFILE_APP_LIMIT 1536m expect plus PROFILE_LIVEKIT_LIMIT 3g expect plus PROFILE_BACKUP_KEEP 30 expect plus PROFILE_SHARE_SOFT 4K/30 profile_values pro expect pro PROFILE_SQLITE_CACHE_MB 64 expect pro PROFILE_SQLITE_MMAP_MB 1024 expect pro PROFILE_UPLOAD_MB 250 expect pro PROFILE_APP_LIMIT 4g expect pro PROFILE_LIVEKIT_LIMIT 6g expect pro PROFILE_BACKUP_KEEP 60 expect pro PROFILE_SHARE_SOFT 4K/60 } check_none() { profile_values none # none — только обязательный минимум: системные лимиты не трогаем. expect none PROFILE_SWAP_GB 0 expect none PROFILE_GOMAXPROCS 0 expect none PROFILE_SHARE_SOFT 1080p/30 } # Профиль меняет только лимиты: набор параметров у всех профилей одинаков, иначе # переключение профиля оставило бы часть значений от прежнего. check_same_keys() { profile_values lite local lite_keys lite_keys="$(compgen -v PROFILE_ | sort | tr '\n' ' ')" profile_values pro local pro_keys pro_keys="$(compgen -v PROFILE_ | sort | tr '\n' ' ')" checks=$((checks + 1)) if [ "$lite_keys" != "$pro_keys" ]; then printf 'FAIL набор параметров профилей различается:\nlite: %s\npro: %s\n' "$lite_keys" "$pro_keys" >&2 failures=$((failures + 1)) else printf 'ok набор параметров одинаков: %s\n' "$lite_keys" fi } check_lite check_standard check_plus_and_pro check_none check_same_keys # --- режим установленного инстанса ---------------------------------------- # env_get уже есть в common.sh: читает значение из файла .env. expect_env() { # expect_env <ключ .env> <ожидаемое> local key="$1" want="$2" got got="$(env_get "$key" "$ENV_FILE" || true)" checks=$((checks + 1)) if [ "$got" != "$want" ]; then printf 'FAIL %s = %s, ожидалось %s\n' "$key" "$got" "$want" >&2 failures=$((failures + 1)) else printf 'ok %s = %s\n' "$key" "$got" fi } # expect_present <ключ> — ключ есть в .env; пустое значение допустимо. expect_present() { checks=$((checks + 1)) if grep -qE "^$1=" "$ENV_FILE"; then printf 'ok ключ %s в .env есть\n' "$1" else printf 'FAIL в .env нет ключа %s\n' "$1" >&2 failures=$((failures + 1)) fi } # check_env сверяет .env инстанса с таблицей профиля: профиль — единственный # источник этих значений, поэтому расхождение означает правку .env руками. check_env() { local tier tier="$(env_get PROFILE "$ENV_FILE" || true)" [ -n "$tier" ] || die "в ${ENV_FILE} нет PROFILE" profile_values "$tier" # Значения, которые установщик вычисляет сам, а не берёт из профиля. PROFILE_APP_CPUS="$(detect_cpus)" PROFILE_LIVEKIT_CPUS="1.0" local simulcast="true" if [ "${PROFILE_LIVEKIT_SIMULCAST:-0}" -gt 0 ] 2>/dev/null; then simulcast="false"; fi printf '\n=== профиль %s в %s ===\n' "$tier" "$ENV_FILE" expect_env PROFILE "$tier" expect_env SQLITE_READ_POOL "$PROFILE_SQLITE_READ_POOL" expect_env SQLITE_CACHE_SIZE "-${PROFILE_SQLITE_CACHE_MB}000" expect_env SQLITE_MMAP_SIZE "$((PROFILE_SQLITE_MMAP_MB * 1024 * 1024))" expect_env GOMAXPROCS "$PROFILE_GOMAXPROCS" expect_env LRU_CACHE_ENTRIES "$PROFILE_LRU_ENTRIES" expect_env PROFILE_UPLOAD_MB "$PROFILE_UPLOAD_MB" expect_env MAX_UPLOAD_SIZE "$((PROFILE_UPLOAD_MB * 1024 * 1024))" expect_env APP_CPUS "$PROFILE_APP_CPUS" expect_env APP_MEMORY_LIMIT "$PROFILE_APP_LIMIT" expect_env LIVEKIT_CPUS "$PROFILE_LIVEKIT_CPUS" expect_env LIVEKIT_MEMORY_LIMIT "$PROFILE_LIVEKIT_LIMIT" expect_env LIVEKIT_MAX_PARTICIPANTS "$PROFILE_LIVEKIT_MAX_PARTICIPANTS" expect_env LIVEKIT_MAX_VIDEO "$PROFILE_LIVEKIT_MAX_VIDEO" expect_env LIVEKIT_DISABLE_SIMULCAST "$simulcast" expect_env SHARE_SOFT_LIMIT "$PROFILE_SHARE_SOFT" expect_env SHARE_MAX_LIMIT "$PROFILE_SHARE_MAX" expect_env BACKUP_KEEP_DAYS "$PROFILE_BACKUP_KEEP" expect_env SWAP_SIZE_GB "$PROFILE_SWAP_GB" # Ключи offsite должны существовать даже пустыми, иначе бэкап их не увидит. expect_present BACKUP_OFFSITE_TARGET expect_present BACKUP_OFFSITE_KEEP_DAYS } if [ -n "$ENV_FILE" ]; then check_env fi printf '\n=== профили: %d проверок, %d ошибок ===\n' "$checks" "$failures" [ "$failures" -eq 0 ] || exit 1