Версия клиента 2.17.1 для stable
Sub Video Manager: техническая документация
Единый справочник по desktop-клиенту, FastAPI, MongoDB, файлам проектов, синхронизации, YouTube, переводу, CapCut и эксплуатации сервера.
Назначение и границы системы
Sub Video Manager ведёт проекты субтитров от обнаружения YouTube-ролика до публикации: метаданные, исходные субтитры, перевод, таймкоды, проверка, оформление, CapCut draft, серверные файлы и итоговые ссылки.
Desktop-клиент — основная рабочая поверхность. API — канонический слой общих данных и файлов. Локальные каталоги остаются рабочей копией пользователя. Большие видео хранятся отдельно от файлового синка.
custom_. Название и тип меняются обычным обновлением; изменение ID выполняет администратор через отдельную saga с generation barrier и журналом.Архитектура
| Компонент | Ответственность | Данные |
|---|---|---|
| Desktop Web UI | Таблица проектов, карточка, фильтры, админские окна | Состояние интерфейса и команды bridge |
| Python desktop shell | Файлы, yt-dlp, CapCut, ffmpeg, синк, обновление | Локальные пути и рабочие файлы |
| API | Единая бизнес-модель, авторизация, координация клиентов | JSON, multipart, ZIP, streaming |
| MongoDB | Проекты, типы, аккаунты, сессии, jobs, manifest, логи | Документы и индексы |
| GridFS | Синхронизированные файлы, style examples, CapCut drafts | Версионируемые blobs |
| Video/media service | Видео отдельно от sync, подписанные скачивания и Range | MP4/MKV/WebM и метаданные ffprobe |
| Caddy | Прямой публичный HTTPS reverse proxy | API и media traffic |
Публичные адреса
- Основной API:
https://api.xn--90a5ag.space/neuro-subs-api. - Документация:
https://api.xn--90a5ag.space/about. - Media: отдельный домен из серверной настройки; ссылки подписаны и ограничены по времени.
Клиент использует единый production API. Публичный HTTPS завершается в Caddy, который передаёт запросы на локальный порт API.
Авторизация и права
После POST /auth/login клиент хранит случайный bearer token. На защищённых запросах передаётся Authorization: Bearer <token> и версия клиента в X-Neuro-Subs-Client-Version.
POST /neuro-subs-api/auth/login
Content-Type: application/json
{"login":"user","password":"…","device_id":"windows-host","client_version":"2.3.0"}
| Роль | Разрешено | Ограничения |
|---|---|---|
user | Чтение/редактирование проектов, обычные файлы, персональные настройки, CapCut binding | Нет аккаунтов, глобальных правил типов, destructive admin actions, GPT и серверных video controls |
admin | Все user-функции, аккаунты, типы, статусы, удаление, rollback, серверные видео, перевод и диагностика | Операции всё равно проходят проверки revision, путей и размера |
CapCut-привязка хранится отдельно для каждого логина. API не должен возвращать пользователю имена drafts других пользователей.
Тема интерфейса хранится только локально по нормализованному логину и версии схемы: тёмная, светлая или системная, восемь пресетов и собственный accent. Она не синхронизируется через account preferences; контрастный цвет текста вычисляется для каждого accent.
Модель проекта
| Поле | Тип | Смысл |
|---|---|---|
id | string | Неизменяемый YouTube ID или custom_…. |
name | string | Редактируемое рабочее название; не меняет уже созданную локальную папку. |
local_folder_name | string | Зафиксированный slug локальной папки, созданный из первоначального названия. |
content_type | string | Логическая серия/тип; определяет локальную папку и фильтр. |
youtube_url | string | Канонический источник видео. Для custom может быть пустым. |
is_custom_project | boolean | Проект создан вручную и не обязан иметь YouTube ID. |
project_status | string | Рабочий итоговый статус: в работе, готов, опубликован, не публикуем. |
checkpoints | object | Набор булевых этапов workflow. |
comment | string | Рабочие заметки, до 20 000 символов. |
published_meta | object | Заголовок и URL публикаций YouTube/VK. |
original_publish_date | UTC datetime | Точный момент публикации исходного ролика в BSON UTC; API отдаёт RFC 3339 с Z. Для legacy-значений precision равен date_only. |
our_publish_date | UTC datetime | Точный момент публикации командой в BSON UTC; значение обновляет только серверная синхронизация. |
interview_source | string | Источник интервью; используется только для типа «Интервью». |
interview_members | string[] | Участники интервью. |
capcut_project_names | object | Персональные привязки логин → локальный CapCut draft. |
capcut_draft_on_server | boolean | Вычисляемый флаг наличия серверного draft. |
video_download_* | number/string | Ширина, высота, resolution, codec скачанного видео. |
date_added, updated_at | datetime | Аудит создания и последнего изменения. |
Дата
Интерфейс принимает 24.12.2023, 2023-12-24, 24 дек 2023 и 24 дек. 2023 г.. В хранилище записывается 2023-12-24. Невалидная дата не должна тихо затирать существующее значение.
Типы контента
Типы не хранятся отдельным фиксированным списком. Канонический источник — коллекция content_type_rules: каждая запись связывает ключевую фразу заголовка с типом. Список типов выводится из уникальных значений правил и уже существующих проектов.
- Заголовок нормализуется.
- Проверяются правила keyword → content type.
- При нескольких совпадениях побеждает более длинный keyword; затем более специфичный тип; затем более раннее правило.
- Если совпадений нет, пользователь выбирает существующий тип или создаёт новое правило.
- Выбранный тип записывается в проект и определяет локальную папку.
projects/<project_id>/, поэтому смена типа не должна создавать второй серверный проект.Все годовые варианты STAYweeK канонизируются в единый тип STAYweeK. STAYweek 2024, STAYweek 2025 и аналогичные папки считаются legacy.
Для интервью используются дополнительные поля источника и участников. Двуязычная очистка заголовка включается только у серий, где корейская и английская части систематически дублируют друг друга; произвольные скобки удалять нельзя.
Чекпойнты и статусы
| Ключ | Название | Как устанавливается |
|---|---|---|
video_source_loaded | Ссылка на видео загружена | Автоматически по валидному YouTube ID/URL. |
regular_subtitles | Есть обычные сабы | Автоматически по ручному SRT; auto captions не включают. |
auto_translated | Перевод выполнен | Автоматически по непустому translated text. |
timestamps_set | Нарезаны таймкоды | Автоматически по new_timestamps. |
translated_with_eng_checked | Текст проверен | Вручную. |
subtitles_tracks_set | Оформа расставлена | Вручную после раскладки по дорожкам. |
formatting_corrected | Оформа откорректирована | Вручную; переводит проект на финальную проверку. |
published | Видео опубликовано | Связан с итоговым статусом. |
ready | Готов | Legacy-флаг для старых клиентов. |
do_not_publish | Не публикуем | Взаимоисключающий с published. |
published=true автоматически покрывает предыдущие обязательные этапы. Legacy stage мигрируется в checkpoints и больше не является источником истины.
Файлы и каталоги
Два представления одного проекта
- Локально:
<content_type>/<unicode-safe-project-slug>/— удобно человеку и CapCut. - На сервере sync:
projects/<project_id>/— стабильно при переименовании или смене типа. - Видео на сервере: отдельное video storage по типу/названию; оно не входит в обычный sync manifest.
| Префикс файла | Формат | Назначение |
|---|---|---|
subtitles[_eng|_kor]_… | SRT | Исходные ручные субтитры. |
original_text[_eng|_kor]_… | TXT | Текст, извлечённый из SRT. |
translated_text[_eng|_kor]_… | TXT | Перевод с сохранением блоков. |
translated_with_eng_… | TXT | Перевод рядом с оригиналом для проверки. |
new_timestamps_… | SRT | Новая нарезка таймкодов. |
translated_timestamps_… | SRT | Перевод, наложенный на таймкоды. |
final_subtitles[_eng|_kor|_ru]_… | SRT | Финальные субтитры. |
translation_progress… | LOG/JSON/TXT | Состояние возобновляемого перевода. |
translation_summary… | TXT | Контекст и итог перевода. |
thumbnail_<project_id>.png | PNG | Каноническое превью; имя привязано к ID. |
<project_id> | пустой файл | Скрытый маркер принадлежности локальной папки; на сервере лежит по тому же ID-пути. |
draft_content.json | JSON | Переносимый CapCut draft. |
Видео, .part, временные файлы, lock-файлы, cache, review frames и published output исключены из обычного sync. Это предотвращает тяжёлые случайные загрузки и конфликт рабочих артефактов.
Синхронизация
Синк сравнивает SHA-256, размер, mtime и серверную revision. Современная схема путей — project-id-v1. Клиент отображает серверный namespace через локальный mapping и никогда не должен хешировать исчезнувший файл без повторной проверки существования.
| Политика | Файлы | Поведение |
|---|---|---|
bidirectional | TXT, SRT и обычные project artifacts | Стороны сравниваются; новая revision переносится с журналом изменения. |
server_authoritative | draft_content.json, PNG | Обычный пользователь не перезаписывает существующую серверную версию через mtime merge. |
excluded | Видео, temp, cache, review output | Не входит в manifest и не загружается. |
Цикл синка
- Клиент сканирует локальный manifest и сопоставляет папки с project IDs.
POST /sync/manifest/diffвозвращает upload/download/delete decisions и server cursor.- Мелкие наборы передаются batch ZIP. Большие файлы используют start → chunks → complete.
- Каждая запись проверяется по path policy, размеру, SHA-256 и expected server revision.
- Перед destructive изменением сервер создаёт backup; администратор может выполнить rollback.
- Локальная state-база сохраняет последний server cursor и revisions.
Конфликт
Если обе стороны изменились после последней общей revision, клиент не должен молча выбирать файл. Для server-authoritative файлов требуется явное действие. Для текста показывается сводка изменённых блоков/таймкодов.
Справочник API
Ниже — назначение всех production routes. Точные request/response schemas и возможность выполнить запрос находятся в Swagger UI; контракт для генераторов клиентов — в OpenAPI JSON. Предпочтительный base path: /neuro-subs-api.
Состояние и релизы
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| GET | /health | public | Минимальный API + MongoDB ping. |
| GET | /health/live | public | Liveness процесса без обращения к MongoDB и файловым хранилищам. |
| GET | /health/ready | public | Readiness: MongoDB, release/shared/video storage, версия и uptime. Возвращает 503 при деградации обязательных зависимостей. |
| GET | /version | public | Текущая версия API/desktop release. |
| GET | /client/releases/latest | public | Latest manifest по platform/channel. |
| GET | /client/releases | public | Список доступных versioned manifests для локального переключателя администратора. |
| GET | /client/releases/latest/download | public | Постоянная ссылка на последнюю сборку. |
| GET | /client/releases/{version}/manifest | public | Manifest конкретной версии. |
| GET | /client/releases/{version}/download | public | Архив конкретной версии. |
| GET | /client/bootstrap/windows/download | public | Bootstrap installer Windows. |
Авторизация и аккаунты
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| POST | /auth/login | public | Проверка пароля, создание session token, запись версии клиента. |
| POST | /auth/logout | user | Отзыв текущей сессии. |
| GET | /auth/me | user | Текущий аккаунт и роль. |
| GET | /auth/preferences | user | Серверные UI preferences аккаунта. |
| PUT | /auth/preferences | user | Полная замена UI preferences. |
| PUT | /auth/timezone | user | IANA-часовой пояс для вычисления локальных дедлайнов. |
| GET | /admin/accounts | admin | Список аккаунтов. |
| POST | /admin/accounts | admin | Создание аккаунта. |
| PATCH | /admin/accounts/{login} | admin | Роль, display name, активность. |
| POST | /admin/accounts/{login}/reset-password | admin | Новый PBKDF2 password hash. |
| GET | /admin/system/status | admin | Подробная диагностика конфигурации, хранилищ и record counts без значений секретов. |
| POST | /admin/workers/catch-up | admin | Безопасный повтор materialization и обработки ожидающих заданий. |
| GET | /admin/workers/health | admin | Состояние deadline, review lease и project maintenance workers без токенов и секретов. |
| GET | /admin/timing-analysis/outside-video | admin | Список проектов с субтитрами за пределами исходного видео. |
Проекты, типы и project assets
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| GET | /projects | user | Все проекты словарём ID → project. |
| POST | /projects/list-diff | user | Версии известных карточек → изменённые проекты, новые версии и deleted_ids. Учитывает drafts, дедлайны и права пользователя; первый запрос без версий возвращает полный список. |
| GET | /projects/{project_id} | user | Один проект. |
| GET | /projects/{project_id}/editor-state/{kind} | user | Актуальная серверная ревизия проекта нарезки или оформления. |
| PUT | /projects/{project_id}/editor-state/{kind} | user | Merge изменённых субтитров и связанных полей с optimistic revision. |
| POST | /projects/{project_id}/rooms/{kind}/{action} | user | Временное присутствие и отдельная постоянная история сообщений для нарезки и оформы. Опрос принимает курсор истории. |
| PUT | /projects/{project_id} | user | Upsert проекта с безопасным merge персонального CapCut binding. |
| PUT | /projects/{project_id}/performers | user/admin | Добавить или убрать себя из исполнителей проекта; администратор может изменить любого активного пользователя. |
| PUT | /projects/{project_id}/priority-pin | user/admin | Общий закреп для всех участников. JSON: {"pinned": true/false}; старые снимки проектов не меняют закреп. |
| DELETE | /projects/{project_id} | admin | Удаление проекта и связанных серверных сущностей по правилам endpoint. |
| POST | /projects/{old_id}/re-id/{new_id} | user | Идемпотентная смена ID проекта с переносом связанных серверных ссылок. |
| POST | /projects/bulk-upsert | user/admin | Массовый merge доступен user; опасный replace_all=true — только admin. |
| GET | /projects/{project_id}/work | user | Ревизия распределения, занятые/свободные интервалы, дедлайн и статусы. |
| GET | /work/users | user | Безопасный список активных исполнителей для выбора получателя; служебные поля не возвращаются. |
| POST | /projects/{project_id}/work/preview | user | Нормализация интервала и предварительная проверка конфликта. |
| POST | /projects/{project_id}/work/take | user | Взять свободный интервал или весь проект с optimistic revision. |
| POST | /projects/{project_id}/work/assign | admin | Назначить исполнителя на нормализованный интервал. |
| POST | /projects/{project_id}/work/assign-batch | admin | Атомарно зарезервировать несколько интервалов разным исполнителям. |
| POST | /projects/{project_id}/work/offers | user | Создать предложение передачи работы. |
| POST | /projects/{project_id}/work/offers/{offer_id}/respond | user | Принять или отклонить предложение с CAS-проверкой; границы и необязательный дедлайн задаются в самом ответе. |
| POST | /projects/{project_id}/work/segments/{segment_id}/action | user/admin | Статус сегмента, проверка, перенос, resize и дедлайн по матрице ролей. |
| POST | /projects/{project_id}/publication-times/{source}/sync | user | Серверная синхронизация точного UTC-времени YouTube/VK или legacy date-only fallback. |
| GET | /projects/{project_id}/work/segments/{segment_id}/capcut | assignee/reviewer/admin | Получить фрагмент канонического GridFS draft, кусочные текстовые файлы, границы и ревизии для локальной работы или проверки. |
| PUT | /projects/{project_id}/work/segments/{segment_id}/capcut | assignee/reviewer/admin | Загрузить интервальный CapCut merge и кусочные файлы; каноническая версия обновляется через revision/CAS, а конфликтующие границы отмечаются для администратора. |
| GET | /projects/{project_id}/timing-analysis | user | Результат фонового анализа английской дорожки. |
| GET | /decoration/catalog | user | Общие стили, плоские наборы и история использования; порядок отображения хранится локально. |
| PUT | /decoration/catalog | user | Сохранение изменений относительно base с атомарным объединением; конфликт одного поля возвращает 409. |
| GET | /projects/{id}/style-example/meta | user | Revision и метаданные style example. |
| PUT | /projects/{id}/style-example | user | Загрузка переносимого style example. |
| GET | /projects/{id}/style-example | user | Скачивание style example. |
| GET | /projects/{id}/capcut-draft/meta | user | Revision серверного CapCut draft. |
| PUT | /projects/{id}/capcut-draft | user | Загрузка подготовленного draft ZIP/JSON с optimistic revision. |
| GET | /projects/{id}/capcut-draft | user | Скачивание серверного draft. |
| POST | /projects/{id}/capcut-decoration/prepare | user | Проверка нового локального драфта и слияние изменённых полей с оформой без записи нативной базы; конфликт возвращает 409. |
| POST | /projects/{id}/capcut-decoration/error | user | Подробная ошибка клиента и исходник в отдельном архиве ошибок CapCut. |
| GET | /content-type-rules | user | Keyword → type rules. |
| POST | /content-type-rules | user | Upsert одного правила при создании/классификации проекта. |
| PUT | /content-type-rules | admin | Полная атомарная замена набора правил. |
| GET | /shared-assets/draft-marker/{asset} | user | Разрешённые общие marker assets. |
| GET | /shared-assets/fonts/manifest | user | Manifest шрифтов SKZ District для фоновой установки клиентом. |
| GET | /shared-assets/fonts/{asset} | user | Скачивание разрешённого файла шрифта из manifest. |
Дедлайн назначения необязателен. Обычный пользователь резервирует свободную работу только себе; администратор может одним действием зарезервировать несколько непересекающихся кусков разным исполнителям. Проверка и суточное взятие исправлений сохраняют версии отдельно, а уведомления о свободном остатке существуют только внутри приложения и исчезают, когда остаток занят.
Уведомления
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| GET | /notifications | user | Личные in-app уведомления с контекстом проекта, предложения и сегмента для действий по свежей ревизии. |
| POST | /notifications/read | user | Идемпотентно отметить выбранные уведомления прочитанными. |
Перевод и метрики
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| GET | /translate/models | admin | Разрешённые модели и цены. |
| POST | /translate/text | admin | Синхронный line-preserving перевод. |
| POST | /translate/jobs | admin | Создание resumable translation job с deduplication. |
| GET | /translate/jobs/{job_id} | admin | Статус job. |
| GET | /translate/jobs/{job_id}/result | admin | Результат, summaries и token usage. |
| POST | /metrics/translation/{project_id} | user | Агрегированная стоимость и usage перевода. |
| POST | /metrics/draft-check/{project_id} | user | Метрика проверки draft. |
Синхронизация файлов
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| POST | /sync/manifest/diff | user | Сравнение manifest и server cursor. |
| POST | /sync/files/move-prefix | user | Безопасная миграция legacy prefix. |
| GET | /sync/files/meta | user | SHA, size, revision, policy одного файла. |
| GET | /sync/files/download | user | Скачивание одного blob. |
| POST | /sync/batches/download | user | ZIP до 100 файлов с внутренним manifest. |
| POST | /sync/batches/upload | user | Пакетная загрузка с проверками policy/revision. |
| POST | /sync/uploads/start | user | Начало chunked upload. |
| PUT | /sync/uploads/{id}/chunks/{index} | user | Идемпотентная загрузка chunk. |
| POST | /sync/uploads/{id}/complete | user | Сборка, SHA-256 verification, backup и commit. |
| GET | /admin/sync/backups | admin | Список откатов. |
| GET | /admin/sync/backups/{id} | admin | Сравнение откатной и текущей версии. |
| POST | /admin/sync/backups/{id}/rollback | admin | Восстановление backup. |
| POST | /admin/sync/backups/{id}/discard | admin | Ревизионное удаление ненужного отката. |
Видео, логи и YouTube jobs
| Метод | Путь | Доступ | Назначение |
|---|---|---|---|
| POST | /video/prepare | user | Получение server-assisted URL/метаданных. |
| POST | /video/download | user | API fallback для скачивания серверной H.264/AAC-копии. |
| POST | /video/upload | user | Загрузка локального видео проекта на сервер. |
| POST | /video/uploads/start | user | Начало порционной загрузки большого локального видео. |
| PUT | /video/uploads/{upload_id}/chunks/{chunk_index} | user | Передача одной проверяемой части видео. |
| POST | /video/uploads/{upload_id}/complete | user | Проверка SHA-256, атомарная сборка и публикация видео. |
| GET | /video/project | user | Наличие, resolution/codec и подписанная download link. |
| GET | /admin/videos | admin | Все серверные видео и disk usage. |
| POST | /admin/videos/delete | admin | Удаление выбранных/старых видео. |
| GET | /admin/projects/{id}/server-files | admin | Sync, CapCut и video files одного проекта. |
| POST | /admin/projects/{id}/server-files/delete | admin | Удаление одного server file с revision guard. |
| GET | /admin/logs | admin | Server sync/job logs. |
| GET | /admin/capcut-import-errors | admin | Ошибки импорта и неподдерживаемые визуальные параметры с подробной диагностикой. |
| GET | /admin/capcut-import-errors/{error_id}/original | admin | Сохранённый исходник для разбора ошибки. |
| POST | /admin/logs/clear | admin | Очистка по типу, теме и возрасту. |
| POST | /logs/app/upload | user | Пакет клиентских log entries с deduplication. |
| GET | /admin/app-logs | admin | Клиентские логи по пользователю/run. |
| POST | /jobs/youtube-sync/try-lock | user | Распределённый lease для единственного sync worker. |
| POST | /jobs/youtube-sync/finish | user | Успешное завершение run с details. |
| POST | /jobs/youtube-sync/fail | user | Ошибка run и release lease. |
| GET | /admin/youtube-sync/runs | admin | История запусков. |
| POST | /admin/youtube-sync/runs/clear | admin | Очистка старой истории. |
| GET | /admin/youtube-sync/pending | admin | Ролики без определённого типа. |
| POST | /admin/youtube-sync/pending/{id}/resolve | admin | Создать проект с выбранным типом. |
| POST | /admin/youtube-sync/pending/{id}/dismiss | admin | Исключить pending item. |
YouTube и серверные видео
Периодический sync использует distributed lock, чтобы несколько desktop-клиентов не создавали дубли. Новые entries классифицируются по rules. Неопределённые попадают в pending queue и требуют выбора типа.
- Локальная загрузка сначала использует bundled
yt-dlp; сервер — fallback. - Сервер выбирает MP4 H.264 + M4A AAC, совместимые с Windows и CapCut; AV1 намеренно не является приоритетом.
ffprobeсохраняет width, height,resolution, codec и duration. «Неизвестно» означает отсутствие ffprobe или невозможность прочитать stream, а не неизвестное качество YouTube.- Превью называется
thumbnail_<project_id>.png, чтобы старый файл с похожим заголовком не приклеился к новому ролику. - Media download поддерживает HTTP Range и выдаётся по HMAC-ссылке с expiry.
Перевод и субтитры
- Получить ручной SRT. Auto captions используются только по явному выбору.
- Извлечь непустые блоки в
original_text. - Перевести line-preserving job: число строк на выходе обязано совпасть.
- Записать
translated_text, running summary и usage. - Создать
translated_with_engдля ручной проверки. - Нарезать
new_timestampsи собрать final SRT. - Импортировать в CapCut, расставить дорожки, проверить оформление.
Сервер принимает не более 5 000 строк и 2 000 000 символов за запрос. Пустая модельная строка для непустого источника, расхождение числа строк и нулевое число OpenAI requests считаются ошибкой. API key хранится только на сервере.
Разрешённые модели: gpt-5.4-mini, gpt-5.6-luna, gpt-5.6-terra, gpt-5.6-sol. Фактический список всегда проверяется через GET /translate/models.
CapCut drafts и оформление
Сервер хранит переносимую копию draft, а не абсолютные локальные пути. Перед загрузкой Python bridge нормализует структуру и прикладывает необходимые assets. Метаданные revision позволяют выбрать направление копирования без случайной перезаписи.
- Локальное имя CapCut draft персонально для аккаунта.
- Первичное создание локальной основы не загружает её автоматически; upload — отдельное явное действие.
- Фиолетовая кнопка загружает текущий draft на сервер после подготовки.
- Статус синхронизации использует визуальный хэш субтитров: текст, тайминги, положение, видимость, оформление и анимации учитываются, а видео, аудиоанализ, версия CapCut и служебные метаданные открытия игнорируются.
- Статус отдельно различает проекты только на сервере и реальные расхождения между существующими локальной и серверной копиями.
- Style example — короткий переносимый фрагмент оформления, отдельный от полного draft.
- При совпадении первой текстовой дорожки с
new_timestampsудаляется только эта служебная дорожка; остальные не затрагиваются. - Изменение скобок обновляет root, backup, template и актуальные timeline copies согласованно.
Сервер, Docker и релизы
Production services
| Сервис | Назначение | Restart policy |
|---|---|---|
neuro-subs-api | FastAPI на loopback origin. | unless-stopped |
neuro-subs-server-mongo | MongoDB 4.4 для CPU без AVX. | unless-stopped |
neuro-subs-pot-provider | PO token provider для yt-dlp. | unless-stopped |
neuro-subs-media | Подписанная video delivery с Range. | unless-stopped |
Caddy | Прямой публичный HTTPS reverse proxy. | systemd auto-restart |
Проверка после deploy
# На сервере
curl -fsS http://127.0.0.1:4183/neuro-subs-api/health/ready
docker compose -f docker-compose.server.yml ps
systemctl is-active caddy
# Снаружи
curl -fsS https://api.xn--90a5ag.space/neuro-subs-api/health/ready
Релиз Windows строится, публикует versioned ZIP, latest manifest и bootstrap archive. Клиент сверяет SHA-256 перед атомарной заменой. Версия 2.9.4 допускает удаление CapCut-драфта с копией общей метки только после проверки её байтов; чужие локальные вложения по-прежнему защищены.
Диагностика и восстановление
Новые технические ручки
GET /health/live— liveness процесса без внешних зависимостей. Если не отвечает, проблема в контейнере, процессе или HTTP-маршруте.GET /health/ready— безопасная публичная readiness: версия, uptime, MongoDB latency и доступность storage. Секреты и connection strings не возвращаются.GET /admin/system/status— расширенный admin status: readiness, флаги конфигурации, каталоги и приблизительные counts ключевых коллекций. Значения токенов/ключей не возвращаются.
| Симптом | Проверка | Вывод |
|---|---|---|
| API и media одновременно недоступны | Локальный readiness на сервере | Если ready — проверить Caddy, проброс 80/443 и внешний канал; если нет — API/Mongo/storage. |
| Один домен лежит, второй работает | DNS-запись и конфигурация Caddy | Origin жив; проблема конкретного hostname или локального сервиса. |
| SSH работает, HTTP нет | docker compose ps, локальный curl | Контейнер не поднят или порт не слушает. |
| Readiness 503, database=false | Mongo container и его logs | API процесс жив, MongoDB недоступна. |
| Readiness 503, video_storage=false | Mount, permissions, free disk | Рабочее video storage недоступно для записи. |
| API работает, вход не работает | /health, затем account active/session logs | Публичный маршрут исправен; проблема auth/account/Mongo data. |
| Синк падает на No such file | Клиентский app log и local manifest rescan | Файл исчез между scan и hash; повторный sync не должен удалять серверную копию. |
| Неправильные сабы/preview | Project ID, canonical server prefix и thumbnail filename | Искать legacy title-based collision или неверную миграцию. |
| Разрешение неизвестно | ffprobe и video metadata | Файл есть, но stream metadata не извлечена. |
Порядок при аварии
- Проверить публичный readiness URL.
- Если он недоступен — SSH/Tailscale/LAN и локальный readiness origin.
- Если origin ready — проверить
Caddy, проброс портов 80/443 и DNS сервера. - Если origin degraded — смотреть конкретный failed check; не перезапускать всё вслепую.
- После восстановления проверить login, project list, manifest diff и media health.
- Только затем запускать sync или deploy.
Безопасность и целостность
- Пароли: PBKDF2-SHA256 с индивидуальной случайной солью и 210 000 итераций.
- Session tokens хранятся в виде SHA-256 hash; исходный token показывается только при создании.
- Admin actions проверяют роль на сервере, а не только скрываются в UI.
- Пути нормализуются и не могут выйти через
..за разрешённый root. - Uploads ограничены по размеру, chunk index, SHA-256 и expected revision.
- Media links подписаны HMAC, имеют expiry и не кэшируются публично.
- API не возвращает Mongo URI, OpenAI key, media signing secret или Telegram token.
- Публичная диагностика содержит только безопасные boolean/latency/size данные.
.env.Частые вопросы
Где канонически лежат файлы проекта?
На сервере — projects/<project_id>/. Локально — человекочитаемая папка типа и slug. Mapping связывает их; название не является идентификатором.
Почему после смены типа нельзя просто переместить серверную папку?
Серверный namespace уже привязан к ID и не зависит от типа. Меняется локальный mapping. Перемещение title-based legacy prefix требуется только при миграции старой схемы.
Почему видео не синхронизируется вместе с SRT/TXT?
Видео тяжёлое и имеет другой lifecycle. Оно хранится в отдельном video service, скачивается/удаляется явными действиями и не участвует в manifest diff.
Что является источником списка типов?
Уникальные content_type из content_type_rules плюс существующие проекты. Отдельная legacy-коллекция типов больше не является источником записи.
Что делать, если оба домена недоступны?
Проверить origin readiness через SSH. Ready origin означает проблему Caddy, проброса 80/443 или внешнего канала; degraded JSON сразу показывает MongoDB или storage.
Можно ли безопасно повторить sync после обрыва?
Да. Batch и chunked flows проверяют hashes/revisions; upload completion идемпотентен в рамках upload ID. При конфликте нужна явная развязка.
Где смотреть точный JSON конкретной ручки?
В Swagger UI или OpenAPI JSON. Эта страница объясняет семантику и эксплуатационные правила.
История ключевых релизов
| Версия | Основные изменения |
|---|---|
2.17.1 | Жест масштаба сохраняет существующие ключи вращения и прозрачности. |
2.17.0 | Кнопка общего закрепа у проекта. Ключевые моменты вращения, прозрачности и кривые перехода в предпросмотре, видео и CapCut. |
2.16.1 | Ускорены частые правки оформы с сохранением всех записей восстановления; Undo/Redo сохраняет свежие поля коллег. Объединены уведомления и повторные чтения, защищена замена видео с резервными копиями. Оформа открывается из шапки, экспорт показывает локальную цель CapCut. |
2.16.0 | 67 редактируемых горячих клавиш, сочетания с колесом, пресеты «Оформа»/«CapCut», живые модификаторы и английские физические клавиши. J/K/L, скорость и громкость просмотра. |
2.15.1 | Нативный журнал восстановления и безопасное закрытие, ограниченный DOM больших очередей, целостность синхронизации и переводов, upload/ZIP/BSON limits, новый observed-epoch wire и надёжная публикация обновлений. Данные и резервные копии сохранены; maintenance остаётся observe. |
2.15.0 | Анимации и экспорт оформы, полноэкранный режим и восстановление правок; ленивое открытие редакторов, меньше фоновых запросов, неблокирующие загрузки и защита записей по поколению проекта. |
2.14.0 | Импорт CapCut в общий проект оформы, стили по дорожкам и примерам, просмотр выбранных нативных анимаций и слияние изменённых полей при обновлении проекта с резервными копиями и архивом ошибок. |
2.13.0 | Ключевые кадры масштаба с экспортом в CapCut, точность покадрового просмотра и проверка идентичности видео при получении автоматических таймкодов. |
2.12.2 | Локальный кеш списка проектов, получение изменённых карточек и удалений, ограничение повторных обновлений при фокусе, пакетная проверка актуальности синхронизируемых файлов и ускорение общих редакторов. |
2.12.1 | Продолжение оборванных загрузок, использование готового серверного видео, кеш проверок неизменившихся файлов и индексированные пакетные запросы хранилища. |
2.12.0 | Серверная история чата нарезки и оформы, постоянные цвета участников и устойчивое первое параллельное сохранение. |
2.11.7 | Общий состав стилей проекта оформы и восстановление пресетов из назначений клавиатуры. |
2.11.6 | Совместные бегунки и выбор сабов, уведомления чата, синхронизация изменений по полям и защита сохранения оформы. |
2.11.5 | Основной стиль для рабочего «а»; выгрузка таймкодов только после полной нарезки без расхождений; исправления очереди анализа новых видео. |
2.11.4 | Исправлен перенос назначенных стилей и повторный экспорт оформы в CapCut; добавлены подсветка привязки к бегунку и переключение направления прокрутки. |
2.11.3 | Исправлен цикл обновлений при изменении масштаба видеоплеера в редакторе оформы. |
2.11.2 | Исправлены присутствие и отправка сообщений в чате проекта; опрос комнаты передаёт только версию редактора. |
2.11.1 | Исправлены список реплик, выбор субтитра и отображение ключевых моментов на узких сабах. |
2.11.0 | Параллельная синхронизация нарезки и оформы, присутствие пользователей и временный чат проекта с обновлением каждые три секунды. Автоматическая установка общего набора шрифтов SKZ District. |
2.12.0 | Persistent timing and decoration chats, fixed collaborator colors, and safe concurrent first saves. |
2.11.7 | Shared decoration project style membership and preset recovery from keyboard assignments. |
2.11.6 | Collaborative playheads and selections, chat notifications, field-level delta sync, and resilient decoration saves. |
2.11.5 | Main style for working timing captions; timestamp export only after a complete, error-free cut; fixes for the new-video analysis queue. |
2.11.4 | Fixed assigned-style transfer and repeated CapCut decoration export; added playhead snap highlighting and immediate scroll-axis switching. |
2.11.3 | Fixed an update loop while zooming the decoration editor player. |
2.11.2 | Fixed project chat presence and message delivery; room polling now returns only the editor revision. |
2.11.1 | Fixed the cue list, subtitle selection and keyframe markers on narrow clips. |
2.11.0 | Collaborative timing and decoration sync, live presence and ephemeral project chat with three-second refresh. Automatic installation of the shared SKZ District font set. |
2.10.8 | Оформление выделенных фрагментов текста и групповая правка сабов; ключевые моменты расположения в нарезке и оформлении с экспортом CapCut. Обычный замок английской дорожки, редактирование скрытых сабов, исправленные межстрочные интервалы и один шаг отмены для ползунков. |
2.10.7 | Исправленная высота букв в предпросмотре и подстановка отсутствующих символов, редактируемые английские сабы, возврат к субтитру из стилей, приоритет клика по сабу и заметные края обрезки. Расширенные логи ошибок редактора. |
2.10.6 | Повторное автосохранение при блокировке Windows, исправленные дорожки и настройки прокрутки, скрытая английская дорожка, направляющие в нарезке и редактирование стилей через пример. |
2.10.5 | Предпросмотр стилей с фоном, перетаскивание клавиш, независимые трансформации примера в нарезке и автопрокрутка таймлайна при перетаскивании бегунка к краю. |
2.10.4 | Stable от 17 сентября 2026: первый кадр без клика, восстановление позиции и масштаба для пользователя и проекта без выделения субтитра; однострочная высота −1010. |
2.10.3 | Stable от 17 сентября 2026: допустимые размеры таймлайна, управление внизу плеера, исправленные переносы и автоматическая позиция основной речи по числу строк. |
2.10.2 | Stable от 17 сентября 2026: синхронизация оставляет неизвестные локальные файлы на месте; автоматическое восстановление из мусорки убрано. |
2.10.1 | Stable от 17 сентября 2026: защита назначений от фоновой очистки, восстановление из мусорки, общий инспектор оформления в нарезке и исправленная клавиатура стилей. |
2.10.0 | Stable от 17 сентября 2026: редактор оформления, проектные наборы стилей и переход из выгрузки таймкодов. |
2.9.4 | Stable от 14 сентября 2026: известная копия общей метки не мешает безопасному удалению локального CapCut-драфта после переноса нарезки. |
2.9.3 | Stable от 14 сентября 2026: статус «В процессе» начинается с нарезки во встроенном редакторе или выгрузки таймкодов; при загрузке неизвестного размера показывается движение без ложного процента. |
2.9.2 | Stable от 9 сентября 2026: более частое получение прогресса фоновых операций и плавное заполнение кнопок без крупных визуальных скачков. |
2.9.1 | Stable от 9 сентября 2026: фактический прогресс фоновых действий и автоматического скачивания видео перед открытием проекта нарезки, подробности проектов при синхронизации CapCut. |
2.9.0 | Stable от 8 сентября 2026: согласованный визуальный анализ обычных, цветных, плавающих и смешанных подписей, региональные поправки, возобновляемая серверная обработка и прямой HTTPS через Caddy без legacy fallback. |
2.8.2 | Stable от 1 сентября 2026: перенос внешних медиа и сборных клипов в серверных драфтах, исключение повторно используемых превью и концовок, правильные таймкоды английской дорожки после final-интеграции. |
2.8.1 | Stable от 1 сентября 2026: соседние кадры, двухкадровая расстановка и сворачиваемые атрибуты в редакторе нарезки; надёжная проверка превью и защищённое от повторного запуска удаление локального видео. |
2.8.0 | Stable от 31 августа 2026: фоновый анализ кадров готовит английскую направляющую проекта нарезки, не меняя исходный SRT и длинный саб; также исправлены повторная final-интеграция и приоритет свежих локальных SRT при синхронизации. |
2.7.4 | Stable от 30 августа 2026: открытие и закрытие неизменённого CapCut-проекта больше не создаёт ложную рассинхронизацию после служебного расширения схемы и привязки исходных сабов к кадровой сетке. |
2.7.3 | Stable от 29 августа 2026: честный единый прогресс загрузки видео, развёрнутое окно нарезки, процент готовности встроенной нарезки, возврат прямой покадровой навигации и корректная сортировка проекта после интеграции субтитров. |
2.7.2 | Stable от 29 августа 2026: все решения конфликтов CapCut до пакетной передачи, нарезка для всех аккаунтов со скрытой кнопкой, сохранение личной конфигурации редактора, быстрый кэш соседних кадров и стыков. |
2.7.1 | Stable от 28 августа 2026: готовность локального видео и таймкодов без ожидания сервера, сохраняемая фоновая очередь, кеш параметров видео и приоритет готового кадра. Также включает исправления beta.1–beta.6; в этой версии доступ к нарезке был у alkis. |
2.7.0 | Stable-релиз от 27 августа 2026 года: независимые проекты нарезки для всех полных проектов alkis, повторная выгрузка рабочей дорожки и создание CapCut-проекта при интеграции финальных сабов. Для остальных пользователей сохранён прежний workflow. |
2.6.0 | Stable-релиз от 26 августа 2026 года: редактор нарезки таймкодов в менеджере, отдельные sidecar-данные и закрытый канал технических сборок. |
2.5.0 | Stable-релиз от 24 августа 2026 года: полноценное распределение по кускам, необязательные дедлайны, версионированная проверка, кусочная синхронизация и подготовка CapCut-проекта к публикации. |
2.4.7 | Stable-релиз от 23 августа 2026 года: постоянный слепок CapCut-проектов, быстрый поиск рассинхрона, компактный прогресс синхронизации и надёжная серверная доставка видео. |
2.4.6 | Stable-релиз от 23 августа 2026 года: безопасный импорт SRT, надёжные локальная и серверная загрузки видео, понятные недоступные действия и приоритет локального имени CapCut-проекта. |
2.4.5 | Stable-релиз от 20 августа 2026 года: содержательные CapCut-действия, свежие метки установленных drafts, ручная синхронизация всех локальных CapCut-проектов и подсветка workflow-стадий. |
2.4.4 | Stable-релиз от 20 августа 2026 года: вход по сохранённой сессии обновляет активность, даты аккаунтов показываются без секунд, а журналы можно безопасно использовать для восстановления пропущенных входов. |
2.4.3 | Stable-релиз от 19 августа 2026 года: локальные collision-safe папки синхронизируются с каноническими серверными именами без отказов и карантина. |
2.4.2 | Stable-релиз от 19 августа 2026 года: неизменяемые локальные папки, скрытые ID-маркеры проектов и устранение ложного рассинхрона CapCut после простого открытия проекта. |
2.4.1 | Stable-релиз от 18 августа 2026 года: совместимость старых CapCut drafts с 9.3, восстановление rich-text, визуальное сравнение субтитров, точные статусы проектов и мгновенное редактирование таблицы. |
2.4.0 | Stable-релиз от 14 августа 2026 года: содержательное сравнение CapCut draft, явный статус синхронизации и исправление взаимной блокировки updater. |
2.3.8 | Динамический выбор ручных субтитров YouTube, пакетные draft-операции, свежие метки CapCut и нормализация перевода. |
2.3.7 | Stable-релиз от 8 августа 2026 года: точные размеры и высота CapCut-субтитров, безопасная инспекция откатов и исправленное восстановление файлов. |
2.3.6 | Stable-релиз от 7 августа 2026 года: исправлены collision-safe имена проектных файлов, дубликаты manifest и полное удаление дублирующих указателей. |
2.3.5 | Stable-релиз от 6 августа 2026 года: исправлен server-side sync точных дат YouTube, улучшены кнопки ЛК, ширина таблицы и файловая синхронизация. |
2.3.4 | Stable-релиз от 3 августа 2026 года: устойчивое открытие неполных проектов и отключение автообновления при ручном переключении на старую версию. |
2.3.3 | Stable-релиз от 2 августа 2026 года: переработанный интерфейс исполнителей и частей, приглашения на конкретные интервалы и исправленная передача частей для администратора. |
2.3.2 | Stable-релиз от 2 августа 2026 года: безопасный режим обслуживания observe, кэшированная readiness-диагностика, guard административного catch-up и исправление rollback safety updater. |
2.3.1 | Stable-релиз от 1 августа 2026 года: исправление updater-helper, таблица без переполнения, цельные пользовательские темы и интерфейс исполнителей и частей. |
2.3.0 | Stable-релиз от 31 июля 2026 года: ревизионная работа по сегментам, точные UTC-времена публикации, уведомления, интервальный CapCut, локальные темы и безопасное переключение версий с watchdog-откатом. |
2.2.8 | Ручной импорт Shorts с локальным видео и превью, исключение Shorts из автосинка и валидная локальная основа CapCut с техническим сабом а без исходного SRT. |
2.2.7 | Устойчивый sync, server video controls, bilingual technical documentation, readiness и admin diagnostics. |
2.2.x | Project-ID storage, CapCut portability, server files, YouTube pending workflow, video metadata. |
2.1.x | React/TypeScript desktop UI, account preferences, multi-user bindings. |
Sub Video Manager 1.0.74 | Стабилизация legacy desktop workflow до архитектурного перехода 2.x. |