fix(install): LiveKit перезапускается при изменении конфига

LiveKit читает livekit.yaml только при старте, а compose не замечает правок в
примонтированном файле — из-за этого вебхуки не включались после обновления.
Установщик сравнивает sha256 конфига с сохранённым и перезапускает сервис.
This commit is contained in:
2026-09-20 18:38:54 +03:00
parent 9e7d023f7e
commit ecd7b3be10
27 changed files with 2637 additions and 37 deletions
+19
View File
@@ -30,6 +30,8 @@ import {
import { useFriendsStore } from '@/stores/friends';
import { useMessagesStore } from '@/stores/messages';
import { useSessionStore } from '@/stores/session';
import { useVoiceConnectionStore } from '@/stores/voiceConnection';
import { parseVoiceStateEvent } from '@/api/voice';
/**
* Состояние соединения со шлюзом. Данные приходят в session-store,
@@ -78,6 +80,8 @@ export const useGatewayStore = create<GatewayState>((set, get) => ({
useSessionStore.getState().reset();
// Сессия мертва: лента сообщений тоже больше не наша.
useMessagesStore.getState().reset();
// Голосовую комнату покидаем без запроса: сессии уже нет.
useVoiceConnectionStore.getState().reset();
void invalidateCurrentUser();
},
onResumeIncomplete: () => {
@@ -309,6 +313,21 @@ export function dispatchGatewayEvent(event: GatewayDispatch): void {
}
return;
}
case 'VOICE_STATE_UPDATE': {
// Лёг из комнаты или сменил флаги: единственный источник «кто в голосе».
const voice = parseVoiceStateEvent(event.d);
if (voice === null) {
return;
}
if (voice.kind === 'left') {
session.applyVoiceLeave(voice.guildId, voice.userId);
} else {
session.applyVoiceState(voice.state);
}
// server_mute/server_deaf и перемещение себя применяем к своей сессии.
useVoiceConnectionStore.getState().syncServerState();
return;
}
default:
// Неизвестные события игнорируем: контракт может расширяться.
return;