Телепроизводство

Телепроизводство — CRM-система для редакций, которые создают фильмы, телевизионные программы, выпуски, сюжеты, рекламные ролики и другие видеоматериалы.

Система объединяет редакционную и производственную работу в одном пространстве: помогает планировать эфир, назначать исполнителей, передавать материалы между этапами, контролировать сроки, хранить сценарии и рабочие ссылки, а также уведомлять участников об изменениях.

Для чего нужна система

«Телепроизводство» решает основные задачи редакции и отдела видеомонтажа:

  • показывает, какие материалы находятся в работе и на каком этапе;
  • закрепляет за каждой задачей ответственных сотрудников;
  • помогает планировать даты производства и выхода в эфир;
  • предупреждает о просроченных задачах;
  • хранит сценарии, вложения и ссылки на рабочие материалы;
  • упрощает передачу материала от журналиста к звукорежиссёру, монтажёру и редактору;
  • сохраняет историю изменений;
  • отправляет уведомления в интерфейсе, по email, через браузер и Telegram;
  • формирует персональные и управленческие отчёты.

Как устроен рабочий процесс

Каждый материал оформляется как задача. В карточке задачи указываются тип материала, название, ответственные сотрудники, плановая дата, дедлайн, дата эфира, описание, сценарий, вложения и ссылки на рабочие файлы.

По мере готовности задача проходит десять этапов:

  1. Новая — задача создана, но работа ещё не началась.
  2. Работа над сценарием — журналист готовит текст и собирает материал.
  3. Нужны изменения — материал возвращён исполнителям с замечаниями.
  4. На озвучке — сценарий передан звукорежиссёру.
  5. Озвучена — аудиодорожка готова.
  6. На монтаже — материал передан монтажёру.
  7. Монтаж закончен — подготовлена смонтированная версия.
  8. На утверждении — готовая версия передана ответственному сотруднику.
  9. Утверждено — материал принят.
  10. Готова к эфиру — производство завершено, материал можно выпускать.

Система проверяет наличие необходимых исполнителей при переходе между этапами:

  • для работы над сценарием должен быть назначен журналист;
  • для передачи на озвучку — звукорежиссёр;
  • для передачи на монтаж — монтажёр.

При создании задачи журналиста и монтажёра можно не назначать сразу. Это позволяет зарегистрировать будущую работу, даже если исполнители ещё не определены.

Названия ролей, типов материалов и этапов можно изменить в настройках. Внутренние системные коды и связанные с ними права при этом сохраняются.

Основные возможности

Задачи и исполнители

Система поддерживает материалы типов «Фильм», «Ролик», «Реклама», «Сюжет» и «Другое».

Для одной задачи можно назначить:

  • одного или нескольких журналистов;
  • редактора;
  • монтажёра;
  • звукорежиссёра;
  • начальника отдела.

В задаче указываются плановая дата, крайний срок и дата эфира. Просроченные материалы отмечаются отдельно и доступны через специальный фильтр.

Статус, состав журналистов, монтажёра и дату эфира можно изменить прямо в реестре, не открывая карточку и не перезагружая страницу.

Для задач, которые требуется доработать, предусмотрено отдельное окно «Нужны изменения». В нём можно составить общее техническое задание и добавить персональные сообщения исполнителям.

Все значимые действия записываются в журнал. Участники получают уведомления в соответствии со своими настройками и правилами рассылки.

Защита от потери изменений

Если одну задачу одновременно открыли несколько сотрудников, система показывает, кто ещё работает с карточкой, и защищает данные от случайного перезаписывания.

При длительном редактировании изменения сохраняются в локальный и серверный черновики. После перезагрузки страницы черновик можно восстановить. Если пользовательская сессия истекла, система предупреждает об этом до отправки формы.

Программы, выпуски и сюжеты

Телевизионные программы представлены в виде иерархии:

Программа
└── Выпуск
    ├── Сюжет
    └── Сюжет

Программа объединяет выпуски и содержит расписание линейного эфира. Выпуск относится к конкретной программе и может включать несколько сюжетов. Сюжет — отдельный материал внутри выпуска.

