# Server configuration [server] port = 8080 shutdown_timeout = 5 force_shutdown_timeout = 20 # Хранилище: каталог данных и числа его базы. # # Каталог единственный: под ним лежат и файл базы, и подкаталог с файлами # записей. Двух путей у хранилища не бывает. [storage] data_dir = "data" # Сколько ждать занятую базу, миллисекунды. Положительное число. # # База принимает **одного** писателя: драйвер пишет единственным соединением, и # несколько воркеров, пришедших писать разом, встают в очередь. Это число — # сколько ждущий готов простоять, прежде чем получить отказ «база занята». # Крутят его при таком отказе под несколькими воркерами; ноль означает «отказать # сразу» и потому не принимается. busy_timeout_ms = 5000 # Сколько соединений держит читающий пул. Положительное число. # # Чтение идёт отдельно от записи: в журнале упреждающей записи читатели не # мешают писателю, и список записей не ждёт, пока конвейер сохранит свой шаг. # Число выводят из числа воркеров плюс запас под запросы приложения. # # Пишущее соединение при этом всегда одно и настройкой не делается: второе # означало бы отказы по занятости на записи результата шага, то есть после # оплаченной работы. read_connections = 4 # Конвейер расшифровки. [pipeline] # Число рабочих потоков. Специализации у них нет: каждый берёт любую пригодную к # работе запись и выбирает шаг по её рубежу. # # Ноль — законное значение, а не поломка: сервис поднимается, записи # принимаются и не двигаются. Годится местному запуску и выкладке, где конвейер # надо остановить, не роняя приём. workers = 3 # Предел простоя записи там, где работу делаем мы сами, в минутах. # # Сторож ловит **зависание**, а не долгую работу: пока шаг идёт, запись занята # захватом, и живой процесс наблюдается сам по себе. Час меньше времени, которое # многочасовая запись занимает на приведении, и это принято сознательно # (решение владельца 2026-08-14): цена ложной остановки — одно движение # владельца, потому что остановка обратима и рубежа не стирает. own_work_limit_minutes = 60 # Предел простоя там, где ждём операцию внешнего сервиса, в минутах. # # Сколько идёт распознавание долгой записи, никто не мерил, поэтому ошибаемся в # сторону долгого: ложная остановка хуже поздней. Откладывание опроса этот # отсчёт не двигает — иначе зависшая у провайдера операция опрашивалась бы # вечно. foreign_work_limit_minutes = 1440 # Yandex Cloud Configuration [yandex] # ID папки в Yandex Cloud (получить в консоли Yandex Cloud) folder_id = "your_folder_id_here" # API ключ для доступа к Yandex SpeechKit (получить в консоли Yandex Cloud) speech_kit_api_key = "your_speech_kit_api_key_here" # Object Storage (S3) configuration # Access Key ID для доступа к Object Storage (получить в консоли Yandex Cloud) object_storage_access_key_id = "your_access_key_id" # Secret Access Key для доступа к Object Storage (получить в консоли Yandex Cloud) object_storage_secret_access_key = "your_secret_access_key" # Имя бакета в Object Storage object_storage_bucket_name = "your_bucket_name" # Регион Object Storage object_storage_region = "ru-central1" # Endpoint Object Storage object_storage_endpoint = "https://storage.yandexcloud.net/" # Кому сервис верит на входе. # # Своего входа у сервиса нет: кто пришёл, называет обратный прокси заголовком # `Remote-User`, сходив к Authelia. Здесь остаётся один ключ — перечень адресов, # чьему заголовку верить. Пустой перечень роняет старт: он значит «не верить # никому», то есть сервис, поднявшийся никого не узнающим. [auth] # Адреса и подсети, с которых приходит обратный прокси. Сверяется адрес самого # соединения, а не пересылаемый заголовок: пересылаемым распоряжается тот, кто # шлёт запрос. # # **Перечень задаёт адрес прокси, а не весь частный диапазон.** Всякий, кто # дотянулся до сервиса с адреса из этого перечня, называет себя кем угодно и # получает чужой архив; `172.16.0.0/12` означало бы «любой контейнер на хосте», # включая чужие проекты. На сервере сюда ставят адрес сети, в которой стоит # Caddy, — узкий и свой. trusted_proxies = ["172.20.0.0/24"] # Локальный вход без Authelia. # # Прокси на машине разработчика нет, а браузер заголовков не ставит — значит # приложение локально не открылось бы вовсе. На место контура встаёт подставной # прокси из оснастки: он слушает свой порт, ставит заголовок и переправляет # запрос сервису. Проверок он не делает никаких — ни пароля, ни группы, ни # срока, — и это его назначение, а не упущение. # # go run ./cmd/devtools proxy # # Приложение после этого открывают по адресу прокси — http://localhost:9000, — # а не по адресу сервиса: запрос мимо прокси приходит без заголовка и никого не # узнаёт. # # Под него в перечне выше должен стоять петлевой адрес: # # trusted_proxies = ["127.0.0.1"] # # Второй вошедший получается другим значением `-user`: логин у провайдера и есть # ключ учётной записи. # # go run ./cmd/devtools proxy -user local-2 -name "Второй"