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
+51 -2
View File
@@ -44,6 +44,10 @@ export const PERMISSION_MANAGE_EMOJIS = 'MANAGE_EMOJIS';
export const PERMISSION_SEND_MESSAGES = 'SEND_MESSAGES';
export const PERMISSION_ATTACH_FILES = 'ATTACH_FILES';
export const PERMISSION_ADD_REACTIONS = 'ADD_REACTIONS';
export const PERMISSION_CONNECT_VOICE = 'CONNECT_VOICE';
export const PERMISSION_MUTE_MEMBERS = 'MUTE_MEMBERS';
export const PERMISSION_DEAFEN_MEMBERS = 'DEAFEN_MEMBERS';
export const PERMISSION_MOVE_MEMBERS = 'MOVE_MEMBERS';
/** Есть ли у пользователя право с указанным именем. */
export function hasPermission(permissions: readonly string[], name: string): boolean {
@@ -99,6 +103,52 @@ export function canAdministerGuild(
return isInstanceAdmin || canManageGuildSettings(permissions, ownerId, userId);
}
/** Права модератора голосовых комнат: что доступно пользователю на сервере. */
export interface VoiceModerationPermissions {
mute: boolean;
deafen: boolean;
move: boolean;
}
/**
* Права на голосовую модерацию (AGENT.md 7.14): серверный мьют, глушение и
* перемещение. Администратор инстанса видит все пункты, как и в остальном UI.
*/
export function voiceModerationPermissions(
permissions: readonly string[],
ownerId: string,
userId: string | undefined,
isInstanceAdmin = false,
): VoiceModerationPermissions {
if (isInstanceAdmin || (userId !== undefined && userId === ownerId)) {
return { mute: true, deafen: true, move: true };
}
const administrator = hasPermission(permissions, PERMISSION_ADMINISTRATOR);
return {
mute: administrator || hasPermission(permissions, PERMISSION_MUTE_MEMBERS),
deafen: administrator || hasPermission(permissions, PERMISSION_DEAFEN_MEMBERS),
move: administrator || hasPermission(permissions, PERMISSION_MOVE_MEMBERS),
};
}
/** Может ли пользователь войти в голосовую комнату. */
export function canConnectVoice(
permissions: readonly string[],
isInstanceAdmin = false,
channelCanConnect?: boolean,
): boolean {
if (channelCanConnect === false) {
return false;
}
if (isInstanceAdmin) {
return true;
}
return (
hasPermission(permissions, PERMISSION_ADMINISTRATOR) ||
hasPermission(permissions, PERMISSION_CONNECT_VOICE)
);
}
/**
* Может ли пользователь модерировать сообщения (удалять и закреплять чужие).
* Права приходят на уровне сервера, поэтому это приближение: сервер всё равно
@@ -137,8 +187,7 @@ export function canManageEmojis(
}
/** Может ли пользователь отправлять сообщения в комнату. */
export function canSendMessages(
permissions: readonly string[],
export function canSendMessages( permissions: readonly string[],
isInstanceAdmin = false,
channelCanSend?: boolean,
): boolean {