В реестре можно:

  • просматривать программу вместе с выпусками и вложенными сюжетами;
  • добавлять выпуск кнопкой +;
  • добавлять сюжет непосредственно к нужному выпуску;
  • менять порядок сюжетов перетаскиванием;
  • переносить выпуск из одной программы в другую;
  • сворачивать и раскрывать ветви иерархии.

Новый выпуск наследует журналистов программы и автоматически получает следующую дату эфира. Выпуски внутри программы сортируются по дате создания.

Состояние раскрытых ветвей сохраняется отдельно для каждого пользователя и каждого раздела.

Фильмы

Для фильмов предусмотрен самостоятельный раздел. В нём отображаются только задачи системного типа film.

Раздел поддерживает:

  • быстрое создание фильма с заранее выбранным типом;
  • изменение исполнителей и других доступных полей прямо в реестре;
  • поиск и фильтрацию;
  • календарное представление;
  • диаграмму Ганта;
  • возврат в список фильмов после просмотра или удаления карточки.

Реестры и способы отображения

Задачи можно просматривать в трёх основных разделах:

  • «Программы» — иерархия программ, выпусков и сюжетов;
  • «Фильмы» — отдельный список фильмов;
  • «Все задачи» — общий реестр производственных материалов.

Для анализа и планирования доступны:

  • табличный список;
  • календарь по месяцам;
  • интерактивная диаграмма Ганта.

В диаграмме Ганта можно выбрать масштаб «День», «Неделя» или «Месяц», а также сгруппировать задачи по исполнителям, статусам, типам материалов или программам.

Период задачи отображается одним из двух способов:

  • от плановой даты до дедлайна;
  • только по дедлайну.

Поиск и фильтрация

Реестры позволяют:

  • искать материалы по тексту;
  • отбирать задачи по статусу;
  • показывать задачи конкретного исполнителя;
  • выводить только просроченные материалы;
  • сочетать несколько условий отбора.

Сценарии, файлы и рабочие материалы

К задаче можно прикрепить до 10 приватных файлов размером до 100 МБ каждый. Файлы разрешено загружать ещё до первого сохранения карточки. Скачать вложения могут только пользователи, имеющие доступ к соответствующей задаче.

В карточке предусмотрены отдельные поля для ссылок и сетевых путей на:

  • монтажный проект;
  • аудиодорожку;
  • версию для озвучки;
  • анонс;
  • версии для социальных сетей;
  • версии для мессенджеров;
  • версию для утверждения.

Система распознаёт разные формы пути к одному проекту:

  • диск сотрудника P:\;
  • UNC-путь \\mbmedia\projects\;
  • серверную точку монтирования;
  • путь относительно корневого каталога проектов.

Описание и сценарий поддерживают форматирование. Потенциально опасный HTML автоматически очищается.

Для сценария можно создать отзываемую публичную ссылку. Если к задаче добавлена версия для утверждения, на публичной странице также отображается защищённое видео.

Просмотр и проверка видео

Встроенный видеоплеер:

  • проверяет право пользователя на доступ к задаче;
  • поддерживает HTTP Range и перемотку;
  • адаптируется под формат 16:9;
  • показывает центральную кнопку воспроизведения;
  • позволяет смотреть видео без предоставления прямого публичного доступа к файлу.

Для версии, отправленной на утверждение, система может показать технические характеристики:

  • кодек;
  • разрешение;
  • частоту кадров;
  • битрейт;
  • длительность;
  • размер файла.

Для чтения этих данных на сервере должен быть установлен ffprobe.

Рекламные материалы

Задачу можно отметить как рекламный материал. После этого специальный значок появляется во всех представлениях и помогает отличить рекламу от редакционного контента.

Удаление материалов

При удалении задачи система удаляет её локальные вложения и вложения дочерних элементов. Внешние файлы, которые указаны ссылками или сетевыми путями, не удаляются.

Удаление программы каскадно удаляет связанные выпуски, сюжеты, записи вложений и физически загруженные локальные файлы.

Статистика и отчёты

Дашборд показывает:

  • общее количество задач;
  • количество завершённых задач;
  • количество просроченных задач;
  • распределение материалов по статусам;
  • загрузку исполнителей.

Система формирует два вида плановых отчётов:

  • ежедневный персональный отчёт — активные, срочные и недавно завершённые задачи сотрудника;
  • еженедельный отчёт руководству — загрузка исполнителей, просрочки и сводка по программам.

