v 0.0.75 (добавлен онлайн просмотр видео)

This commit is contained in:
DND
2026-06-30 09:53:07 +07:00
parent d74ec32755
commit aa07baa844
15 changed files with 576 additions and 563 deletions
Binary file not shown.
Binary file not shown.
+2
View File
@@ -34,6 +34,8 @@ type ChannelConfigDB struct {
// Видео поля
ChannelType string `json:"channel_type"`
VideoDevice string `json:"video_device"`
VideoDeviceType string `json:"video_device_type"` // "usb", "ip", "rtsp"
VideoRTSPUrl string `json:"video_rtsp_url"`
VideoResolution string `json:"video_resolution"`
VideoFramerate int `json:"video_framerate"`
VideoBitrate int `json:"video_bitrate"`
+14 -481
View File
@@ -1,481 +1,14 @@
{"id":158,"timestamp":"2026-06-09T09:43:27.527848063+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":159,"timestamp":"2026-06-09T09:43:27.622787983+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard остановлен"}
{"id":160,"timestamp":"2026-06-09T09:43:28.699199246+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":161,"timestamp":"2026-06-09T09:43:29.247980984+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":162,"timestamp":"2026-06-09T09:46:00.588770277+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":163,"timestamp":"2026-06-09T09:48:43.086337416+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":164,"timestamp":"2026-06-09T09:48:48.100988534+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":165,"timestamp":"2026-06-09T09:48:48.61780624+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":166,"timestamp":"2026-06-09T09:49:00.635371442+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":167,"timestamp":"2026-06-09T09:49:00.711491325+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":168,"timestamp":"2026-06-09T09:49:01.21976132+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":169,"timestamp":"2026-06-09T09:49:01.219807941+07:00","level":"ERROR","category":"VPN","message":"Ошибка запуска WireGuard: failed to set config: exit status 1"}
{"id":170,"timestamp":"2026-06-09T09:49:19.605911075+07:00","level":"SETTINGS","category":"WIREGUARD","message":"Настройки обновлены"}
{"id":171,"timestamp":"2026-06-09T09:49:19.679445331+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":172,"timestamp":"2026-06-09T09:49:20.187933961+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":173,"timestamp":"2026-06-09T09:49:21.08841767+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":174,"timestamp":"2026-06-09T09:49:21.596674427+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":175,"timestamp":"2026-06-09T09:50:02.77536005+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":176,"timestamp":"2026-06-09T09:50:02.775412318+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":177,"timestamp":"2026-06-09T09:51:06.991508555+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":178,"timestamp":"2026-06-09T09:51:12.054571645+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":179,"timestamp":"2026-06-09T09:51:12.856412958+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":180,"timestamp":"2026-06-09T09:54:59.334244213+07:00","level":"SETTINGS","category":"WIREGUARD","message":"Настройки обновлены"}
{"id":181,"timestamp":"2026-06-09T10:15:53.025713605+07:00","level":"SETTINGS","category":"WIREGUARD","message":"Настройки обновлены"}
{"id":182,"timestamp":"2026-06-09T10:16:20.072785256+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":183,"timestamp":"2026-06-09T10:16:20.176381346+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard остановлен"}
{"id":184,"timestamp":"2026-06-09T10:16:21.659494019+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":185,"timestamp":"2026-06-09T10:16:22.212060303+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":186,"timestamp":"2026-06-09T10:18:56.059023055+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":187,"timestamp":"2026-06-09T10:19:42.423772702+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":188,"timestamp":"2026-06-09T10:19:47.427472404+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":189,"timestamp":"2026-06-09T10:19:47.97428549+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":190,"timestamp":"2026-06-09T10:20:32.403249806+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":191,"timestamp":"2026-06-09T10:20:32.403334224+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":192,"timestamp":"2026-06-09T10:21:43.273848181+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":193,"timestamp":"2026-06-09T10:22:24.010822053+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":194,"timestamp":"2026-06-09T10:22:29.014565593+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":195,"timestamp":"2026-06-09T10:22:29.561667234+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":196,"timestamp":"2026-06-09T10:30:27.687269952+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":197,"timestamp":"2026-06-09T10:32:38.006401559+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":198,"timestamp":"2026-06-09T10:32:43.118868893+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":199,"timestamp":"2026-06-09T10:32:43.215403169+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: signal: segmentation fault (core dumped)"}
{"id":200,"timestamp":"2026-06-09T10:33:00.164438321+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":201,"timestamp":"2026-06-09T10:33:00.253263414+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: signal: segmentation fault (core dumped)"}
{"id":202,"timestamp":"2026-06-09T10:33:29.401539635+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":203,"timestamp":"2026-06-09T10:33:29.401580773+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":204,"timestamp":"2026-06-09T10:34:53.790748428+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":205,"timestamp":"2026-06-09T10:34:58.810328038+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":206,"timestamp":"2026-06-09T10:34:59.361613201+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":207,"timestamp":"2026-06-09T10:36:21.761021188+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":208,"timestamp":"2026-06-09T10:36:21.761086646+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":209,"timestamp":"2026-06-09T10:38:21.617724012+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":210,"timestamp":"2026-06-09T10:41:39.003647697+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":211,"timestamp":"2026-06-09T10:41:44.013015155+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":212,"timestamp":"2026-06-09T10:41:44.680311653+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":213,"timestamp":"2026-06-09T10:45:39.689316211+07:00","level":"WARNING","category":"WIREGUARD","message":"Подключение потеряно"}
{"id":214,"timestamp":"2026-06-09T10:45:44.801980487+07:00","level":"INFO","category":"WIREGUARD","message":"Подключение установлено | IP: 10.8.0.13"}
{"id":215,"timestamp":"2026-06-09T10:45:44.802016585+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение WireGuard"}
{"id":216,"timestamp":"2026-06-09T10:45:46.909309639+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":217,"timestamp":"2026-06-09T10:45:47.466727019+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":218,"timestamp":"2026-06-09T10:45:47.466753906+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение выполнено"}
{"id":219,"timestamp":"2026-06-09T10:46:09.689644514+07:00","level":"WARNING","category":"WIREGUARD","message":"Подключение потеряно"}
{"id":220,"timestamp":"2026-06-09T10:46:19.697387072+07:00","level":"WARNING","category":"WIREGUARD","message":"Подключение потеряно"}
{"id":221,"timestamp":"2026-06-09T10:46:29.705221814+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение WireGuard"}
{"id":222,"timestamp":"2026-06-09T10:46:31.804294618+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":223,"timestamp":"2026-06-09T10:53:02.458741069+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":224,"timestamp":"2026-06-09T10:53:02.544214424+07:00","level":"INFO","category":"WIREGUARD","message":"Подключение установлено | IP: "}
{"id":225,"timestamp":"2026-06-09T10:53:02.544263919+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение WireGuard"}
{"id":226,"timestamp":"2026-06-09T10:53:04.611847439+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":227,"timestamp":"2026-06-09T10:53:04.700330337+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка переподключения: failed to set config: exit status 1"}
{"id":228,"timestamp":"2026-06-09T10:53:04.700376095+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":229,"timestamp":"2026-06-09T10:53:04.700387258+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение выполнено"}
{"id":230,"timestamp":"2026-06-09T10:53:04.700441666+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":231,"timestamp":"2026-06-09T10:53:04.70046122+07:00","level":"INFO","category":"WIREGUARD","message":"Подключение установлено | IP: "}
{"id":232,"timestamp":"2026-06-09T10:53:04.70049521+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":233,"timestamp":"2026-06-09T10:53:04.700541916+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":234,"timestamp":"2026-06-09T10:53:04.700553726+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":235,"timestamp":"2026-06-09T10:53:04.70058825+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":236,"timestamp":"2026-06-09T10:53:04.700606708+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":237,"timestamp":"2026-06-09T10:53:04.700642504+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":238,"timestamp":"2026-06-09T10:53:04.700655888+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":239,"timestamp":"2026-06-09T10:53:04.702260498+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":240,"timestamp":"2026-06-09T10:53:04.702292759+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":241,"timestamp":"2026-06-09T10:53:04.702711639+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":242,"timestamp":"2026-06-09T10:53:04.702732493+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":243,"timestamp":"2026-06-09T10:53:04.715062344+07:00","level":"SETTINGS","category":"VPN","message":"Изменение настроек | VPN по умолчанию: wireguard -\u003e wireguard"}
{"id":244,"timestamp":"2026-06-09T10:58:46.019749174+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":245,"timestamp":"2026-06-09T10:58:46.024623776+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":246,"timestamp":"2026-06-09T10:58:51.027168864+07:00","level":"INFO","category":"OPENVPN","message":"Подключение установлено | IP: 10.0.8.35"}
{"id":247,"timestamp":"2026-06-09T10:59:22.326867775+07:00","level":"SETTINGS","category":"VPN","message":"Изменение настроек | VPN по умолчанию: wireguard -\u003e openvpn"}
{"id":248,"timestamp":"2026-06-09T10:59:22.962728437+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: openvpn"}
{"id":249,"timestamp":"2026-06-09T10:59:22.962771708+07:00","level":"INFO","category":"VPN","message":"OpenVPN запущен как VPN по умолчанию"}
{"id":250,"timestamp":"2026-06-09T11:00:04.70474155+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":251,"timestamp":"2026-06-09T11:00:04.704802815+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":252,"timestamp":"2026-06-09T11:00:04.704821703+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":253,"timestamp":"2026-06-09T11:00:04.704832039+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":254,"timestamp":"2026-06-09T11:00:04.70489336+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":255,"timestamp":"2026-06-09T11:00:04.704913501+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":256,"timestamp":"2026-06-09T11:00:04.704921311+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":257,"timestamp":"2026-06-09T11:00:04.704945266+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":258,"timestamp":"2026-06-09T11:00:04.704956879+07:00","level":"WARNING","category":"VPN","message":"Обнаружено 4 ошибок, переключение VPN"}
{"id":259,"timestamp":"2026-06-09T11:00:04.70497311+07:00","level":"WARNING","category":"VPN","message":"Переключение VPN: wireguard не работает, попытка подключить альтернативу"}
{"id":260,"timestamp":"2026-06-09T11:00:04.704981161+07:00","level":"INFO","category":"WIREGUARD","message":"Остановка WireGuard"}
{"id":261,"timestamp":"2026-06-09T11:00:04.705004163+07:00","level":"WARNING","category":"VPN","message":"Обнаружено 3 ошибок, переключение VPN"}
{"id":262,"timestamp":"2026-06-09T11:00:04.705033953+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":263,"timestamp":"2026-06-09T11:00:04.705045581+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":264,"timestamp":"2026-06-09T11:00:04.705052794+07:00","level":"WARNING","category":"VPN","message":"Обнаружено 5 ошибок, переключение VPN"}
{"id":265,"timestamp":"2026-06-09T11:00:04.706309443+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":266,"timestamp":"2026-06-09T11:00:04.706341726+07:00","level":"WARNING","category":"VPN","message":"WireGuard: есть handshake, но нет связи"}
{"id":267,"timestamp":"2026-06-09T11:00:04.706363891+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":268,"timestamp":"2026-06-09T11:00:04.70637717+07:00","level":"WARNING","category":"VPN","message":"Обнаружено 6 ошибок, переключение VPN"}
{"id":269,"timestamp":"2026-06-09T11:00:04.70638831+07:00","level":"WARNING","category":"VPN","message":"Потеряно подключение для wireguard"}
{"id":270,"timestamp":"2026-06-09T11:00:04.706396575+07:00","level":"WARNING","category":"VPN","message":"Обнаружено 7 ошибок, переключение VPN"}
{"id":271,"timestamp":"2026-06-09T11:00:04.726341963+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard остановлен"}
{"id":272,"timestamp":"2026-06-09T11:00:04.726359706+07:00","level":"INFO","category":"VPN","message":"WireGuard остановлен для переключения"}
{"id":273,"timestamp":"2026-06-09T11:00:07.726676865+07:00","level":"INFO","category":"VPN","message":"Попытка запустить OpenVPN как альтернативу"}
{"id":274,"timestamp":"2026-06-09T11:00:07.726745382+07:00","level":"INFO","category":"VPN","message":"Успешно переключено на openvpn"}
{"id":275,"timestamp":"2026-06-09T11:02:34.463066745+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: openvpn"}
{"id":276,"timestamp":"2026-06-09T11:02:34.46311454+07:00","level":"INFO","category":"VPN","message":"OpenVPN запущен как VPN по умолчанию"}
{"id":277,"timestamp":"2026-06-09T11:02:44.659862185+07:00","level":"SETTINGS","category":"VPN","message":"Изменение настроек | VPN по умолчанию: openvpn -\u003e wireguard"}
{"id":278,"timestamp":"2026-06-09T11:02:45.75751906+07:00","level":"INFO","category":"VPN","message":"Запуск VPN по умолчанию: wireguard"}
{"id":279,"timestamp":"2026-06-09T11:02:45.766676418+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":280,"timestamp":"2026-06-09T11:02:46.409527363+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":281,"timestamp":"2026-06-09T11:02:46.409558725+07:00","level":"INFO","category":"VPN","message":"WireGuard запущен как VPN по умолчанию"}
{"id":282,"timestamp":"2026-06-09T11:03:04.801407516+07:00","level":"INFO","category":"VPN","message":"Подключение восстановлено для wireguard"}
{"id":283,"timestamp":"2026-06-09T11:03:04.801478686+07:00","level":"INFO","category":"VPN","message":"Подключение восстановлено для wireguard"}
{"id":284,"timestamp":"2026-06-09T11:12:12.884770581+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":285,"timestamp":"2026-06-09T11:13:02.332698472+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":286,"timestamp":"2026-06-09T11:13:02.333154325+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":287,"timestamp":"2026-06-09T11:13:07.352121685+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":288,"timestamp":"2026-06-09T11:13:07.354150939+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":289,"timestamp":"2026-06-09T11:13:07.435520877+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":290,"timestamp":"2026-06-09T11:13:07.983174874+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":291,"timestamp":"2026-06-09T11:13:17.361132488+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":292,"timestamp":"2026-06-09T11:14:02.01559806+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":293,"timestamp":"2026-06-09T11:15:03.107498892+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":294,"timestamp":"2026-06-09T11:15:03.107697188+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":295,"timestamp":"2026-06-09T11:15:08.121915832+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":296,"timestamp":"2026-06-09T11:15:08.124011623+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":297,"timestamp":"2026-06-09T11:15:08.203591892+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":298,"timestamp":"2026-06-09T11:15:08.759878651+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":299,"timestamp":"2026-06-09T11:15:18.130219389+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":300,"timestamp":"2026-06-09T11:16:53.915913049+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":301,"timestamp":"2026-06-09T11:22:00.837867723+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":302,"timestamp":"2026-06-09T11:22:00.838434366+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":303,"timestamp":"2026-06-09T11:22:05.84879823+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":304,"timestamp":"2026-06-09T11:22:05.85139949+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":305,"timestamp":"2026-06-09T11:22:05.939658476+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":306,"timestamp":"2026-06-09T11:22:06.493338219+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":307,"timestamp":"2026-06-09T11:22:15.860251458+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":308,"timestamp":"2026-06-09T11:39:36.346329873+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":309,"timestamp":"2026-06-09T11:39:36.346544122+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":310,"timestamp":"2026-06-09T11:39:41.363474105+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":311,"timestamp":"2026-06-09T11:39:41.363930577+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":312,"timestamp":"2026-06-09T11:39:41.366543969+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":313,"timestamp":"2026-06-09T11:39:46.368922104+07:00","level":"INFO","category":"OPENVPN","message":"Подключение установлено | IP: 10.0.8.35"}
{"id":314,"timestamp":"2026-06-09T11:44:30.786795052+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":315,"timestamp":"2026-06-09T11:44:51.804768089+07:00","level":"WARNING","category":"WIREGUARD","message":"Подключение потеряно"}
{"id":316,"timestamp":"2026-06-09T11:44:56.804998489+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение WireGuard"}
{"id":317,"timestamp":"2026-06-09T11:44:58.888450896+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":318,"timestamp":"2026-06-09T11:45:09.438470088+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":319,"timestamp":"2026-06-09T11:45:09.43852329+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение выполнено"}
{"id":320,"timestamp":"2026-06-09T11:51:39.638548324+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":321,"timestamp":"2026-06-09T11:57:23.833451571+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":322,"timestamp":"2026-06-09T11:57:23.833968813+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":323,"timestamp":"2026-06-09T11:57:28.854999928+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":324,"timestamp":"2026-06-09T11:57:28.85693434+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":325,"timestamp":"2026-06-09T11:57:28.947598606+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":326,"timestamp":"2026-06-09T11:57:29.493908775+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":327,"timestamp":"2026-06-09T11:57:38.869210559+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":328,"timestamp":"2026-06-09T12:01:26.64731508+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":329,"timestamp":"2026-06-09T12:02:06.744543267+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":330,"timestamp":"2026-06-09T12:02:06.744910945+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":331,"timestamp":"2026-06-09T12:02:11.763713855+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":332,"timestamp":"2026-06-09T12:02:11.765536596+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":333,"timestamp":"2026-06-09T12:02:11.850530671+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":334,"timestamp":"2026-06-09T12:02:12.408005263+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":335,"timestamp":"2026-06-09T12:02:21.786305711+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":336,"timestamp":"2026-06-09T12:17:42.060953039+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":337,"timestamp":"2026-06-09T12:29:28.326518464+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":338,"timestamp":"2026-06-09T12:29:28.326900098+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":339,"timestamp":"2026-06-09T12:29:33.352642463+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":340,"timestamp":"2026-06-09T12:29:33.354356716+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":341,"timestamp":"2026-06-09T12:29:33.434601226+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":342,"timestamp":"2026-06-09T12:29:33.989349137+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":343,"timestamp":"2026-06-09T12:29:43.367209049+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":344,"timestamp":"2026-06-09T12:30:06.524726156+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":345,"timestamp":"2026-06-09T13:48:09.852211905+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":346,"timestamp":"2026-06-09T13:48:09.852645418+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":347,"timestamp":"2026-06-09T13:48:14.874804632+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":348,"timestamp":"2026-06-09T13:48:14.876655221+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":349,"timestamp":"2026-06-09T13:48:14.958466583+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":350,"timestamp":"2026-06-09T13:48:15.657345016+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":351,"timestamp":"2026-06-09T13:48:24.882759934+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":352,"timestamp":"2026-06-09T13:50:02.065593128+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":353,"timestamp":"2026-06-09T13:51:46.246448713+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":354,"timestamp":"2026-06-09T13:51:46.246984465+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":355,"timestamp":"2026-06-09T13:51:51.260362181+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":356,"timestamp":"2026-06-09T13:51:51.26301492+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":357,"timestamp":"2026-06-09T13:51:51.34654735+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":358,"timestamp":"2026-06-09T13:51:51.904959118+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":359,"timestamp":"2026-06-09T13:52:01.272711751+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":360,"timestamp":"2026-06-09T13:56:15.433475218+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":361,"timestamp":"2026-06-09T14:13:36.953638383+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":362,"timestamp":"2026-06-09T14:13:36.954076675+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":363,"timestamp":"2026-06-09T14:13:41.970174249+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":364,"timestamp":"2026-06-09T14:13:41.972282175+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":365,"timestamp":"2026-06-09T14:13:42.065512473+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":366,"timestamp":"2026-06-09T14:13:42.632773429+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":367,"timestamp":"2026-06-09T14:13:51.982159235+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":368,"timestamp":"2026-06-09T14:14:53.981615956+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":369,"timestamp":"2026-06-09T14:16:46.779138935+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":370,"timestamp":"2026-06-09T14:16:46.779565595+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":371,"timestamp":"2026-06-09T14:16:51.795268722+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":372,"timestamp":"2026-06-09T14:16:51.797269336+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":373,"timestamp":"2026-06-09T14:16:51.882473701+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":374,"timestamp":"2026-06-09T14:16:52.427512117+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":375,"timestamp":"2026-06-09T14:17:01.807394787+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":376,"timestamp":"2026-06-09T14:20:34.635315806+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":377,"timestamp":"2026-06-09T14:21:51.621824637+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":378,"timestamp":"2026-06-09T14:21:51.62223184+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":379,"timestamp":"2026-06-09T14:21:56.635289018+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":380,"timestamp":"2026-06-09T14:21:56.637612455+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":381,"timestamp":"2026-06-09T14:21:56.720512697+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":382,"timestamp":"2026-06-09T14:21:57.264781368+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":383,"timestamp":"2026-06-09T14:22:06.650598408+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":384,"timestamp":"2026-06-09T14:26:40.877245202+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":385,"timestamp":"2026-06-09T14:27:15.257791837+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":386,"timestamp":"2026-06-09T14:27:15.258187828+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":387,"timestamp":"2026-06-09T14:27:20.273467653+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":388,"timestamp":"2026-06-09T14:27:20.275683536+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":389,"timestamp":"2026-06-09T14:27:20.363531848+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":390,"timestamp":"2026-06-09T14:27:20.913279141+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":391,"timestamp":"2026-06-09T14:27:30.283412772+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":392,"timestamp":"2026-06-09T14:36:12.348724338+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":393,"timestamp":"2026-06-09T14:36:35.801104688+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":394,"timestamp":"2026-06-09T14:36:35.801360842+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":395,"timestamp":"2026-06-09T14:36:40.814827883+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":396,"timestamp":"2026-06-09T14:36:40.81690388+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":397,"timestamp":"2026-06-09T14:36:40.906411438+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":398,"timestamp":"2026-06-09T14:36:45.818361553+07:00","level":"INFO","category":"OPENVPN","message":"Подключение установлено | IP: 10.0.8.35"}
{"id":399,"timestamp":"2026-06-09T14:39:49.630778729+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":400,"timestamp":"2026-06-09T14:39:49.640628044+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: signal: interrupt"}
{"id":401,"timestamp":"2026-06-10T11:22:14.2077741+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":402,"timestamp":"2026-06-10T11:22:14.208133747+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":403,"timestamp":"2026-06-10T11:22:19.236120903+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":404,"timestamp":"2026-06-10T11:22:19.23679943+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":405,"timestamp":"2026-06-10T11:22:19.239496308+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":406,"timestamp":"2026-06-10T11:22:19.983049406+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":407,"timestamp":"2026-06-10T11:22:29.254291058+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":408,"timestamp":"2026-06-10T11:29:03.811340245+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-10 11-29-03.wav"}
{"id":409,"timestamp":"2026-06-10T11:29:09.353395283+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel2 | Файл: 2026-06-10 11-29-09.wav"}
{"id":410,"timestamp":"2026-06-10T11:30:07.07773072+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":411,"timestamp":"2026-06-10T11:30:48.594206437+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":412,"timestamp":"2026-06-10T11:30:48.594429469+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":413,"timestamp":"2026-06-10T11:30:53.607825386+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":414,"timestamp":"2026-06-10T11:30:53.609844339+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":415,"timestamp":"2026-06-10T11:30:53.682034323+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":416,"timestamp":"2026-06-10T11:30:54.288533419+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":417,"timestamp":"2026-06-10T11:31:03.615811098+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":418,"timestamp":"2026-06-10T11:31:35.261670944+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":419,"timestamp":"2026-06-10T11:32:25.278259084+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":420,"timestamp":"2026-06-10T11:32:25.278742484+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":421,"timestamp":"2026-06-10T11:32:30.290665318+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":422,"timestamp":"2026-06-10T11:32:30.292645106+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":423,"timestamp":"2026-06-10T11:32:30.369138314+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":424,"timestamp":"2026-06-10T11:32:30.927059895+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":425,"timestamp":"2026-06-10T11:32:40.301606311+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":426,"timestamp":"2026-06-10T12:15:54.063277941+07:00","level":"WARNING","category":"WIREGUARD","message":"Подключение потеряно"}
{"id":427,"timestamp":"2026-06-10T12:15:59.07607262+07:00","level":"INFO","category":"WIREGUARD","message":"Переподключение WireGuard"}
{"id":428,"timestamp":"2026-06-10T12:16:01.169576156+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":429,"timestamp":"2026-06-10T12:16:10.298109453+07:00","level":"INFO","category":"OPENVPN","message":"Подключение установлено | IP: 10.0.8.35"}
{"id":430,"timestamp":"2026-06-10T12:22:34.045864818+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка запуска: failed to set config: exit status 1"}
{"id":431,"timestamp":"2026-06-10T12:22:34.045927527+07:00","level":"ERROR","category":"WIREGUARD","message":"Ошибка переподключения: failed to set config: exit status 1"}
{"id":432,"timestamp":"2026-06-10T12:29:50.762449527+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-10 12-29-50.wav"}
{"id":433,"timestamp":"2026-06-10T12:31:09.804898834+07:00","level":"INFO","category":"RECORDING","message":"Запись: ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-10 12-29-50.wav | Длительность: 5м 0с | Размер: 2 MB"}
{"id":434,"timestamp":"2026-06-10T12:31:09.807941618+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-10 12-29-50.wav | Папка: 1-60рпропол-998-2026"}
{"id":435,"timestamp":"2026-06-10T12:37:10.352531773+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":436,"timestamp":"2026-06-10T13:12:47.020233582+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":437,"timestamp":"2026-06-10T13:12:47.031657155+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":438,"timestamp":"2026-06-10T13:12:52.046931708+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":439,"timestamp":"2026-06-10T13:12:52.04969342+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":440,"timestamp":"2026-06-10T13:12:52.130010364+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":441,"timestamp":"2026-06-10T13:12:52.507874042+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":442,"timestamp":"2026-06-10T13:13:02.05878545+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":443,"timestamp":"2026-06-10T13:14:01.404863738+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-10 13-14-01.wav"}
{"id":444,"timestamp":"2026-06-10T13:14:24.332423949+07:00","level":"INFO","category":"RECORDING","message":"Запись: ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-10 13-14-01.wav | Длительность: 5м 0с | Размер: 652 KB"}
{"id":445,"timestamp":"2026-06-10T13:14:24.334883655+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-10 13-14-01.wav | Папка: 1-60рпропол-998-2026"}
{"id":446,"timestamp":"2026-06-10T13:17:29.85417718+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":447,"timestamp":"2026-06-10T16:43:49.074091205+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":448,"timestamp":"2026-06-10T16:43:49.074598882+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":449,"timestamp":"2026-06-10T16:43:54.091037323+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":450,"timestamp":"2026-06-10T16:43:54.093176307+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":451,"timestamp":"2026-06-10T16:43:54.178072761+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":452,"timestamp":"2026-06-10T16:43:54.469945728+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":453,"timestamp":"2026-06-10T16:44:04.099343908+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":454,"timestamp":"2026-06-10T16:44:58.629865195+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":455,"timestamp":"2026-06-11T08:35:29.618048264+07:00","level":"INFO","category":"OPENVPN","message":"Восстановление подключения после перезагрузки"}
{"id":456,"timestamp":"2026-06-11T08:35:29.618542557+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: wireguard"}
{"id":457,"timestamp":"2026-06-11T08:35:34.643389231+07:00","level":"INFO","category":"WIREGUARD","message":"Запуск WireGuard | Интерфейс: wg0"}
{"id":458,"timestamp":"2026-06-11T08:35:34.645427059+07:00","level":"INFO","category":"OPENVPN","message":"Запуск OpenVPN | Конфиг: /home/dnd/pfSense-UDP4-1194-DND-config.ovpn"}
{"id":459,"timestamp":"2026-06-11T08:35:34.648114473+07:00","level":"INFO","category":"OPENVPN","message":"OpenVPN запущен, ожидание подключения..."}
{"id":460,"timestamp":"2026-06-11T08:35:34.858237227+07:00","level":"INFO","category":"WIREGUARD","message":"WireGuard запущен успешно"}
{"id":461,"timestamp":"2026-06-11T08:35:44.659283013+07:00","level":"WARNING","category":"OPENVPN","message":"Подключение не установлено, проверьте логи"}
{"id":462,"timestamp":"2026-06-11T08:36:12.603766985+07:00","level":"INFO","category":"OPENVPN","message":"Остановка OpenVPN"}
{"id":463,"timestamp":"2026-06-11T08:36:56.800733483+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":464,"timestamp":"2026-06-11T08:49:59.291459949+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":465,"timestamp":"2026-06-11T08:49:59.299236184+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":466,"timestamp":"2026-06-11T08:50:19.331116698+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 08-50-19.wav"}
{"id":467,"timestamp":"2026-06-11T08:50:41.215507399+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":468,"timestamp":"2026-06-11T08:50:41.233737179+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":469,"timestamp":"2026-06-11T08:50:51.784094037+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 08-50-51.wav"}
{"id":470,"timestamp":"2026-06-11T08:54:08.083840846+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":471,"timestamp":"2026-06-11T08:54:08.100799753+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":472,"timestamp":"2026-06-11T09:44:54.153781939+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":473,"timestamp":"2026-06-11T09:44:54.153831491+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":474,"timestamp":"2026-06-11T09:45:45.074318639+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":475,"timestamp":"2026-06-11T09:46:11.592258028+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":476,"timestamp":"2026-06-11T09:46:11.617861986+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":477,"timestamp":"2026-06-11T09:46:23.469837207+07:00","level":"INFO","category":"RECORDING","message":"Запись: ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_09-46-23.mp4 | Длительность: 1м 0с"}
{"id":478,"timestamp":"2026-06-11T09:46:53.180643045+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_09-46-23.mp4 | Папка: channel1"}
{"id":479,"timestamp":"2026-06-11T09:48:15.372621915+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":480,"timestamp":"2026-06-11T09:48:15.409122328+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":481,"timestamp":"2026-06-11T09:48:19.040243829+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 09-48-19.wav"}
{"id":482,"timestamp":"2026-06-11T09:48:21.686939937+07:00","level":"INFO","category":"VIDEO","message":"Синхронная запись запущена | Канал: channel1"}
{"id":483,"timestamp":"2026-06-11T09:48:21.686974575+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: mixed_2026-06-11_09-48-21.mp4 | Длительность: 1м 0с"}
{"id":484,"timestamp":"2026-06-11T09:51:53.13985635+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":485,"timestamp":"2026-06-11T09:51:53.139903325+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":486,"timestamp":"2026-06-11T09:52:54.519113025+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":487,"timestamp":"2026-06-11T09:53:28.771537241+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":488,"timestamp":"2026-06-11T09:53:28.805611157+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":489,"timestamp":"2026-06-11T09:53:34.978879667+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":490,"timestamp":"2026-06-11T09:53:35.013267378+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":491,"timestamp":"2026-06-11T09:53:41.762206646+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 09-53-41.wav"}
{"id":492,"timestamp":"2026-06-11T09:53:44.408841321+07:00","level":"INFO","category":"VIDEO","message":"Синхронная запись запущена | Канал: channel1"}
{"id":493,"timestamp":"2026-06-11T09:53:44.408888495+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: mixed_2026-06-11_09-53-44.mp4 | Длительность: 1м 0с"}
{"id":494,"timestamp":"2026-06-11T09:54:35.163192108+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":495,"timestamp":"2026-06-11T09:54:35.200703475+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":496,"timestamp":"2026-06-11T09:54:39.834784507+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 09-54-39.wav"}
{"id":497,"timestamp":"2026-06-11T09:55:35.2291069+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":498,"timestamp":"2026-06-11T09:55:35.229155868+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":499,"timestamp":"2026-06-11T10:09:26.562430876+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":500,"timestamp":"2026-06-11T10:09:28.575306705+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel1 | Файл: 2026-06-11 10-09-28.wav"}
{"id":501,"timestamp":"2026-06-11T10:10:30.62806718+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11 10-09-28.wav | Папка: channel1"}
{"id":502,"timestamp":"2026-06-11T10:10:30.629318697+07:00","level":"INFO","category":"RECORDING","message":"Запись: ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11 10-09-28.wav | Длительность: 1м 0с | Размер: 1 MB"}
{"id":503,"timestamp":"2026-06-11T10:10:30.63060279+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11 10-09-28.wav | Папка: channel1"}
{"id":504,"timestamp":"2026-06-11T10:15:20.893299271+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":505,"timestamp":"2026-06-11T10:15:20.934865403+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":506,"timestamp":"2026-06-11T10:15:24.14437315+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-15-24.mp4 | Длительность: 1м 0с"}
{"id":507,"timestamp":"2026-06-11T10:16:24.170745543+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-15-24.mp4 | Папка: channel1"}
{"id":508,"timestamp":"2026-06-11T10:16:24.171947322+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-15-24.mp4 | Длительность: 1м 0с | Размер: 14 MB"}
{"id":509,"timestamp":"2026-06-11T10:16:24.173207386+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-15-24.mp4 | Папка: channel1"}
{"id":510,"timestamp":"2026-06-11T10:19:12.257700588+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":511,"timestamp":"2026-06-11T10:19:12.257753979+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":512,"timestamp":"2026-06-11T10:21:58.452866241+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":513,"timestamp":"2026-06-11T10:22:22.243359639+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":514,"timestamp":"2026-06-11T10:22:22.28008747+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":515,"timestamp":"2026-06-11T10:22:25.896895117+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-22-25.mp4 | Длительность: 1м 0с"}
{"id":516,"timestamp":"2026-06-11T10:23:25.92267812+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-22-25.mp4 | Папка: channel1"}
{"id":517,"timestamp":"2026-06-11T10:23:25.923952866+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-22-25.mp4 | Длительность: 1м 0с | Размер: 14 MB"}
{"id":518,"timestamp":"2026-06-11T10:23:25.925154242+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-22-25.mp4 | Папка: channel1"}
{"id":519,"timestamp":"2026-06-11T10:29:44.019876674+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":520,"timestamp":"2026-06-11T10:29:44.029569614+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":521,"timestamp":"2026-06-11T10:30:58.457976195+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":522,"timestamp":"2026-06-11T10:31:23.153961679+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":523,"timestamp":"2026-06-11T10:31:23.190144689+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":524,"timestamp":"2026-06-11T10:31:26.328853046+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-31-26.mp4 | Длительность: 1м 0с"}
{"id":525,"timestamp":"2026-06-11T10:32:26.357400301+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-31-26.mp4 | Папка: channel1"}
{"id":526,"timestamp":"2026-06-11T10:32:26.358956941+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-31-26.mp4 | Длительность: 1м 0с | Размер: 6 MB"}
{"id":527,"timestamp":"2026-06-11T10:32:26.360142563+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-31-26.mp4 | Папка: channel1"}
{"id":528,"timestamp":"2026-06-11T10:32:44.038745727+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":529,"timestamp":"2026-06-11T10:32:44.074410691+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":530,"timestamp":"2026-06-11T10:32:46.293341921+07:00","level":"INFO","category":"RECORDING","message":"Запись: ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-32-46.mp4 | Длительность: 1м 0с"}
{"id":531,"timestamp":"2026-06-11T10:33:46.320126373+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-32-46.mp4 | Папка: channel1"}
{"id":532,"timestamp":"2026-06-11T10:33:46.321464394+07:00","level":"INFO","category":"RECORDING","message":"Запись: ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-32-46.mp4 | Длительность: 1м 0с | Размер: 5 MB"}
{"id":533,"timestamp":"2026-06-11T10:33:46.322704982+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-32-46.mp4 | Папка: channel1"}
{"id":534,"timestamp":"2026-06-11T10:36:23.861819985+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":535,"timestamp":"2026-06-11T10:36:23.861870127+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":536,"timestamp":"2026-06-11T10:37:02.23998958+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":537,"timestamp":"2026-06-11T10:37:32.898081319+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":538,"timestamp":"2026-06-11T10:37:32.933999337+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":539,"timestamp":"2026-06-11T10:37:38.267008225+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-37-38.mp4 | Длительность: 30с"}
{"id":540,"timestamp":"2026-06-11T10:38:08.293871402+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-37-38.mp4 | Папка: channel1"}
{"id":541,"timestamp":"2026-06-11T10:38:08.295066178+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-37-38.mp4 | Длительность: 30с | Размер: 3 MB"}
{"id":542,"timestamp":"2026-06-11T10:38:08.296314264+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-37-38.mp4 | Папка: channel1"}
{"id":543,"timestamp":"2026-06-11T10:41:22.842677909+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":544,"timestamp":"2026-06-11T10:41:22.852317478+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":545,"timestamp":"2026-06-11T10:42:03.403988903+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":546,"timestamp":"2026-06-11T10:42:32.283055534+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":547,"timestamp":"2026-06-11T10:42:32.318771179+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":548,"timestamp":"2026-06-11T10:42:36.62756771+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_10-42-36.mp4 | Длительность: 30с"}
{"id":549,"timestamp":"2026-06-11T10:43:05.189238622+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel2 | настройки канала = сохранены"}
{"id":550,"timestamp":"2026-06-11T10:43:05.225466874+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel2 | расписание = обновлено"}
{"id":551,"timestamp":"2026-06-11T10:43:06.754044528+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-42-36.mp4 | Папка: channel1"}
{"id":552,"timestamp":"2026-06-11T10:43:06.756317516+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_10-42-36.mp4 | Длительность: 30с | Размер: 3 MB"}
{"id":553,"timestamp":"2026-06-11T10:43:06.75937835+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_10-42-36.mp4 | Папка: channel1"}
{"id":554,"timestamp":"2026-06-11T10:53:27.429892733+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":555,"timestamp":"2026-06-11T10:53:27.429936113+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":556,"timestamp":"2026-06-11T10:54:10.784084627+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":557,"timestamp":"2026-06-11T10:56:01.776853926+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":558,"timestamp":"2026-06-11T10:56:01.776950924+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":559,"timestamp":"2026-06-11T10:59:32.659514977+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":560,"timestamp":"2026-06-11T11:00:31.614430359+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":561,"timestamp":"2026-06-11T11:00:31.614500059+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":562,"timestamp":"2026-06-11T11:01:08.599136417+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":563,"timestamp":"2026-06-11T11:02:10.813431805+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel2 | Файл: 2026-06-11 11-02-10.wav"}
{"id":564,"timestamp":"2026-06-11T11:02:14.436979351+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11 11-02-10.wav | Папка: channel2"}
{"id":565,"timestamp":"2026-06-11T11:02:28.481497673+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":566,"timestamp":"2026-06-11T11:02:28.523921345+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":567,"timestamp":"2026-06-11T11:02:42.729306265+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel2 | настройки канала = сохранены"}
{"id":568,"timestamp":"2026-06-11T11:02:42.765541152+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel2 | расписание = обновлено"}
{"id":569,"timestamp":"2026-06-11T11:02:48.42043759+07:00","level":"INFO","category":"RECORDING","message":"Запись: НАЧАЛО | Канал: channel2 | Файл: 2026-06-11 11-02-48.wav"}
{"id":570,"timestamp":"2026-06-11T11:02:50.808265977+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_11-02-50.mp4 | Длительность: 30с"}
{"id":571,"timestamp":"2026-06-11T11:03:20.890651828+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_11-02-50.mp4 | Папка: channel1"}
{"id":572,"timestamp":"2026-06-11T11:03:20.894952626+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-11_11-02-50.mp4 | Длительность: 30с | Размер: 5 MB"}
{"id":573,"timestamp":"2026-06-11T11:03:20.89626573+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_11-02-50.mp4 | Папка: channel1"}
{"id":574,"timestamp":"2026-06-11T11:03:50.473642035+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: | Папка: channel2"}
{"id":575,"timestamp":"2026-06-11T11:03:50.474943678+07:00","level":"INFO","category":"RECORDING","message":"Запись: ЗАВЕРШЕНА | Канал: channel2 | Файл: | Длительность: 1м 0с | Размер: 237 KB"}
{"id":576,"timestamp":"2026-06-11T11:03:50.476165766+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: | Папка: channel2"}
{"id":577,"timestamp":"2026-06-11T13:09:07.630033285+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":578,"timestamp":"2026-06-11T13:09:07.630086756+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":579,"timestamp":"2026-06-11T13:14:25.129752539+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":580,"timestamp":"2026-06-11T13:15:24.5001539+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_11-02-50.mp4"}
{"id":581,"timestamp":"2026-06-11T13:15:24.51208185+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel2 | Файл: 2026-06-11 11-02-48.wav"}
{"id":582,"timestamp":"2026-06-11T13:15:24.514134374+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel2 | Файл: 2026-06-11 11-02-10.wav"}
{"id":583,"timestamp":"2026-06-11T13:15:24.515798689+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-42-36.mp4"}
{"id":584,"timestamp":"2026-06-11T13:15:24.517229028+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-37-38.mp4"}
{"id":585,"timestamp":"2026-06-11T13:15:24.518623483+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-32-46.mp4"}
{"id":586,"timestamp":"2026-06-11T13:15:24.52021845+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-31-26.mp4"}
{"id":587,"timestamp":"2026-06-11T13:15:24.52182986+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-22-25.mp4"}
{"id":588,"timestamp":"2026-06-11T13:15:24.523754885+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_10-15-24.mp4"}
{"id":589,"timestamp":"2026-06-11T13:15:24.525294561+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11 10-09-28.wav"}
{"id":590,"timestamp":"2026-06-11T13:15:24.527543959+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11 09-54-39.wav"}
{"id":591,"timestamp":"2026-06-11T13:15:24.529484369+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11 09-53-41.wav"}
{"id":592,"timestamp":"2026-06-11T13:15:24.531247858+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11 09-48-19.wav"}
{"id":593,"timestamp":"2026-06-11T13:15:28.878305767+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_13-15-28.mp4 | Длительность: 30с"}
{"id":594,"timestamp":"2026-06-11T13:15:47.353360178+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_13-15-28.mp4 | Папка: channel1"}
{"id":595,"timestamp":"2026-06-11T13:18:26.601844508+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-11_13-15-28.mp4"}
{"id":596,"timestamp":"2026-06-11T13:18:30.987537463+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":597,"timestamp":"2026-06-11T13:18:30.987570164+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":598,"timestamp":"2026-06-11T13:23:06.21109956+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":599,"timestamp":"2026-06-11T13:32:04.941477287+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":600,"timestamp":"2026-06-11T13:32:04.941708818+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":601,"timestamp":"2026-06-11T13:32:42.766367315+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":602,"timestamp":"2026-06-11T13:39:40.541435791+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-11_13-39-40.mp4 | Длительность: 30с"}
{"id":603,"timestamp":"2026-06-11T13:39:46.674050011+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-11_13-39-40.mp4 | Папка: channel1"}
{"id":604,"timestamp":"2026-06-11T13:42:46.898249625+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":605,"timestamp":"2026-06-11T13:42:46.898433815+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":606,"timestamp":"2026-06-11T13:43:29.732505755+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":607,"timestamp":"2026-06-11T13:51:54.929275479+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":608,"timestamp":"2026-06-11T13:51:54.929315445+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":609,"timestamp":"2026-06-11T13:52:32.121275924+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":610,"timestamp":"2026-06-11T14:04:03.887180812+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":611,"timestamp":"2026-06-11T14:04:03.8970172+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":612,"timestamp":"2026-06-11T14:05:17.084311691+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":613,"timestamp":"2026-06-29T10:56:48.339282449+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":614,"timestamp":"2026-06-29T10:57:21.194589798+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":615,"timestamp":"2026-06-29T10:57:21.220990959+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":616,"timestamp":"2026-06-29T10:57:31.962777877+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-29_10-57-31.mp4 | Длительность: 30с"}
{"id":617,"timestamp":"2026-06-29T10:57:39.472445785+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | настройки канала = сохранены"}
{"id":618,"timestamp":"2026-06-29T10:57:39.498962706+07:00","level":"SETTINGS","category":"SETTINGS","message":"Изменение настроек | Канал: channel1 | расписание = обновлено"}
{"id":619,"timestamp":"2026-06-29T10:58:01.330862182+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-29_10-11-08.mp4"}
{"id":620,"timestamp":"2026-06-29T10:58:01.331117313+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-29_10-37-31.mp4"}
{"id":621,"timestamp":"2026-06-29T10:58:01.331334986+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-29_10-50-13.mp4"}
{"id":622,"timestamp":"2026-06-29T10:58:01.331517565+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-29_10-52-06.mp4"}
{"id":623,"timestamp":"2026-06-29T10:58:02.056400876+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-29_10-57-31.mp4 | Папка: channel1"}
{"id":624,"timestamp":"2026-06-29T10:58:02.063339452+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО ЗАВЕРШЕНА | Канал: channel1 | Файл: 2026-06-29_10-57-31.mp4 | Длительность: 5м 0с | Размер: 5 MB"}
{"id":625,"timestamp":"2026-06-29T10:58:02.064770672+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-29_10-57-31.mp4 | Папка: channel1"}
{"id":626,"timestamp":"2026-06-29T10:58:03.086034403+07:00","level":"INFO","category":"RECORDING","message":"Запись: АУДИО+ВИДЕО НАЧАЛО | Канал: channel1 | Файл: 2026-06-29_10-58-03.mp4 | Длительность: 5м 0с"}
{"id":627,"timestamp":"2026-06-29T10:59:07.551831105+07:00","level":"INFO","category":"SMB","message":"Добавлен в очередь повторных попыток | Файл: 2026-06-29_10-58-03.mp4 | Папка: channel1"}
{"id":628,"timestamp":"2026-06-29T10:59:22.499937485+07:00","level":"INFO","category":"RECORDING","message":"Удаление записи | Канал: channel1 | Файл: 2026-06-29_10-57-31.mp4"}
{"id":629,"timestamp":"2026-06-29T16:40:31.384011033+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":630,"timestamp":"2026-06-29T16:42:36.847734993+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":631,"timestamp":"2026-06-29T16:42:36.847877592+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":632,"timestamp":"2026-06-29T16:43:31.310739681+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":633,"timestamp":"2026-06-29T16:44:23.981849444+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":634,"timestamp":"2026-06-29T16:44:23.982000986+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":635,"timestamp":"2026-06-29T16:49:15.658613706+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":636,"timestamp":"2026-06-29T16:52:56.798355055+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":637,"timestamp":"2026-06-29T16:52:56.798535335+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":638,"timestamp":"2026-06-29T16:53:48.090223538+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":640,"timestamp":"2026-06-30T08:57:48.086637046+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":641,"timestamp":"2026-06-30T08:57:48.086798773+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":642,"timestamp":"2026-06-30T09:15:04.012088125+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":643,"timestamp":"2026-06-30T09:18:31.358290161+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":644,"timestamp":"2026-06-30T09:18:31.358444317+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":645,"timestamp":"2026-06-30T09:20:07.902625101+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":646,"timestamp":"2026-06-30T09:24:48.072743806+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":647,"timestamp":"2026-06-30T09:24:48.072809494+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":648,"timestamp":"2026-06-30T09:30:43.339852548+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":649,"timestamp":"2026-06-30T09:37:35.575173792+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":650,"timestamp":"2026-06-30T09:37:35.575299961+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
{"id":651,"timestamp":"2026-06-30T09:38:18.944801215+07:00","level":"INFO","category":"VPN","message":"VPN Manager инициализирован | VPN по умолчанию: none"}
{"id":652,"timestamp":"2026-06-30T09:52:29.117871183+07:00","level":"INFO","category":"VPN","message":"Остановка всех VPN клиентов"}
{"id":653,"timestamp":"2026-06-30T09:52:29.117917202+07:00","level":"INFO","category":"VPN","message":"Все VPN клиенты остановлены"}
+83 -2
View File
@@ -37,6 +37,8 @@ type Channel struct {
// Видео настройки
VideoDevice string `json:"video_device"`
VideoDeviceType string `json:"video_device_type"` // "usb", "ip", "rtsp"
VideoRTSPUrl string `json:"video_rtsp_url"`
VideoResolution string `json:"video_resolution"`
VideoFramerate int `json:"video_framerate"`
VideoBitrate int `json:"video_bitrate"`
@@ -63,7 +65,6 @@ type Channel struct {
stopOnce sync.Once
stopChan chan struct{}
}
type ChannelConfig struct {
ChannelID string `json:"channel_id"`
ChannelName string `json:"channel_name"`
@@ -369,7 +370,7 @@ func (ch *Channel) startAudioRecording(outputDir string, testDeviceFunc func(str
}
// supportsMJPEG - проверяет поддержку MJPEG формата камерой (только одно объявление!)
func supportsMJPEG(device string) bool {
func SupportsMJPEG(device string) bool {
cmd := exec.Command("v4l2-ctl", "-d", device, "--list-formats-ext")
output, err := cmd.Output()
if err != nil {
@@ -1147,3 +1148,83 @@ func (ch *Channel) IsRecordingActive() bool {
defer ch.mu.RUnlock()
return ch.IsRecording
}
func (r *Recorder) loadChannelsFromDB() {
db := database.GetDB()
recordingsDir, _ := db.GetSetting("recordings_dir")
if recordingsDir == "" {
recordingsDir = r.OutputDir
}
channels, err := db.GetAllChannels()
if err != nil {
log.Printf("Error loading channels from DB: %v", err)
return
}
// Для ARM добавляем задержку между загрузкой каналов
delay := 0
if optimization.IsARM() {
delay = 100 // миллисекунд
}
for _, chConfig := range channels {
channel := NewChannel(
chConfig.ID, chConfig.Name, chConfig.Device,
chConfig.Duration, chConfig.SampleRate, chConfig.Channels,
chConfig.Format, chConfig.AutoRestart, recordingsDir,
)
channel.SMBFolder = chConfig.SMBFolder
// Загрузка типа канала
channel.ChannelType = chConfig.ChannelType
if channel.ChannelType == "" {
channel.ChannelType = "audio"
}
// Загрузка видео настроек
channel.VideoDevice = chConfig.VideoDevice
channel.VideoDeviceType = chConfig.VideoDeviceType
if channel.VideoDeviceType == "" {
channel.VideoDeviceType = "usb"
}
channel.VideoRTSPUrl = chConfig.VideoRTSPUrl
channel.VideoResolution = chConfig.VideoResolution
channel.VideoFramerate = chConfig.VideoFramerate
channel.VideoBitrate = chConfig.VideoBitrate
channel.VideoCodec = chConfig.VideoCodec
channel.VideoAudioOffset = chConfig.VideoAudioOffset
log.Printf("Loaded channel %s from database (type: %s, video_type: %s, video_device: %s, rtsp_url: %s)",
chConfig.ID, channel.ChannelType, channel.VideoDeviceType, channel.VideoDevice, channel.VideoRTSPUrl)
// Загрузка расписания
schedule, _ := db.GetSchedule(chConfig.ID)
if schedule != nil {
channel.ScheduleEnabled = schedule.Enabled
channel.StartDate = schedule.StartDate
channel.StartTime = schedule.StartTime
channel.EndDate = schedule.EndDate
channel.EndTime = schedule.EndTime
channel.RepeatDaily = schedule.RepeatDaily
if schedule.Enabled {
go func(ch *Channel) {
sleepTime := 2 * time.Second
if optimization.IsARM() {
sleepTime = 3 * time.Second
}
time.Sleep(sleepTime)
ch.StartSchedule()
}(channel)
}
}
r.channels[channel.ID] = channel
os.MkdirAll(filepath.Join(recordingsDir, channel.ID), 0755)
log.Printf("Loaded channel %s from database", chConfig.ID)
if delay > 0 {
time.Sleep(time.Duration(delay) * time.Millisecond)
}
}
}
-72
View File
@@ -31,78 +31,6 @@ func NewRecorder(outputDir string) *Recorder {
return r
}
func (r *Recorder) loadChannelsFromDB() {
db := database.GetDB()
recordingsDir, _ := db.GetSetting("recordings_dir")
if recordingsDir == "" {
recordingsDir = r.OutputDir
}
channels, err := db.GetAllChannels()
if err != nil {
log.Printf("Error loading channels from DB: %v", err)
return
}
delay := 0
if optimization.IsARM() {
delay = 100
}
for _, chConfig := range channels {
channel := NewChannel(
chConfig.ID, chConfig.Name, chConfig.Device,
chConfig.Duration, chConfig.SampleRate, chConfig.Channels,
chConfig.Format, chConfig.AutoRestart, recordingsDir,
)
channel.SMBFolder = chConfig.SMBFolder
// Загрузка типа канала и видео настроек из БД
channel.ChannelType = chConfig.ChannelType
if channel.ChannelType == "" {
channel.ChannelType = "audio"
}
channel.VideoDevice = chConfig.VideoDevice
channel.VideoResolution = chConfig.VideoResolution
channel.VideoFramerate = chConfig.VideoFramerate
channel.VideoBitrate = chConfig.VideoBitrate
channel.VideoCodec = chConfig.VideoCodec
channel.VideoAudioOffset = chConfig.VideoAudioOffset
log.Printf("Loaded channel %s from database (type: %s, video_device: %s)",
chConfig.ID, channel.ChannelType, channel.VideoDevice)
schedule, _ := db.GetSchedule(chConfig.ID)
if schedule != nil {
channel.ScheduleEnabled = schedule.Enabled
channel.StartDate = schedule.StartDate
channel.StartTime = schedule.StartTime
channel.EndDate = schedule.EndDate
channel.EndTime = schedule.EndTime
channel.RepeatDaily = schedule.RepeatDaily
if schedule.Enabled {
go func(ch *Channel) {
sleepTime := 2 * time.Second
if optimization.IsARM() {
sleepTime = 3 * time.Second
}
time.Sleep(sleepTime)
ch.StartSchedule()
}(channel)
}
}
r.channels[channel.ID] = channel
os.MkdirAll(filepath.Join(recordingsDir, channel.ID), 0755)
log.Printf("Loaded channel %s from database", chConfig.ID)
if delay > 0 {
time.Sleep(time.Duration(delay) * time.Millisecond)
}
}
}
// AddChannel добавляет новый канал
func (r *Recorder) AddChannel(channel *Channel) {
r.mu.Lock()
Binary file not shown.
Binary file not shown.
+186
View File
@@ -1,6 +1,7 @@
package server
import (
"bufio"
"embed"
"encoding/binary"
"encoding/json"
@@ -2634,3 +2635,188 @@ func GetVideoDuration(filePath string) int {
return int(durationFloat)
}
// HandleVideoStream - потоковая передача видео для онлайн просмотра
func HandleVideoStream(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet && r.Method != http.MethodHead {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
channelID := r.URL.Query().Get("channel")
if channelID == "" {
sendJSONError(w, "Channel ID required", http.StatusBadRequest)
return
}
log.Printf("Video stream request for channel %s", channelID)
ch, exists := RecorderInstance.GetChannel(channelID)
if !exists {
log.Printf("Channel %s not found", channelID)
sendJSONError(w, "Channel not found", http.StatusNotFound)
return
}
// Проверяем что канал имеет видео
if ch.ChannelType != "video" && ch.ChannelType != "both" {
sendJSONError(w, "Channel does not support video", http.StatusBadRequest)
return
}
// Проверяем видео устройство
var inputArgs []string
var videoDevice string
switch ch.VideoDeviceType {
case "usb":
if ch.VideoDevice == "" {
sendJSONError(w, "Video device not configured", http.StatusBadRequest)
return
}
videoDevice = ch.VideoDevice
inputArgs = []string{"-f", "v4l2"}
if recorder.SupportsMJPEG(videoDevice) {
inputArgs = append(inputArgs, "-input_format", "mjpeg")
}
framerate := 15
if ch.VideoFramerate > 0 {
framerate = ch.VideoFramerate
}
resolution := "640x480"
if ch.VideoResolution != "" {
resolution = ch.VideoResolution
}
inputArgs = append(inputArgs, "-framerate", strconv.Itoa(framerate),
"-video_size", resolution, "-i", videoDevice)
case "rtsp", "ip":
if ch.VideoRTSPUrl == "" {
sendJSONError(w, "RTSP URL not configured", http.StatusBadRequest)
return
}
if ch.VideoDeviceType == "rtsp" {
inputArgs = []string{
"-rtsp_transport", "tcp",
"-rtsp_flags", "prefer_tcp",
"-stimeout", "5000000",
"-i", ch.VideoRTSPUrl,
}
} else {
inputArgs = []string{"-i", ch.VideoRTSPUrl}
}
default:
sendJSONError(w, "Unsupported video device type", http.StatusBadRequest)
return
}
// Для HEAD запроса просто проверяем доступность
if r.Method == http.MethodHead {
w.Header().Set("Content-Type", "video/mp4")
w.WriteHeader(http.StatusOK)
return
}
log.Printf("Starting video stream for channel %s", channelID)
w.Header().Set("Content-Type", "video/mp4")
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
w.Header().Set("Connection", "keep-alive")
w.Header().Set("Access-Control-Allow-Origin", "*")
flusher, ok := w.(http.Flusher)
if !ok {
log.Printf("Streaming not supported")
sendJSONError(w, "Streaming not supported", http.StatusInternalServerError)
return
}
// Формируем команду ffmpeg для стрима
args := []string{}
// Добавляем входные аргументы
args = append(args, inputArgs...)
// Добавляем параметры вывода для MP4 фрагментов
args = append(args,
"-f", "mp4",
"-movflags", "frag_keyframe+empty_moov",
"-c:v", "libx264",
"-preset", "ultrafast",
"-tune", "zerolatency",
"-crf", "30",
"-pix_fmt", "yuv420p",
"-g", "60",
"-b:v", "800k",
"-",
)
cmd := exec.Command("ffmpeg", args...)
log.Printf("Video stream command: ffmpeg %v", args)
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Printf("Error creating stdout pipe: %v", err)
sendJSONError(w, err.Error(), http.StatusInternalServerError)
return
}
stderr, err := cmd.StderrPipe()
if err != nil {
log.Printf("Error creating stderr pipe: %v", err)
sendJSONError(w, err.Error(), http.StatusInternalServerError)
return
}
if err := cmd.Start(); err != nil {
log.Printf("Error starting ffmpeg: %v", err)
sendJSONError(w, err.Error(), http.StatusInternalServerError)
return
}
// Логируем stderr
go func() {
scanner := bufio.NewScanner(stderr)
for scanner.Scan() {
line := scanner.Text()
log.Printf("ffmpeg stream: %s", line)
}
}()
// Буфер для данных
buffer := make([]byte, 8192)
done := make(chan struct{})
go func() {
for {
select {
case <-r.Context().Done():
log.Printf("Video stream client disconnected for channel %s", channelID)
cmd.Process.Kill()
close(done)
return
default:
n, err := stdout.Read(buffer)
if err != nil {
log.Printf("Video stream read error: %v", err)
close(done)
return
}
if n > 0 {
if _, err := w.Write(buffer[:n]); err != nil {
log.Printf("Video stream write error: %v", err)
cmd.Process.Kill()
close(done)
return
}
flusher.Flush()
}
}
}
}()
<-done
cmd.Wait()
log.Printf("Video stream ended for channel %s", channelID)
}
+1 -1
View File
@@ -121,7 +121,7 @@ func (s *Server) SetupRoutes() {
// ========== Live Stream ==========
mux.HandleFunc("/api/live-stream", CORSMiddleware(AuthMiddleware(HandleLiveStream)))
mux.HandleFunc("/api/video-stream", CORSMiddleware(AuthMiddleware(HandleVideoStream)))
// ========== Логи ==========
mux.HandleFunc("/api/logs", CORSMiddleware(AuthMiddleware(HandleGetLogs)))
mux.HandleFunc("/api/logs/clear", CORSMiddleware(AuthMiddleware(HandleClearLogs)))
+5 -4
View File
@@ -24,7 +24,7 @@
<button class="tab-btn" data-tab="logs">📋 Логи</button>
</div>
<!-- Вкладка: Состояние канала -->
<!-- Вкладка: Состояние канала -->
<div id="tab-channel" class="tab-content active">
<div class="channel-selector">
<label for="activeChannelSelect">Активный канал:</label>
@@ -32,7 +32,7 @@
<option value="">Загрузка каналов...</option>
</select>
</div>
<div class="status-card">
<h3>Состояние записи</h3>
<div class="status-indicator">
@@ -49,13 +49,13 @@
<span id="channelTypeDisplay" class="current-device">Аудио</span>
</div>
</div>
<div class="button-group">
<button id="startBtn" class="btn btn-start">▶ Начать запись</button>
<button id="stopBtn" class="btn btn-stop" disabled>⏹ Остановить</button>
</div>
</div>
<!-- Онлайн прослушивание (только для аудио) -->
<div id="liveStreamBlock" class="info-card">
<h3>🎧 Онлайн прослушивание</h3>
@@ -76,6 +76,7 @@
💡 Прослушивание аудио в реальном времени. Для работы требуется активная запись на канале.
</div>
</div>
<!-- Видео стрим (только для видео каналов) -->
<div id="videoStreamBlock" class="info-card" style="display: none;">
<h3>📹 Онлайн просмотр видео</h3>
+30 -1
View File
@@ -19,6 +19,7 @@ import {
loadSMBSettings, saveSMBSettings, testSMBConnection, toggleSmbPasswordVisibility
} from './modules/smb.js';
import { initLivePlayer, startLivePlayback, stopLivePlayback, setLiveVolume } from './modules/liveplayer.js';
import { initVideoStream, startVideoStream, stopVideoStream } from './modules/video_stream.js';
import {
loadOpenVPNSettings, saveOpenVPNSettings, startOpenVPN, stopOpenVPN,
toggleOpenvpnPasswordVisibility, startStatusPolling as startOpenVPNPolling, stopStatusPolling as stopOpenVPNPolling
@@ -140,6 +141,21 @@ function bindEventHandlers() {
liveVolume._hasHandler = true;
}
// Видео стрим
const playVideoStreamBtn = document.getElementById('playVideoStreamBtn');
if (playVideoStreamBtn && !playVideoStreamBtn._hasHandler) {
playVideoStreamBtn.onclick = () => startVideoStream(getCurrentChannelId());
playVideoStreamBtn._hasHandler = true;
console.log('Play video stream button handler attached');
}
const stopVideoStreamBtn = document.getElementById('stopVideoStreamBtn');
if (stopVideoStreamBtn && !stopVideoStreamBtn._hasHandler) {
stopVideoStreamBtn.onclick = stopVideoStream;
stopVideoStreamBtn._hasHandler = true;
console.log('Stop video stream button handler attached');
}
const saveConfigBtn = document.getElementById('saveChannelConfigBtn');
if (saveConfigBtn && !saveConfigBtn._hasHandler) {
saveConfigBtn.onclick = saveChannelConfig;
@@ -217,6 +233,7 @@ function bindEventHandlers() {
logoutBtn.onclick = async () => {
disconnectWebSocket();
stopLivePlayback();
stopVideoStream();
await logout();
};
logoutBtn._hasHandler = true;
@@ -227,6 +244,7 @@ function bindEventHandlers() {
if (channelSelect && !channelSelect._hasHandler) {
channelSelect.onchange = (e) => {
if (e.target.value) {
stopVideoStream();
selectChannel(e.target.value, false);
}
};
@@ -237,8 +255,9 @@ function bindEventHandlers() {
if (activeChannelSelect && !activeChannelSelect._hasHandler) {
activeChannelSelect.onchange = (e) => {
if (e.target.value) {
selectChannel(e.target.value, false);
stopVideoStream();
stopLivePlayback();
selectChannel(e.target.value, false);
}
};
activeChannelSelect._hasHandler = true;
@@ -620,6 +639,7 @@ document.addEventListener('DOMContentLoaded', async () => {
console.log('DOM загружен, инициализация приложения...');
initLivePlayer();
initVideoStream();
const isAuth = await checkAuth();
if (!isAuth) return;
@@ -688,8 +708,16 @@ document.addEventListener('DOMContentLoaded', async () => {
await loadChannels(true);
}, 5000);
// ========== ОБРАБОТЧИК TAB CHANGED ВНУТРИ DOMContentLoaded ==========
document.addEventListener('tabChanged', async (e) => {
const tabId = e.detail.tabId;
// Если переключаемся не на вкладку channel - останавливаем стримы
if (tabId !== 'channel') {
stopVideoStream();
stopLivePlayback();
}
if (tabId === 'archive') {
await loadRecordings();
}
@@ -773,6 +801,7 @@ window.addEventListener('beforeunload', () => {
}
disconnectWebSocket();
stopLivePlayback();
stopVideoStream();
stopOpenVPNPolling();
stopTimeUpdater();
});
+22 -2
View File
@@ -288,7 +288,6 @@ export async function selectChannel(channelId, skipConfigLoad = false) {
await loadStatus();
await loadSchedule(channelId);
// Обновляем отображение типа канала
if (config) {
updateChannelTypeDisplay(config);
}
@@ -555,10 +554,13 @@ function applyConfigToForm(config) {
const deleteBtn = document.getElementById('deleteChannelBtn');
if (deleteBtn) deleteBtn.style.display = 'block';
}
// ====== ИСПРАВЛЕННАЯ ФУНКЦИЯ updateChannelTypeDisplay ======
function updateChannelTypeDisplay(config) {
const channelTypeSpan = document.getElementById('infoChannelType');
const channelTypeDisplay = document.getElementById('channelTypeDisplay');
const liveStreamBlock = document.getElementById('liveStreamBlock');
const videoStreamBlock = document.getElementById('videoStreamBlock');
const type = config.channel_type || 'audio';
let typeText = '';
@@ -584,11 +586,29 @@ function updateChannelTypeDisplay(config) {
if (channelTypeSpan) channelTypeSpan.textContent = typeIcon + ' ' + typeText;
if (channelTypeDisplay) channelTypeDisplay.textContent = typeIcon + ' ' + typeText;
// Показываем/скрываем блок онлайн прослушивания (только для аудио)
// Показываем/скрываем блок аудио стрима (только для audio и both)
if (liveStreamBlock) {
liveStreamBlock.style.display = (type === 'audio' || type === 'both') ? 'block' : 'none';
}
// Показываем/скрываем блок видео стрима (только для video и both)
if (videoStreamBlock) {
videoStreamBlock.style.display = (type === 'video' || type === 'both') ? 'block' : 'none';
}
// Показываем/скрываем аудио информацию (только для audio и both)
const audioInfoBlock = document.getElementById('audioInfoBlock');
if (audioInfoBlock) {
audioInfoBlock.style.display = (type === 'audio' || type === 'both') ? 'block' : 'none';
}
// Показываем/скрываем видео информацию (только для video и both)
const videoInfoBlock = document.getElementById('videoInfoBlock');
if (videoInfoBlock) {
videoInfoBlock.style.display = (type === 'video' || type === 'both') ? 'block' : 'none';
}
}
function updateChannelInfo(config) {
const channelType = config.channel_type || 'audio';
+172
View File
@@ -0,0 +1,172 @@
// frontend/js/modules/video_stream.js
import { showNotification } from './ui.js';
let videoStream = null;
let isStreaming = false;
let currentChannel = null;
let streamRetryCount = 0;
const MAX_RETRIES = 3;
let abortController = null;
export function initVideoStream() {
videoStream = document.getElementById('videoStream');
if (!videoStream) {
videoStream = document.createElement('video');
videoStream.id = 'videoStream';
videoStream.controls = true;
videoStream.autoplay = true;
videoStream.style.width = '100%';
videoStream.style.maxWidth = '640px';
videoStream.style.borderRadius = '8px';
videoStream.style.background = '#000';
const container = document.getElementById('videoStreamContainer');
if (container) {
container.appendChild(videoStream);
}
}
}
export async function startVideoStream(channelId) {
// Если уже стримим этот канал - ничего не делаем
if (isStreaming && currentChannel === channelId) {
console.log('Video stream already active for channel', channelId);
return;
}
// Останавливаем текущий стрим перед запуском нового
if (isStreaming) {
stopVideoStream();
// Даем время на освобождение ресурсов
await new Promise(resolve => setTimeout(resolve, 1000));
}
if (!channelId) {
showNotification('Сначала выберите канал', 'error');
return;
}
currentChannel = channelId;
streamRetryCount = 0;
const playBtn = document.getElementById('playVideoStreamBtn');
const stopBtn = document.getElementById('stopVideoStreamBtn');
const status = document.getElementById('videoStreamStatus');
const container = document.getElementById('videoStreamContainer');
if (playBtn) playBtn.disabled = true;
if (stopBtn) stopBtn.disabled = false;
if (status) {
status.textContent = 'Подключение...';
status.className = 'live-status buffering';
}
if (container) container.style.display = 'block';
try {
// Проверяем доступность стрима
const checkUrl = `/api/video-stream?channel=${channelId}`;
const response = await fetch(checkUrl, { method: 'HEAD' });
if (!response.ok) {
throw new Error(`Stream not available (${response.status})`);
}
// Создаем AbortController для отмены запроса
abortController = new AbortController();
const url = `${checkUrl}&t=${Date.now()}`;
videoStream.src = url;
videoStream.load();
// Убираем старые обработчики
videoStream.oncanplay = null;
videoStream.onerror = null;
videoStream.onended = null;
// Обработчик успешной загрузки
videoStream.oncanplay = function() {
if (!isStreaming) {
this.play().catch(err => {
console.log('Autoplay prevented:', err);
});
}
};
// Обработчик ошибок - без автоматического ретрая
videoStream.onerror = function(e) {
console.error('Video stream error:', e);
// Проверяем, не была ли это остановка пользователем
if (isStreaming) {
showNotification('Ошибка видеопотока', 'error');
stopVideoStream();
}
};
// При завершении потока - останавливаем
videoStream.onended = function() {
if (isStreaming) {
console.log('Video stream ended');
stopVideoStream();
}
};
await videoStream.play();
isStreaming = true;
if (status) {
status.textContent = '📹 Воспроизведение...';
status.className = 'live-status playing';
}
showNotification('Начат просмотр видео канала ' + channelId, 'success');
} catch (error) {
console.error('Video stream error:', error);
// Не ретраим, просто показываем ошибку
showNotification('Ошибка подключения к видеопотоку: ' + error.message, 'error');
stopVideoStream();
}
}
export function stopVideoStream() {
// Прерываем все запросы
if (abortController) {
abortController.abort();
abortController = null;
}
if (videoStream) {
videoStream.pause();
// Убираем обработчики чтобы они не вызывались после остановки
videoStream.oncanplay = null;
videoStream.onerror = null;
videoStream.onended = null;
// Не очищаем src полностью, чтобы можно было перезапустить
// но удаляем источник чтобы остановить загрузку
videoStream.removeAttribute('src');
videoStream.load();
}
isStreaming = false;
currentChannel = null;
streamRetryCount = 0;
const playBtn = document.getElementById('playVideoStreamBtn');
const stopBtn = document.getElementById('stopVideoStreamBtn');
const status = document.getElementById('videoStreamStatus');
const container = document.getElementById('videoStreamContainer');
if (playBtn) playBtn.disabled = false;
if (stopBtn) stopBtn.disabled = true;
if (status) {
status.textContent = 'Остановлено';
status.className = 'live-status stopped';
}
if (container) container.style.display = 'none';
}
export function isVideoStreamActive() {
return isStreaming;
}
export function getCurrentVideoChannel() {
return currentChannel;
}
+61
View File
@@ -1011,4 +1011,65 @@ header h1 {
padding: 8px 14px;
font-size: 11px;
}
}
/* Video stream player */
.video-stream-player {
padding: 10px;
background: #0d0d0d;
border-radius: 8px;
}
.video-stream-player .stream-controls {
display: flex;
gap: 10px;
margin-bottom: 10px;
}
.video-stream-player .btn-live {
background: #30d158;
color: #ffffff;
}
.video-stream-player .btn-live:hover:not(:disabled) {
background: #2bb350;
}
.video-stream-player .btn-stop-live {
background: #ff3b30;
color: #ffffff;
}
.video-stream-player .btn-stop-live:hover:not(:disabled) {
background: #e6352b;
}
.video-stream-player .live-status {
margin-top: 10px;
padding: 4px 10px;
border-radius: 5px;
font-size: 10px;
text-align: center;
color: #ffffff;
}
.video-stream-player .live-status.playing {
background: #30d158;
color: #ffffff;
}
.video-stream-player .live-status.stopped {
background: #3a3a3a;
color: #aaaaaa;
}
.video-stream-player .live-status.buffering {
background: #ff9f0a;
color: #ffffff;
}
.video-stream-player video {
width: 100%;
max-width: 640px;
border-radius: 8px;
background: #000;
}