gigastt-pro

Документация

Пакет, systemd и proxy; сервер остаётся на loopback

Релиз отдаёт tarball, .deb, .rpm и SHA256SUMS.txt. Контейнеры — Podman первым, Docker как OCI fallback с теми же флагами.

Железо

CPU
x86_64 — профиль x86-64-v3 (AVX2, Haswell 2013+ / Zen+); aarch64 — ARMv8.2 с dotprod.
RAM
≥ 4 ГБ при пуле из двух сессий; на слабой машине хватает 2 ГБ с пулом 1
Диск
веса product INT8 ~225 МБ плюс сам бинарник

Что внутри пакета

Пакет создаёт пользователя gigastt и каталог /var/lib/gigastt/models. Веса оказываются там при сборке пакета с --with-models; иначе их кладёте вы — из air-gap бандла или командой gigastt download.

раскладка tarball / .deb / .rpm
usr/bin/gigastt
usr/lib/systemd/system/gigastt.service
etc/gigastt-pro/config.toml
etc/logrotate.d/gigastt
usr/share/gigastt-pro/domain_packs/
usr/share/gigastt-pro/INSTALL.txt
var/lib/gigastt/models/    # candle_int8/ при сборке --with-models, иначе пусто

systemd

Unit из пакета рассчитан на работу за proxy или в контейнере: он биндит 0.0.0.0 с явным --allow-insecure-bind, а исходящие соединения режет IPAddressDeny/Allow до loopback и RFC1918. Если сервер и proxy живут на одном хосте, уберите из ExecStart флаги --bind-all, --host 0.0.0.0 и --allow-insecure-bind — останется дефолтный 127.0.0.1:9876.

usr/lib/systemd/system/gigastt.service
[Unit]
Description=GigaSTT Pro — local Russian speech-to-text server
Documentation=https://gitverse.ru/ekhodzitsky/gigastt-pro
After=network.target

[Service]
Type=simple
User=gigastt
Group=gigastt
# --allow-insecure-bind: prefer reverse-proxy on loopback; when binding
# 0.0.0.0 without --auth-api-keys-file, this opt-in is required (or set keys).
# --offline is the binary default: no GitVerse/HTTP fetch from this process.
ExecStart=/usr/bin/gigastt serve --offline --model-dir /var/lib/gigastt/models --bind-all --host 0.0.0.0 --allow-insecure-bind
Restart=on-failure
RestartSec=5

# Logging: by default systemd captures stdout/stderr in journald.
# Uncomment the two lines below to write logs to /var/log/gigastt/gigastt.log
# instead (requires the logrotate config in /etc/logrotate.d/gigastt).
# StandardOutput=append:/var/log/gigastt/gigastt.log
# StandardError=append:/var/log/gigastt/gigastt.log

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/gigastt/models /var/log/gigastt
LogsDirectory=gigastt
StateDirectory=gigastt
PrivateTmp=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
# The server binds a >1024 port and needs no capabilities.
CapabilityBoundingSet=
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
# No public Internet. Clients and optional in-contour webhooks stay on
# loopback / RFC1918. Add extra prefixes if the site uses other private nets.
IPAddressDeny=any
IPAddressAllow=localhost
IPAddressAllow=10.0.0.0/8
IPAddressAllow=172.16.0.0/12
IPAddressAllow=192.168.0.0/16

# Resource limits
LimitNOFILE=65536
# No core dumps: audio and transcripts must not land on disk via a crash.
LimitCORE=0

[Install]
WantedBy=multi-user.target

nginx

TLS и аутентификация живут на proxy: gigastt их не терминирует и слушает голый HTTP на loopback. В docs/deployment.md движка первым описан Caddy — он сам выпускает сертификат и апгрейдит WebSocket без лишних строк. Ниже nginx, потому что в контуре он обычно уже стоит.

Заголовок X-Forwarded-For перезаписывается адресом пира ($remote_addr), а не дополняется. Если прокси пропускает клиентский X-Forwarded-For как есть, per-IP лимитер ключуется на данных, которые контролирует клиент.

nginx
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

location / {
    proxy_pass http://127.0.0.1:9876;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 600s;
}

config.toml

Файл /etc/gigastt-pro/config.toml сервер подхватывает сам, если не передан флаг --config; флаги и переменные окружения перекрывают его значения. Лимитер и jobs в поставке выключены — включайте, когда они нужны.

/etc/gigastt-pro/config.toml
# GigaSTT Pro — system-wide runtime configuration.
# The server loads this file automatically when it exists at
# /etc/gigastt-pro/config.toml and no --config flag is given.
# CLI flags and environment variables override values from this file.

# WebSocket idle timeout in seconds. Connection is closed when no frame
# arrives within this window.
idle_timeout_secs = 300

# Maximum WebSocket frame / message size in bytes.
ws_frame_max_bytes = 524288

# Maximum REST request body size in bytes.
body_limit_bytes = 52428800

# Per-IP rate limit: requests per minute. 0 disables the limiter.
rate_limit_per_minute = 0

# Token-bucket burst size for the rate limiter.
rate_limit_burst = 10

# Maximum wall-clock duration of a single WebSocket session in seconds.
max_session_secs = 3600

# Grace window after shutdown signal during which in-flight sessions may
# emit Final frames.
shutdown_drain_secs = 10

# How long REST / WebSocket handlers wait for a free session triplet
# before returning 503.
pool_checkout_timeout_secs = 30

# Per-request inference timeout in seconds. 0 disables.
inference_timeout_secs = 600

# Enable the asynchronous /v1/jobs API.
jobs_enabled = false

# TTL in seconds for finished/failed/cancelled jobs before eviction.
jobs_ttl_secs = 3600

# Maximum number of jobs kept in memory.
jobs_max = 100

# Maximum retry attempts for a job that hits inference_timeout or panics.
jobs_retry = 3

Контейнер

Базовый образ — Astra Linux SE 1.7.5 или аналогичная российская ОС; публичных prebuilt-образов мы не публикуем. Веса в образ по умолчанию тоже не входят: подключите каталог модели volume’ом через --model-dir или соберите baked-вариант с --build-arg GIGASTT_BAKE_MODEL=1.

shell
podman build -t gigastt-pro .
podman run -p 127.0.0.1:9876:9876 gigastt-pro

Публикация -p 9876:9876 без адреса вывешивает порт на все интерфейсы хоста. В контуре указывайте 127.0.0.1 явно, как в примере выше.

На целевой машине нет сети — соберите бандл

Бинарник, веса и конфиг переносятся на носителе и проверяются по SHA256SUMS.