По умолчанию ежедневный отчёт отправляется в 09:00, а еженедельный — по пятницам в 17:00. Время рассчитывается в часовом поясе APP_DISPLAY_TIMEZONE.

Уведомления

Система поддерживает четыре канала уведомлений:

  • уведомления внутри приложения;
  • email;
  • браузерные Push Notifications;
  • Telegram.

Для каждого статуса можно настроить группы получателей. Сообщения о смене статуса содержат название задачи и учитывают пол автора изменения.

Пользователь может проверить выбранный канал с помощью тестовой отправки в персональных настройках.

Email

Пользователь может изменить свой email в разделе «Настройки». Новый адрес применяется только после успешной отправки проверочного письма и подтверждения по подписанной ссылке.

Browser Push

Push Notifications требуют HTTPS, за исключением локального адреса localhost.

VAPID-ключи автоматически создаются при первом обращении к Push API и сохраняются в:

storage/app/private/vapid.json

Файл содержит приватный ключ. Его нельзя добавлять в Git, но необходимо включать в резервные копии.

Telegram

Для подключения Telegram:

  1. Создайте бота через @BotFather.
  2. Добавьте токен в TELEGRAM_BOT_TOKEN.
  3. Запустите получение сообщений:

``bash php artisan telegram:poll ``

  1. Пользователь должен отправить боту команду /start, после чего бот сообщит Chat ID.
  2. Руководитель указывает Chat ID в карточке пользователя и включает Telegram-уведомления.

Для постоянной работы можно использовать готовый unit-файл deploy/telegram-poll.service:

sudo cp deploy/telegram-poll.service /etc/systemd/system/crm-telegram-poll.service
sudo systemctl daemon-reload
sudo systemctl enable --now crm-telegram-poll.service

Перед установкой проверьте пользователя, группу, каталог проекта и путь к PHP.

Роли и права доступа

Роль Доступные действия
Главный редактор Управление всеми задачами, просмотр дашборда и управление пользователями
Редактор Управление всеми задачами и программами
Начальник отдела Управление всеми задачами, дашбордом, пользователями и названиями элементов рабочего процесса
Журналист Создание обычных задач, выпусков и сюжетов в доступных программах; редактирование назначенных материалов
Монтажёр Работа с назначенными задачами и изменение их статусов
Звукорежиссёр Доступ к назначенным задачам

Одному пользователю можно назначить несколько ролей. В этом случае доступные права объединяются.

Учётную запись пользователя можно временно отключить без удаления её данных.

Технологии

  • PHP 8.2+;
  • Laravel 12;
  • MySQL или MariaDB в рабочей среде;
  • SQLite in-memory в тестах;
  • Blade;
  • Bootstrap 5 и Bootstrap Icons;
  • Vite;
  • TinyMCE;
  • FilePond;
  • vis-timeline;
  • PHPUnit 11;
  • Laravel Queue;
  • Laravel Scheduler.

Системные требования

  • PHP 8.2 или новее с расширениями, необходимыми Laravel и выбранной СУБД;
  • Composer 2;
  • Node.js 20+ и npm;
  • MySQL 8+ или MariaDB 10.6+;
  • Apache или Nginx;
  • HTTPS для Browser Push;
  • право записи пользователя веб-сервера в storage/ и bootstrap/cache/;
  • ffprobe для чтения характеристик видео;
  • подключённый в режиме read-only CIFS-каталог проектов для встроенного видеоплеера.

Лимиты PHP должны быть не ниже лимитов приложения:

upload_max_filesize = 100M
post_max_size = 110M
max_file_uploads = 10

После изменения php.ini перезапустите PHP-FPM или Apache.

Быстрый запуск для разработки

Клонируйте репозиторий:

git clone This email address is being protected from spambots. You need JavaScript enabled to view it.:magiks-hub/crm.git
cd crm

Установите PHP-зависимости и создайте локальный файл окружения:

composer install
cp .env.example .env
php artisan key:generate

Создайте базу данных, заполните параметры DB_* в .env, затем выполните:

php artisan migrate
npm install
npm run build

Запустите среду разработки:

composer dev

Команда одновременно запускает веб-сервер Laravel, обработчик очереди, просмотр логов и Vite. По умолчанию приложение доступно по адресу http://127.0.0.1:8000.

