알림
Libre WebUI는 영구적인 사용자별 알림 받은 편지함을 유지하므로, 관련 페이지가 닫혀 있어도 멘션, 다이렉트 메시지, 공유, 자동화 실패와 캘린더 미리 알림 같은 팀 활동이 사용자에게 전달됩니다.
상태 팝업
변경 사항 저장이나 Git 작업 완료 같은 짧은 상태 메시지는 페이지 상단 근처에 표시됩니다. 포인터나 키보드로 닫기 버튼을 사용해 팝업을 지울 수 있습니다. 마우스를 올려 두면 메시지가 계속 표시되므로 끝까지 읽을 수 있습니다. 팝업을 닫으면 메시지만 사라지고, 해당 작업은 현재 상태를 그대로 유지합니다.
받은 편지함
알림은 우선 데이터베이스 행입니다. 제목과 본문은 저장 시 암호화되고 사용자당 500개로 제한되며 가장 오래된 항목부터 정리됩니다. 선택적 소스 키로 중복 제거하므로 같은 게시가 반복되어도 벨을 도배하지 않고 한 항목으로 합쳐집니다. RESTful 표면에서는 목록 조회, 읽지 않은 수 계산, 하나 또는 전체를 읽음으로 표시, 삭제가 가능합니다.
실시간 전달은 GET /api/notifications/events(SSE)를 통해 사용자별 영구 이벤트 스트림 notify:<userId>을 사용합니다. 스트림 ID는 클라이언트 입력이 아니라 인증된 세션에서 가져옵니다. SQL 받은 편지함이 계속 기준 데이터이므로 놓친 이벤트는 스트림 재생이 아닌 목록 읽기로 복구합니다.
알림이 생성되는 상황
| 유형 | 생성 시점 |
|---|---|
channel-dm | 다른 사람이 내게 다이렉트 메시지를 보냄 |
channel-mention | 채널에서 다른 사람이 나를 @mentions하거나 내 메시지에 답글을 남김 |
channel-invite | 채널에 추가됨 |
share | 다른 사람이 내게 리소스를 공유함 |
automation-failed | 알림을 끄지 않은 내 자동화 중 하나가 실패함 |
calendar-reminder | 미리 알림 오프셋이 있는 이벤트가 미리 알림 시각에 도달함 |
work-run-finished | 내가 고용한 Work 에이전트 중 하나가 실행을 완료함 |
work-run-attention | 고용한 에이전트가 입력을 기다리거나 오류로 중지됨 |
work-takeover | Work 에이전트가 화면 직접 조작을 요청함 |
work-approval | Work 실행이 부작용이 있는 작업의 승인을 기다림 |
system | 인스턴스 수준 공지 |
알림은 항상 영향을 받는 사용자에게만 게시됩니다. 채널 구성원이 아닌 사용자 이름을 멘션해도 아무것도 생성되지 않습니다.
알림은 자동화를 실행시킬 수도 있습니다. event 트리거가 있는
자동화는 선택한 유형의 알림이 소유자에게 도착할 때마다
실행되며, 자동화마다 1분의 쿨다운이 적용됩니다.
외부 Webhook
관리자는 팀 이벤트를 수신하는 Webhook 대상을 등록할 수 있습니다.
- 외부 통신 보호. 대상에는 도구 서버와 같은 목적지 정책이 적용됩니다. 정확한 URL이어야 하고 리디렉션을 허용하지 않으며, 관리자가
TOOLS_PRIVATE_NETWORK_ALLOWLIST로 호스트를 명시적으로 허용하지 않으면 비공개 또는 링크 로컬 주소를 사용할 수 없습니다. 전달할 때마다 호스트 이름을 다시 확인하고 검사합니다. - 서명됨. 비밀 값이 구성되어 있으면 모든 전달에 정확한 본문으로 계산한
X-Libre-Signature: sha256=<hmac>가 포함됩니다. - 민감 정보 제거. 봉투에는 이벤트 종류, 알림 유형, 제목, 식별자와 타임스탬프가 포함됩니다. 알림 본문, 메시지 콘텐츠, 프롬프트와 문서는 인스턴스 밖으로 절대 나가지 않습니다.
- 영구적. 전달은 제한된 재시도를 갖춘 영구 작업으로 실행됩니다. 수신자의 5xx 응답은 재시도하고 4xx는 수신자의 최종 판단으로 간주해 종료합니다.
- 범위 지정. 각 대상은 특정 알림 유형 또는
*를 구독합니다.
브라우저 푸시
설정 → 알림에서 이 브라우저를 Web Push에 등록하면 탭이 닫혀 있어도 멘션, 공유, 미리 알림과 완료된 작업이 기기에 전달됩니다. 구현은 표준을 따르며 자체 완결형입니다.
- VAPID(RFC 8292). 서버는 한 번 생성해 암호화하여 저장하거나
VAPID_PUBLIC_KEY/VAPID_PRIVATE_KEY로 고정한 ES256 키 쌍으로 각 전달에 서명합니다.VAPID_SUBJECT는 연락처 클레임을 설정합니다. 브라우저 공급자의 푸시 엔드포인트 외에는 타사 푸시 라이브러리나 서비스 계정이 관여하지 않습니다. - 암호화된 페이로드(RFC 8291). 모든 메시지는 인스턴스를 떠나기 전에 aes128gcm으로 기기 자체 키에 맞춰 암호화됩니다. 푸시 서비스는 읽을 수 없는 암호문을 전달합니다.
- 기기별, 세션 바인딩. 구독은 구독을 만든 브라우저와 해당 브라우저의 인증 세션에 속합니다. 세션에서 로그아웃하거나 "다른 세션에서 로그아웃"하면 푸시 등록도 제거됩니다. 엔드포인트는 키 기반 조회 토큰과 함께 암호화되어 저장되며 Webhook과 같은 외부 통신 보호 정책에 따라 공개 HTTPS 대상이어야 합니다.
- 영구적. 푸시 전달은 제한된 재시도를 갖춘 영구 작업으로 실행됩니다. 푸시 서비스에서 구독이 사라졌다고 보고하면(404/410) 이를 제거합니다.
- 페이로드에는 알림 제목, 선택적 본문, 유형과 대상 링크가 포함되며 받은 편지함과 같은 민감 정보 제거 정책이 적용됩니다.
푸시에는 프로덕션 앱과 보안 출처가 필요합니다. 서비스 워커는 프로덕션에서만 등록됩니다. 오프라인 셸과 설치 가능성도 같은 서비스 워커에서 제공됩니다. 앱 매니페스트를 통해 Libre WebUI를 설치할 수 있고, 오프라인 탐색은 캐시된 셸로 대체되며, 해시가 지정된 빌드 자산은 변경 불가능하게 캐시됩니다. API 트래픽은 절대 캐시되지 않습니다.
이메일
이메일은 세 번째 전달 채널이며 관리자의 설정이 필요한 유일한 채널입니다.
설정 → 사용자 관리 → 접근 및 정책 → 이메일 알림에는 발신 SMTP 서버 하나를
설정합니다. 호스트, 포트, 연결 보안(STARTTLS, 암묵적 TLS, 또는 신뢰된
네트워크를 위한 없음), 선택적 자격 증명, 발신자 주소, 그리고 링크에 사용할
공개 URL입니다. 환경 변수의 SMTP_* 환경
변수는 컨테이너 배포를 위해 같은 필드의 초기값을 지정하며, UI에 저장한 값이
우선합니다. 비밀번호는 암호화되어 저장되며 브라우저로 다시 반환되지 않습니다.
테스트 전송은 관리자 본인의 주소(또는 직접 입력한 주소)로 메시지를 보내
사용자가 의존하기 전에 왕복 전송이 정상 작동하는지 확인합니다.
관리자는 밝게 또는 어둡게 이메일 템플릿도 선택하고 저장하기 전에 미리 볼 수 있습니다. 기본값은 밝게입니다. 저장된 프리셋은 Markdown 결과를 포함해 이 인스턴스의 모든 알림과 테스트 이메일에 적용되며, 각 사용자의 인터페이스 테마와는 무관합니다. 미리보기는 SMTP에 연결하거나 메일을 보내거나 작업을 대기열에 넣지 않고 샘플 콘텐츠를 렌더링합니다. 관리자만 프리셋을 읽거나 변경하고 미리보기를 요청할 수 있습니다. 기본 제공 프리셋은 텍스트, 링크, 코드 블록, 버튼을 읽기 쉽게 유지하며, 사용자 지정 HTML 템플릿은 허용되지 않습니다. 이메일 클라이언트는 자체 표시 설정에 따라 색상을 조정할 수 있습니다.
스위치를 켜면 각 사용자는 설정 → 알림 → 이메일 알림에서 받은편지함으로 받을 항목을 직접 선택합니다.
- 채널 멘션: 채널에서 나를 멘션한 메시지를 미리보기와 채널 링크와 함께 받습니다.
- 자동화 실행 결과: 각 자동화 실행의 성공 또는 실패 결과입니다. 채팅 실행은 어시스턴트의 답변 자체를(최대 수천 자) 담고, Work 실행은 작업의 상태 줄을 담으며, 실패한 경우에는 오류를 담습니다. 링크를 열면 해당 채팅 또는 작업으로 이동합니다.
두 스위치 모두 사용자가 직접 켜기 전까지는 꺼져 있으며, 이메일 주소가 등록된
계정에서만 동작합니다. 이메일 주소는 계정 소유자가 가입 시 설정하거나
관리자가 사용자 화면에서 추가합니다. 메시지는 Web Push와 같은 영구 작업
런타임을 통해 발송되며 일시적인 릴레이 실패에는 제한된 재시도가 적용됩니다.
SMTP 클라이언트는 작은 내장 구현체(EHLO, STARTTLS, AUTH PLAIN 또는
LOGIN)로, 모드가 명시적으로 none이 아닌 한 암호화되지 않은 연결로 자격
증명을 절대 보내지 않습니다. 모든 메시지에는 일반 텍스트 파트와 웹사이트
디자인을 따르는 HTML 대안 파트가 함께 있습니다. Libre WebUI 워드마크, 내용을
담은 카드 하나, 대상으로 이동하는 코랄색 버튼, 그리고 설정 → 알림으로
돌아가는 링크가 있는 바닥글입니다. 자동화 실행 결과는 마크다운(제목, 목록,
강조, 코드, http(s) 대상만 허용하는 링크)에서 렌더링되며 그 외 모든 것은
이스케이프됩니다. 유일한 외부 이미지는 librewebui.org에서 제공하는 로고입니다.
추적 기능은 없습니다.
경계
- 사용자별 알림 유형 환경 설정은 아직 구현되지 않았습니다. 자동화는 자체 알림 설정을 따르고 채널을 나가면 해당 알림이 중지됩니다.