YWS 문서
YWS 콘솔로 이동
앱 연동/알림 (폰 푸시)

알림 (폰 푸시)

EC2 상태 변경, 새 메일, Lambda에서 보낸 알림을 휴대폰(안드로이드)이나 PC 브라우저의 푸시 알림으로 받습니다. 받은 알림은 콘솔 오른쪽 위 🔔 버튼(안 읽은 개수 표시) → 알림 화면에도 남습니다.

폰에서 켜기 (안드로이드)

  1. 폰의 Chrome으로 https://jimmy-home.com에 로그인
  2. Chrome 메뉴(⋮) → 홈 화면에 추가 또는 앱 설치 — 홈 화면에 YWS 아이콘이 생기고, 주소창 없이 앱처럼 열림 (안 해도 알림은 오지만, 설치해 두는 걸 권장)
  3. 🔔 → 알림 화면 위쪽의 이 기기에서 알림 받기 → 알림 권한 허용
  4. 아래 알림 받는 기기 목록에 생긴 기기의 테스트 버튼으로 바로 확인

PC 브라우저도 같은 방법으로 켤 수 있고, 기기를 여러 대 등록하면 모두에게 갑니다. 알림을 누르면 해당 화면(EC2 목록, 그 메일 등)이 열립니다.

받은 알림 거르기: 알림이 두 군데 이상에서 왔으면 목록 위에 출처 버튼이 생깁니다 — 전체 / EC2 / 메일 / Lambda / 관리자 / 앱 · 앱이름(외부 앱은 앱마다 따로). 버튼의 숫자는 안 읽은 수 / 전체 수. 한 출처를 열면 그 출처의 알림만 읽음 처리되고, "이 목록 비우기"도 그 출처만 지웁니다. 주소(?source=ec2, ?source=app:앱이름)에 남아서 새로고침해도 유지.

한 폰에서 여러 계정: 개인 계정과 관리자 계정을 같은 폰에서 쓰면, 각 계정으로 로그인해서 각각 "이 기기에서 알림 받기"를 누르면 됩니다. 두 계정의 알림이 모두 옵니다. 한 계정에서 끄면 그 계정만 꺼지고, 폰의 푸시 구독 자체는 다른 계정이 쓰는 동안 유지됩니다.

  • 기기를 빼려면 목록의 삭제, 또는 그 기기에서 이 기기 알림 끄기
  • 폰에서 알림이 안 오면: 안드로이드 설정 → 앱 → Chrome(또는 YWS) → 알림이 켜져 있는지, 절전 모드로 Chrome이 제한되지 않았는지 확인
  • iPhone은 사파리에서 홈 화면에 추가한 앱에서만 켤 수 있음 (iOS 16.4 이상)

무엇을 알려주나 (알림 설정)

알림 화면 맨 아래 알림 설정에서 종류별로 켜고 끕니다.

종류 언제 옵션
EC2 상태 변경 내 EC2(공유받은 EC2 포함)가 실행 중 / 정지됨 / 오류 / 다시 시작됨 / 복구됨이 되었을 때 알림 받을 EC2 선택
새 메일 받은편지함에 메일이 왔을 때 (스팸함 제외) 보낸 사람·제목에 포함된 단어로 거르기, Lambda 트리거 주소(이름+태그@) 메일 포함 여부
Lambda 알림 Lambda 코드가 notify(...)를 불렀을 때 —
앱 알림 알림을 허용한 외부 앱이 보냈을 때 (알림 서버) 앱별 허용/해제는 "알림을 허용한 앱"에서
관리자: 승인 요청 (관리자만) 회원가입, 노드 등록 신청·공개키 제출, OAuth 앱 신청·재신청·변경 요청이 들어왔을 때 —
  • EC2: 실제 쿠버네티스 상태를 5초마다 확인. 시작/정지 중간 단계는 무시해서 정지→시작 한 번에 알림 2개(정지됨, 실행 중). "다시 시작됨"은 노드 재부팅, 컨테이너 재시작 등으로 파드가 바뀐 경우 — 실행 중이던 프로그램을 다시 띄워야 할 수 있다는 뜻. "오류"는 컨테이너가 계속 죽는 경우(CrashLoopBackOff), 메모리 부족, 3분 넘게 자원이 없어 못 뜨는 경우 등
  • 메일: 5초마다 확인. 한 번에 4통 이상 오면 "새 메일 N통" 하나로 묶음. 알림을 켠 순간부터 온 메일만 알림
  • 알림을 켠 기기가 하나도 없으면 메일 확인은 하지 않음 (EC2·Lambda 알림은 알림 목록에만 남음)