Установка на сервер

Пример установки в /var/www/crm.tvbelgorod.ru:

cd /var/www
git clone This email address is being protected from spambots. You need JavaScript enabled to view it.:magiks-hub/crm.git crm.tvbelgorod.ru
cd crm.tvbelgorod.ru

composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
npm ci
npm run build

Отредактируйте .env. Обязательно задайте рабочее окружение, публичный URL, подключение к базе, почтовые параметры и секреты интеграций:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://crm.example.ru

Примените миграции и оптимизируйте приложение:

php artisan migrate --force
php artisan optimize

Настройте права, заменив пользователя и группу в соответствии с конфигурацией сервера:

sudo chown -R deploy:www-data /var/www/crm.tvbelgorod.ru
sudo find storage bootstrap/cache -type d -exec chmod 2775 {} \;
sudo find storage bootstrap/cache -type f -exec chmod 664 {} \;

Не предоставляйте веб-серверу право записи на весь проект.

Apache

Корнем сайта должен быть каталог public:

<VirtualHost *:80>
    ServerName crm.example.ru
    DocumentRoot /var/www/crm.tvbelgorod.ru/public

    <Directory /var/www/crm.tvbelgorod.ru/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/crm-error.log
    CustomLog ${APACHE_LOG_DIR}/crm-access.log combined
</VirtualHost>

Включите mod_rewrite и перезагрузите Apache:

sudo a2enmod rewrite
sudo systemctl reload apache2

Nginx

Минимальная конфигурация для PHP-FPM:

