Телепроизводство
Телепроизводство — CRM-система для редакций, которые создают фильмы, телевизионные программы, выпуски, сюжеты, рекламные ролики и другие видеоматериалы.
Система объединяет редакционную и производственную работу в одном пространстве: помогает планировать эфир, назначать исполнителей, передавать материалы между этапами, контролировать сроки, хранить сценарии и рабочие ссылки, а также уведомлять участников об изменениях.
Для чего нужна система
«Телепроизводство» решает основные задачи редакции и отдела видеомонтажа:
- показывает, какие материалы находятся в работе и на каком этапе;
- закрепляет за каждой задачей ответственных сотрудников;
- помогает планировать даты производства и выхода в эфир;
- предупреждает о просроченных задачах;
- хранит сценарии, вложения и ссылки на рабочие материалы;
- упрощает передачу материала от журналиста к звукорежиссёру, монтажёру и редактору;
- сохраняет историю изменений;
- отправляет уведомления в интерфейсе, по email, через браузер и Telegram;
- формирует персональные и управленческие отчёты.
Как устроен рабочий процесс
Каждый материал оформляется как задача. В карточке задачи указываются тип материала, название, ответственные сотрудники, плановая дата, дедлайн, дата эфира, описание, сценарий, вложения и ссылки на рабочие файлы.
По мере готовности задача проходит десять этапов:
- Новая — задача создана, но работа ещё не началась.
- Работа над сценарием — журналист готовит текст и собирает материал.
- Нужны изменения — материал возвращён исполнителям с замечаниями.
- На озвучке — сценарий передан звукорежиссёру.
- Озвучена — аудиодорожка готова.
- На монтаже — материал передан монтажёру.
- Монтаж закончен — подготовлена смонтированная версия.
- На утверждении — готовая версия передана ответственному сотруднику.
- Утверждено — материал принят.
- Готова к эфиру — производство завершено, материал можно выпускать.
Система проверяет наличие необходимых исполнителей при переходе между этапами:
- для работы над сценарием должен быть назначен журналист;
- для передачи на озвучку — звукорежиссёр;
- для передачи на монтаж — монтажёр.
При создании задачи журналиста и монтажёра можно не назначать сразу. Это позволяет зарегистрировать будущую работу, даже если исполнители ещё не определены.
Названия ролей, типов материалов и этапов можно изменить в настройках. Внутренние системные коды и связанные с ними права при этом сохраняются.
Основные возможности
Задачи и исполнители
Система поддерживает материалы типов «Фильм», «Ролик», «Реклама», «Сюжет» и «Другое».
Для одной задачи можно назначить:
- одного или нескольких журналистов;
- редактора;
- монтажёра;
- звукорежиссёра;
- начальника отдела.
В задаче указываются плановая дата, крайний срок и дата эфира. Просроченные материалы отмечаются отдельно и доступны через специальный фильтр.
Статус, состав журналистов, монтажёра и дату эфира можно изменить прямо в реестре, не открывая карточку и не перезагружая страницу.
Для задач, которые требуется доработать, предусмотрено отдельное окно «Нужны изменения». В нём можно составить общее техническое задание и добавить персональные сообщения исполнителям.
Все значимые действия записываются в журнал. Участники получают уведомления в соответствии со своими настройками и правилами рассылки.
Защита от потери изменений
Если одну задачу одновременно открыли несколько сотрудников, система показывает, кто ещё работает с карточкой, и защищает данные от случайного перезаписывания.
При длительном редактировании изменения сохраняются в локальный и серверный черновики. После перезагрузки страницы черновик можно восстановить. Если пользовательская сессия истекла, система предупреждает об этом до отправки формы.
Программы, выпуски и сюжеты
Телевизионные программы представлены в виде иерархии:
Программа
└── Выпуск
├── Сюжет
└── Сюжет
Программа объединяет выпуски и содержит расписание линейного эфира. Выпуск относится к конкретной программе и может включать несколько сюжетов. Сюжет — отдельный материал внутри выпуска.
В реестре можно:
- просматривать программу вместе с выпусками и вложенными сюжетами;
- добавлять выпуск кнопкой
+; - добавлять сюжет непосредственно к нужному выпуску;
- менять порядок сюжетов перетаскиванием;
- переносить выпуск из одной программы в другую;
- сворачивать и раскрывать ветви иерархии.
Новый выпуск наследует журналистов программы и автоматически получает следующую дату эфира. Выпуски внутри программы сортируются по дате создания.
Состояние раскрытых ветвей сохраняется отдельно для каждого пользователя и каждого раздела.
Фильмы
Для фильмов предусмотрен самостоятельный раздел. В нём отображаются только задачи системного типа 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 в разделе «Настройки». Новый адрес применяется только после успешной отправки проверочного письма и подтверждения по подписанной ссылке.
Browser Push
Push Notifications требуют HTTPS, за исключением локального адреса localhost.
VAPID-ключи автоматически создаются при первом обращении к Push API и сохраняются в:
storage/app/private/vapid.json
Файл содержит приватный ключ. Его нельзя добавлять в Git, но необходимо включать в резервные копии.
Telegram
Для подключения Telegram:
- Создайте бота через
@BotFather. - Добавьте токен в
TELEGRAM_BOT_TOKEN. - Запустите получение сообщений:
``bash php artisan telegram:poll ``
- Пользователь должен отправить боту команду
/start, после чего бот сообщит Chat ID. - Руководитель указывает 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
| Пользователь | |
|---|---|
| Главный редактор | |
| Редактор | |
| Журналист | |
| Монтажёр | |
| Начальник отдела | |
Пароль всех демонстрационных пользователей: 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/ модульные тесты
Лицензия
Использование и распространение проекта регулируются договорённостями владельца проекта и пользователей.