알림을 허용한 앱

"YWS로 로그인"하는 앱 중 알림을 쓰는 앱은 처음 로그인할 때 알림을 허용할지 묻습니다. 알림 화면의 알림을 허용한 앱에서 허용/거부한 앱과 보낸 알림 수를 보고, 권한 해제 또는 허용으로 바꿀 수 있습니다. 앱이 보낸 알림은 제목 앞에 [앱 이름]이 붙습니다. 앱 개발자용 설명은 알림 서버.

Lambda에서 폰으로 알림 보내기 — notify

Lambda 코드에서 설치 없이 바로 부를 수 있는 내장 함수입니다. 알림을 켠 Lambda 주인의 모든 기기로 갑니다.

Python Node C++
notify(title, body, url) await notify(title, body, url) yws::notify(title, body, url);
def handler(event):
    notify("백업 완료", "오늘 백업이 끝났습니다.", "")
    return {"ok": True}
  • title: 알림 제목 (필수) / body: 내용 (없으면 "") / url: 알림을 눌렀을 때 열 주소 — https://... 또는 콘솔 경로 /dashboard/..., 없으면 ""(알림 목록)
  • 반환값: {"sent": true, "devices": 받은 기기 수}. 알림 설정에서 "Lambda 알림"을 끄면 {"sent": false, ...}
  • 1분에 20개까지. 넘으면 오류

예: 메일 트리거와 묶어서 "특정 메일이 오면 내용 요약을 폰으로", 예약 실행과 묶어서 "매일 아침 서버 상태를 폰으로".

동작 방식

  • 알림은 포털과 분리된 알림 서버(네임스페이스 alarm)가 보냄. 기기 등록, 알림 기록, 설정, 앱별 권한, VAPID 키가 전부 거기 있고, 포털(app/notifications.py)은 그 서버의 내부 API를 부르는 클라이언트. 2026-09-29 분리 — 기존 데이터와 키를 그대로 옮겨서 이미 켠 폰은 다시 등록할 필요 없음
  • 콘솔은 PWA(설치 가능한 웹앱): /manifest.webmanifest(앱 이름·아이콘), /sw.js(서비스 워커 — 푸시를 받아 알림을 띄우고, 누르면 해당 화면을 엶). 브라우저는 포털하고만 통신하고, 포털이 알림 서버로 전달
  • 표준 Web Push(VAPID): 기기가 알림을 켜면 브라우저가 푸시 구독 주소(안드로이드 Chrome은 Google FCM)를 만들어 등록 → 알림 서버가 내용을 암호화해서 그 주소로 보냄. 내용은 종단 간 암호화라 Google은 볼 수 없음. 폰이 꺼져 있으면 FCM이 최대 24시간 보관했다가 전달
  • 지연 줄이기: 모든 알림을 Urgency: high(RFC 8030)로 보냄 — FCM이 높은 우선순위로 처리해서, 화면이 꺼진 절전(Doze) 상태의 안드로이드도 바로 깨워서 전달. 이게 없으면 일반 우선순위라 몇 분씩 모였다가 오기도 함. 알림 서버 → FCM 연결은 재사용(keep-alive)해서 한 번 보내는 데 약 0.1초
  • 그래도 늦으면 폰 설정 확인: 안드로이드 설정 → 앱 → Chrome(또는 YWS) → 배터리 → 제한 없음, 알림 허용
  • VAPID 키는 알림 서버의 /data/vapid_private.pem. 이 키가 바뀌면 모든 기기에서 알림을 다시 켜야 함
  • 구독 주소가 없어졌다고(404/410) 응답하면 그 기기는 자동으로 목록에서 빠짐
  • 알림 서버에 연결할 수 없으면 알림 화면에 그렇게 표시되고, 그동안 EC2·메일 알림은 다음 확인 때 다시 시도하지 않고 넘어감
  • 코드: 포털 app/notifications.py(종류 목록 KINDS, 알림 서버 클라이언트), app/ec2_watch.py, app/mail_notify.py, app/routers/notifications.py, app/static/sw.js·push.js / 알림 서버 alarm/app/
  • 알림 종류 추가: notifications.KINDS에 항목 하나 추가하고 notifications.send(db, user, "종류", 제목, 내용, 링크)를 부르면 설정 화면의 켜고 끄기 스위치가 자동으로 생김