server {
    listen 80;
    server_name crm.example.ru;
    root /var/www/crm.tvbelgorod.ru/public;

    index index.php;
    client_max_body_size 110M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Путь к сокету PHP-FPM может отличаться. Для рабочей среды настройте TLS-сертификат и перенаправление с HTTP на HTTPS.

Переменные окружения

Основные настройки находятся в .env. Полный шаблон приведён в .env.example.

Переменная Назначение
APP_NAME Название приложения в интерфейсе
APP_VERSION Отображаемая версия
APP_ENV Окружение: local, testing или production
APP_DEBUG Вывод подробных ошибок; в production должно быть false
APP_URL Публичный HTTPS-адрес приложения
APP_DISPLAY_TIMEZONE Часовой пояс ввода, отображения и отчётов
DB_* Подключение к MySQL или MariaDB
SESSION_DRIVER Хранилище сессий; по умолчанию database
CACHE_STORE Хранилище кеша; по умолчанию database
QUEUE_CONNECTION Драйвер очереди; по умолчанию database
MAIL_* Способ отправки почты и адрес отправителя
TELEGRAM_BOT_TOKEN Токен Telegram-бота
TELEGRAM_HTTP_PROXY Необязательный HTTP-прокси для Telegram API

Если используются драйверы database, необходимые таблицы создаются миграциями проекта.

После изменения .env очистите и заново соберите кеш:

php artisan optimize:clear
php artisan optimize

Фоновые процессы

Для полноценной работы приложения необходимы:

  • обработчик очереди — отправляет отложенные уведомления и отчёты;
  • планировщик — очищает временные загрузки и запускает отчёты по расписанию;
  • Telegram polling — получает сообщения от Telegram-бота, если интеграция включена.

Очередь

Разовый локальный запуск:

php artisan queue:work database --queue=default --tries=5 --timeout=45

Для сервера используйте deploy/queue-worker.service. Проверьте User, Group, WorkingDirectory и путь к PHP:

sudo cp deploy/queue-worker.service /etc/systemd/system/crm-queue-worker.service
sudo systemctl daemon-reload
sudo systemctl enable --now crm-queue-worker.service

Планировщик

Планировщик выполняет:

  • ежечасную очистку просроченных временных загрузок;
  • ежедневную отправку персонального отчёта в 09:00;
  • еженедельную отправку отчёта руководству по пятницам в 17:00.

Для systemd используйте файлы из deployment/systemd/:

sudo cp deployment/systemd/crm-scheduler.service /etc/systemd/system/
sudo cp deployment/systemd/crm-scheduler.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now crm-scheduler.timer

Проверка:

php artisan schedule:list
systemctl list-timers crm-scheduler.timer

Вместо systemd можно использовать cron:

* * * * * cd /var/www/crm.tvbelgorod.ru && php artisan schedule:run >> /dev/null 2>&1

Демо-данные

Для тестового стенда можно создать демонстрационных пользователей и задачи:

php artisan db:seed
Пользователь Email
Главный редактор This email address is being protected from spambots. You need JavaScript enabled to view it.
Редактор This email address is being protected from spambots. You need JavaScript enabled to view it.
Журналист This email address is being protected from spambots. You need JavaScript enabled to view it.
Монтажёр This email address is being protected from spambots. You need JavaScript enabled to view it.
Начальник отдела This email address is being protected from spambots. You need JavaScript enabled to view it.

Пароль всех демонстрационных пользователей: password.

Не запускайте демонстрационный seeder на рабочей базе. Если он уже был запущен, удалите демонстрационные аккаунты или смените их пароли до ввода системы в эксплуатацию.

Тестирование и сборка

Запуск всех тестов:

composer test

Запуск отдельного теста:

php artisan test --filter=TaskWorkflowTest

Проверка стиля PHP:

./vendor/bin/pint --test

Рабочая сборка frontend:

npm run build

Vite с автоматическим обновлением:

npm run dev

Версия приложения

Версия хранится в файле VERSION, отображается в боковой панели и изменяется по правилам Semantic Versioning:

composer version:patch # исправление: 1.1.0 → 1.1.1
composer version:minor # новая функциональность: 1.1.1 → 1.2.0
composer version:major # несовместимое изменение: 1.2.0 → 2.0.0

Команды обновляют VERSION и очищают кеш конфигурации Laravel.

Обновление приложения

Перед обновлением обязательно создайте резервную копию базы данных и каталога storage/app/private.

cd /var/www/crm.tvbelgorod.ru
php artisan down
git pull --ff-only
composer install --no-dev --optimize-autoloader
npm ci
npm run build
php artisan migrate --force
php artisan optimize
php artisan queue:restart
php artisan up

После обновления проверьте фоновые процессы:

systemctl status crm-queue-worker.service
systemctl status crm-scheduler.timer
systemctl status crm-telegram-poll.service

Хранение данных и безопасность

  • не добавляйте в Git .env, токены, пароли, приватные SSH- и VAPID-ключи, а также дампы базы;
  • устанавливайте APP_DEBUG=false на рабочем сервере;
  • используйте HTTPS;
  • ограничивайте доступ к базе данных и служебным портам;
  • регулярно обновляйте PHP, Composer-зависимости и npm-пакеты;
  • резервируйте базу данных и весь каталог storage/app/private;
  • сохраняйте сетевое хранилище проектов в режиме read-only;
  • проверяйте работу автоматической очистки временных загрузок;
  • при необходимости отзывайте ранее созданные публичные ссылки на сценарии.

Локальные вложения хранятся вне публичного каталога и выдаются только через контроллер после проверки прав пользователя.

Видео на сетевом диске

Сопоставление путей настраивается в .env:

PROJECTS_STORAGE_PATH=/var/www/tvbelgorod.ru/watchdog/projects
PROJECTS_WINDOWS_DRIVE="P:\"
PROJECTS_UNC_PATH="\\mbmedia\projects\"

Сетевой каталог должен быть смонтирован в режиме read-only. Видео выдаётся через авторизованный маршрут приложения с проверкой доступа к задаче и поддержкой HTTP Range.

Структура проекта

app/
├── Enums/                  роли, типы и статусы
├── Http/Controllers/       HTTP-контроллеры
├── Models/                 Eloquent-модели
├── Notifications/          email, Telegram и Browser Push
└── Support/                интеграции, отчёты и очистка HTML
database/
├── migrations/             структура базы данных
└── seeders/                демонстрационные данные
deploy/                     units очереди и Telegram, пример crontab
deployment/systemd/         Laravel Scheduler timer
resources/
├── css/                    стили
├── js/                     frontend-логика
└── views/                  Blade-шаблоны
routes/                     web- и console-маршруты
tests/
├── Feature/                функциональные тесты
└── Unit/                   модульные тесты

Лицензия

Использование и распространение проекта регулируются договорённостями владельца проекта и пользователей.