Releases

  • 1.3.0

    변경 사항

    • 목록에 감염 첨부 칩, 바이러스 검사 대기 배너, 대화별 보기의 참여자 이름을 표시합니다.
    • 사이드바 숫자를 안 읽은 수와 확인 필요 수 기준으로 정리했습니다.
    • 메일 상세 머리글에 첨부 요약을 두고 첨부 카드는 본문 뒤로 옮겼습니다. 휴대폰에서는 보조 도구를 더 보기로 접습니다.
    • 관련 대화를 보낸 사람, 시각, 읽음 상태, 본문 앞부분이 있는 목록으로 바꿨습니다.
    • 보관, 스팸, 휴지통 처리 뒤 다음 메일을 열고, 되돌리면 원래 메일과 버튼 초점으로 돌아갑니다. 화면 알림은 모든 화면에서 아래쪽에 뜹니다.
    • 패스키와 복호화 키 삭제에 재인증 확인 창을 적용했습니다.
    • placeholder 대비, 작은 클릭 영역, 제목 단계를 정리했습니다.
    • 통계 API에 unread, attention, scanPending을 추가했습니다.

    검증

    • npm test: 102 통과, 실패 0, Linux 전용 4개는 Docker 검증에서 실행
    • client lint, verify:ui(로컬 fixture), verify:secrets 통과
    • Docker 이미지 빌드와 verify-docker.js: 106 통과, 건너뜀 0
    • 이미지 비밀값 검사 통과, npm audit 운영 의존성 0건
    • Worker는 바뀌지 않았습니다.

    이미지

    latest 태그로 배포합니다.

    Downloads 2
  • 1.2.0

    개인 이메일 수신 서버 1.2.0

    1.1.4 이후 화면을 새로 다듬고 목록 정리 기능, 수신 주소 규칙, 발신 인증 표시, 내보내기, 증분 백업, Worker 재시도를 더했습니다. 이미지는 latest 태그로만 올렸습니다(digest sha256:59b1a74f19c5e75292cd8c88c9ccdd2b2b8fec74114a2ec5526e7005469202aa, Linux amd64).

    바뀐 점

    화면과 정리

    • 화면 개편: PC 3단, 태블릿 폴더 아이콘 레일, 휴대폰 목록과 본문 전환 화면으로 정리했습니다. Pretendard 글꼴을 같은 출처에서 제공하고, 해시가 붙은 정적 파일은 오래 캐시합니다.
    • 대화별 보기: 목록 머리의 버튼으로 같은 대화를 한 줄로 묶고 메일 수와 안 읽은 수를 보여 줍니다. 묶은 행을 보관하거나 휴지통으로 보내면 지금 폴더와 검색에 맞는 대화 속 메일이 함께 옮겨집니다.
    • 되돌리기: 보관, 스팸, 휴지통 같은 정리 뒤 알림에 되돌리기 버튼이 붙고 Z 키로도 되돌립니다. 되돌리기는 한 번의 요청으로 원자적으로 처리합니다.
    • 일괄 작업: 여러 통을 골라 읽음, 보관, 스팸, 휴지통, 별표를 한 번에 적용합니다. 스팸 메일에서는 스팸 버튼이 스팸 해제로 바뀝니다.
    • 위험 표시: DMARC 실패나 서명 문제가 있는 메일은 목록에서부터 사칭 의심, 서명 문제 표시가 붙습니다.
    • 대화상자: 첨부 미리보기 같은 창을 키웠고, 창 바깥을 누르면 닫힙니다.

    수신과 보관

    • 수신 주소 규칙: 주소나 *@domain마다 넣을 폴더, 라벨, 알림 여부를 정하고, 쓰지 않는 주소는 차단합니다. 차단은 본문을 받기 전에 판정합니다.
    • 발신 인증 표시: TRUSTED_AUTHSERV_IDS로 지정한 수신 서버가 기록한 SPF, DKIM, DMARC 결과를 상세 화면에 보여 줍니다. 비워 두면 표시하지 않습니다.
    • 검색: from:, to:, label:, has:attachment, is:unread, before: 같은 검색 연산자를 추가했고, 검색 색인을 다시 만들었습니다(스키마 버전 3).
    • 내보내기와 백업: 메일함 전체나 폴더를 mbox로 내려받습니다. 매일 만드는 백업은 바뀌지 않은 파일을 하드 링크로 공유하는 증분 방식으로 바꿨습니다.
    • Worker 재시도: Worker가 일시 오류와 Retry-After에 맞춰 약 1분 동안 다시 보내고, 차단된 수신 주소는 바로 거부합니다.

    정리와 보안 갱신

    • 서버, 클라이언트, 검증 스크립트의 중복과 쓰지 않는 코드를 정리했습니다. npm test는 약 67초에서 약 20초로, npm run verify:ui는 약 2분 30초에서 약 30초로 줄었습니다.
    • 서버 운영 의존성을 semver 호환 범위로 갱신해 npm audit 취약점을 0건으로 만들었습니다(body-parser, nodemailer, mailparser, sanitize-html, qs, ip-address, proxy-addr 등).
    • 문서를 지금 코드와 운영 절차에 맞게 고쳤습니다.

    업데이트할 때 바꿀 설정

    • compose.yaml이 바뀌었습니다. 새 파일로 바꿉니다. 이미지 주소, 앱 주소, 수신 도메인이 코드와 compose에서 빠지고 .env로 옮겨졌습니다.
    • .env에 새 키를 채웁니다.
      • APP_IMAGE: 태그를 뺀 이미지 저장소 주소(필수)
      • MAIL_DOMAINS: 받는 도메인을 쉼표로 구분(필수)
      • TRUSTED_AUTHSERV_IDS: 발신 인증 결과를 믿을 수신 서버의 authserv-id(선택)
    • NODE_ENV, PORT, MASTER_KEY_FILE은 compose가 직접 정하므로 .env에서 빼도 됩니다. 남아 있어도 무시합니다.
    • 첫 시작 때 DB 스키마가 자동으로 올라갑니다. 검색 색인을 다시 만드는 단계는 메일 수에 비례해 시간이 걸리므로, 업데이트 전에 백업을 하나 만들어 둡니다.
    • Worker(workers.js)도 바뀌었습니다. 이전 Worker도 새 서버와 그대로 동작하지만, 재시도와 수신 주소 차단 처리를 쓰려면 Worker를 다시 배포합니다. wrangler.jsonc에서 WEBHOOK_URL이 빠졌으므로 배포할 때 기존 값을 유지합니다.

    검증

    • npm test: 105개 중 101개 통과, 실패 0. Linux 전용 4개는 Windows에서 건너뛰었고 아래 Docker 검증에서 통과했습니다.
    • 클라이언트 lint, npm run verify:ui(패스키, 재인증, 첨부 검사, 미리보기, 되돌리기, 대화별 보기, 반응형, PWA 모의 시험) 통과.
    • npm run verify:worker: 로컬 workerd에서 재시도, 차단, 시간 초과 처리 통과. 실제 Cloudflare 수신 시험은 하지 않았습니다.
    • 릴리스 이미지로 node scripts/verify-docker.js: 101개와 Linux 전용 4개 통과, 건너뜀 0. bind mount 재생성, 백그라운드 처리, 패스키와 키와 세션 보존, 일관된 백업 통과.
    • 번들과 이미지의 비밀값 검사 통과. 이미지에 .env와 마스터키가 없습니다.
    • 서버 운영 의존성 npm audit 0건, 클라이언트 0건.
    Downloads 2
  • 1.1.4

    개인 이메일 수신 서버 1.1.4

    1.1.3 대비 원본 메일 디자인 보존과 설정·첨부파일 UI를 개선했습니다.

    1.1.3 대비 변경사항

    • 메일 서식 보존: HTML 정제 시 안전한 인라인 색상·여백·표 크기·가운데 정렬·클래스·스타일시트와 제한된 미디어 쿼리를 보존합니다. 숨김 규칙이 제거돼 PC/모바일용 콘텐츠가 함께 표시되던 원인을 수정했습니다. PostCSS 8.5.28을 직접 의존성으로 명시했습니다.
    • 원본 색상 우선: 다크모드가 모든 요소의 색을 덮어쓰던 처리를 제거했습니다. 발신자가 지정한 브랜드 색상은 유지하고, 별도 지정이 없는 부분에 앱 테마를 적용합니다. CSS 외부 로딩·배경 이미지·실행 코드와 미허용 외부 이미지 요청은 계속 차단하므로 모든 메일이 원본과 완전히 동일한 것은 아닙니다. 기존 메일도 재처리 없이 조회 시 적용됩니다.
    • 원문 즉시 다운로드: 로그인 상태에서 ‘원문 내보내기’를 누르면 확인창·최근 패스키 재인증 없이 .eml을 다운로드합니다. 관리자 인증·Origin/CSRF 검사는 유지하며 격리 첨부 내보내기·영구 삭제 등의 재인증 요건은 유지합니다.
    • 목록 너비 드래그: 하단 슬라이더를 제거하고 목록과 본문 사이 경계선으로 너비를 조절합니다. 데스크톱에서 280~600px 범위, 방향키/Home/End 지원. 작은 화면에서는 조절선을 숨깁니다.
    • 운영 로그 표시: 로딩·빈 로그·실패 메시지와 재조회 기능을 추가했습니다. 조회 중 중복 클릭을 막고 로그 조회만으로 서비스 상태를 다시 요청하지 않습니다.
    • 설정 UI 정리: 알림 스위치의 보이는 크기를 44×24px로 줄이고 터치 영역은 유지했습니다. 제목·설명·버튼·목록 간격, 첨부/로그 글자 크기와 확인창 버튼 정렬을 개선했습니다.
    • 첨부파일 아이콘: 파일명 앞에 이미지·PDF·Word·Excel·PowerPoint·한글·동영상·오디오·압축·코드 등의 아이콘을 표시합니다. 확장자를 우선하고 MIME을 보조로 사용하며 알 수 없는 형식은 기본 파일 아이콘으로 표시합니다. 아이콘은 검사 결과나 안전 여부를 뜻하지 않습니다.

    검증

    • Windows 테스트 21개 통과, Linux 전용 4개 건너뜀.
    • 새 앱 이미지 Linux 테스트 25개 통과, 실패/건너뜀 0. bind mount 재생성·백그라운드 처리·키/세션 보존·일관된 백업 검증 통과.
    • 클라이언트 lint/build, Compose 설정 및 UI 회귀 검증 통과. 원문 직접 다운로드, 드래그 너비, 로그 조회 상태, 설정 간격, 원본 브랜드 색·600px 표·PC/모바일 숨김 규칙과 기존 패스키·첨부·PWA 모의 시험 포함.
    • 번들·이미지의 알려진 비밀값 일치 0, 이미지 내 .env·마스터키 없음. 기존 Git 이력 6개 객체 일치 기록 유지.
    • 서버 운영 의존성 npm audit 취약점 0건. Trivy 이미지 취약점 검사는 이번 릴리즈에서 재실행하지 않았으며 과거 이미지 결과와 구분합니다. ClamAV는 기존 upstream 태그를 재사용합니다.
    • 미실행: 운영 NAS 배포, 실제 외부 SMTP/Push 전달, 실기기 설치, 사용자가 제시한 메일의 실제 EML과 픽셀 단위 비교. Worker 코드와 HMAC 프로토콜 변경 없음.

    업데이트

    기존 데이터 경로·비밀키·마스터키를 유지하고 .env의 IMAGE_TAG=latest 또는 버전 고정용 IMAGE_TAG=1.1.4를 사용하세요. Compose/env의 기본값은 계속 latest, 포트는 30003입니다.

    docker compose pull
    docker compose up -d --no-build
    

    게시 이미지

    • 소스 커밋: e3d62a443c9b32cf78008b560ec55a7949015ded

    • 고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:76ddb19cc8133c2218760adf4614ec27a676cc2b70319d6e27a6d4b6de31ad2f

    • 원격 annotated tag/peeled ref, 두 태그의 동일 digest, 고정 digest pull과 version/revision label 검증 완료.

    • git.2ex.dev/hanyul/cloudflare-email-webhook:1.1.4, :latest (동일 Linux amd64 이미지)

    전체 변경 · 운영 절차 · 검증 기록

    Downloads 2
  • 1.1.3

    개인 이메일 수신 서버 1.1.3

    1.1.2 대비 메일 상세 화면의 가독성과 공간 활용을 개선하고 NAS Compose 호환성을 조정했습니다.

    1.1.2 대비 변경사항

    • 본문 다크모드: 흰 배경 고정을 제거하고 앱 테마에 맞춰 배경·글자·링크 색을 적용합니다. 다크모드에서는 메일의 배경색과 글자색을 읽기용 색상으로 조정하며 이미지 픽셀의 색은 유지합니다. 라이트모드에서는 원래 메일 색상을 유지합니다.
    • 본문 여백·높이: 본문 영역과 내부 문서의 바깥 여백을 제거했습니다. 고정 500px/430px 높이를 없애 짧은 메일은 남은 화면을 채우고, 긴 메일과 나중에 로드되는 이미지는 높이를 자동 조정합니다. 본문 내부 대신 상세 화면에서 세로 스크롤합니다.
    • 상세 정보 정리: 제목 아래 완료·긴급도·암호화·서명 배지와 ‘실제 도착’ 주소/시간, ‘메일 ID’ 표시를 제거했습니다. 서버에 저장된 수신 정보나 ID는 삭제하지 않습니다.
    • 첨부 위치: 첨부파일을 제목·메일 정보 아래, 본문 위로 옮겼습니다. 첨부가 없으면 제목과 빈 영역을 표시하지 않습니다. 다운로드·미리보기·검사 게이트는 유지합니다.
    • 새로고침 회전: 글꼴 문자를 중앙 기준 SVG로 교체했습니다. 완료 시 각도가 튀지 않고 현재 한 바퀴를 마친 뒤 멈춥니다. 5초 자동 확인과 모션 감소 설정을 유지합니다.
    • 확인창 위치: 외부 이미지 허용 등 공통 대화상자가 좌측 상단에 붙던 문제를 수정했습니다. PC·모바일에서 중앙 정렬하며 모바일 폴더 메뉴는 기존 측면 메뉴를 유지합니다.
    • NAS PID 경고: PID cgroup을 지원하지 않는 환경을 위해 앱과 ClamAV의 pids_limit을 제거했습니다. 프로세스 수 제한은 적용하지 않으며 메모리 제한·읽기 전용 파일시스템·권한 제한은 유지합니다.

    검증

    • Windows 테스트 19개 통과, Linux 전용 4개 건너뜀.
    • 새 앱 이미지 Linux 테스트 23개 통과, 실패/건너뜀 0. bind mount 재생성·백그라운드 처리·세션/키 보존·일관된 백업 검증 통과.
    • 클라이언트 lint/build, Compose 설정 검사, UI 회귀 검증 통과. 본문 테마 전환·여백·높이 확장/축소, 320/390/1440px 확인창 위치, 회전 중심·완료 후 정지 및 기존 패스키·미리보기·반응형·PWA/알림 모의 시험 포함.
    • 현재 번들·이미지에서 알려진 비밀값 일치 0, 이미지 내 .env·마스터키 없음. 기존 Git 이력 6개 객체 일치는 과거 기록으로 보존합니다.
    • 의존성과 기반 이미지 정의는 바뀌지 않았습니다. 이번 릴리즈 Trivy 검사는 미실행이며 이전 이미지 검사 결과를 새 이미지 결과로 표시하지 않습니다. ClamAV는 기존 upstream 태그를 재사용합니다.
    • 미실행: 이 이미지의 운영 NAS 배포, 실제 외부 SMTP 수신, 실기기 PWA 설치·외부 Push 제공자 전달. Worker 코드와 HMAC 프로토콜 변경 없음.

    업데이트

    compose.yaml도 1.1.3으로 갱신해야 PID 제한 제거가 적용됩니다. 기존 데이터 경로·비밀키·마스터키를 유지하고 .env에서 IMAGE_TAG=latest 또는 버전 고정용 IMAGE_TAG=1.1.3을 사용하세요. 기본 포트 30003과 ./data/* 경로는 그대로입니다.

    docker compose pull
    docker compose up -d --no-build
    

    게시 이미지

    • 소스 커밋: 19fa9f2c2c74aeb1b272f0628ef88fa1f058db31

    • 고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:6e6dc29d18ac9b8e0bff9764f4183948e50c57f422a712f8271d3c4294d0f99b

    • 원격 annotated tag/peeled ref, 두 이미지 태그의 동일 digest, 고정 digest pull 및 version/revision label 검증 완료.

    • git.2ex.dev/hanyul/cloudflare-email-webhook:1.1.3, :latest (동일 Linux amd64 이미지)

    전체 변경 · 운영 절차 · 검증 기록

    Downloads 2
  • 1.1.2

    개인 이메일 수신 서버 1.1.2

    1.1.1 대비 메일함의 자동 갱신 표시와 설치·알림 안내를 단순화했습니다.

    변경사항

    • 자동 새로고침 표시: 카운트다운·진행 막대·마지막 확인 시각 박스를 제거하고 기존 새로고침 아이콘 회전으로 표시합니다. 5초 자동 갱신, 새 메일 강조, 검색·선택·페이지·스크롤 보존, 오류 재시도는 유지합니다. 모션 감소 설정도 반영합니다.
    • 설치·알림 배너 제거: 우측 하단 설치 안내와 알림 카드·작은 실행 버튼을 제거했습니다. PWA 설치 및 브라우저 알림 등록·해제는 설정 화면에서 관리합니다.
    • 이미지 기본값: Compose와 .env.example은 latest를 기본으로 사용합니다. 현재 latest와 1.1.2는 같은 Linux amd64 이미지입니다. 기본 포트 30003, 저장 경로 ./data/*는 유지합니다.
    • 운영 기록: 기존 Cloudflare Worker의 구 JSON 전송 방식과 새 서버 v2 HMAC 수신 방식 불일치를 확인해 운영 Worker 코드와 URL(/webhook/v2)을 배포했습니다. 기존 키와 두 도메인의 라우팅을 유지했습니다. 이 릴리즈에서 Worker 소스·HMAC 프로토콜을 새로 변경한 것은 아닙니다. 실제 외부 메일 수신 성공은 아직 검증하지 않았습니다.

    이미지와 검증

    • 이미지: git.2ex.dev/hanyul/cloudflare-email-webhook:1.1.2, :latest
    • 고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:32a1a97092c77782364919a9a454533fa588ee514b86f5e0a01f71b0caa350bf
    • 소스 커밋: da9558e449b968fd417425337db46e90e4909acd
    • Windows 19개 통과·Linux 전용 4개 건너뜀. 새 이미지 Linux 23개 통과·실패/건너뜀 0. bind mount 재생성·백그라운드 처리·키/세션 보존·백업 검증 통과.
    • 클라이언트 lint/build, 패스키·미리보기·반응형·5초 갱신·배너 제거·설정 설치/알림 모의 UI 검증 통과.
    • 번들·이미지에서 알려진 비밀값 일치 0, 이미지 내 .env와 마스터키 없음. 기존 Git 이력의 6개 객체 일치는 과거 기록으로 유지합니다.
    • 의존성과 기반 이미지 정의는 변경하지 않았으며 이번 버전 Trivy 검사는 미실행입니다. 이전 버전의 취약점 검사 결과와 구분합니다. ClamAV 이미지는 기존 upstream 태그를 재사용합니다.

    미실행: 이번 앱 이미지의 운영 NAS 배포, 실제 외부 SMTP 수신, 실기기 Android/iPhone 설치·잠금 화면·Push 제공자 전달.

    업데이트

    기존 데이터·키를 백업하고 기존 데이터 경로와 마스터키를 유지하세요. .env의 IMAGE_TAG=latest 또는 버전 고정 시 IMAGE_TAG=1.1.2를 사용합니다.

    docker compose pull
    docker compose up -d --no-build
    

    서버 이미지만 교체해도 Cloudflare Worker가 자동 배포되지는 않습니다. 구 Worker를 사용하는 다른 설치에서는 운영 문서의 v2 전환 절차도 적용해야 합니다.

    전체 변경 · 운영 절차 · 검증 기록

    Downloads 2
  • 1.1.1 — 자동 메일 확인과 설치·알림 개선

    개인 이메일 수신 서버 1.1.1

    1.1.0 대비 메일함 자동 확인과 설치·알림 설정 경험을 개선했습니다.

    1.1.0 대비 변경사항

    • 5초 자동 확인: SSE와 함께 메일 목록·폴더 통계를 확인 완료 후 5초마다 갱신합니다. 다음 확인까지 카운트다운·진행 막대·마지막 확인 시각을 표시하고 새 메일 건수와 해당 행을 강조합니다. 체크 선택·더 불러온 목록·스크롤을 유지하며 자동 확인만으로 열린 본문을 다시 불러오지 않습니다. 실패하면 기존 목록을 보존하고 재시도하며, 숨겨진 탭·오프라인에서는 중지했다가 복귀 시 확인합니다.
    • 모바일 PWA 안내: 로그인 후 하단에 “mail.2ex.cloud를 PWA 앱으로 추가할까요?”를 표시합니다. Android 등은 설치 가능 이벤트가 있을 때만, iPhone/iPad는 수동 안내를 표시합니다. 추가 버튼은 설치창 또는 “설정 메뉴의 ‘홈 화면에 추가’를 선택해 주세요.” 안내를 엽니다. 취소·× 선택을 브라우저에 저장해 이후 자동 표시를 숨깁니다. PC와 설치한 앱에서는 자동 표시하지 않습니다. 성인 확인 기능은 추가하지 않았습니다.
    • 메일 알림 스위치: 로그인·서버 키 준비 후 사용자가 스위치를 켤 때 권한을 요청합니다. “신규 메일이 오면 알립니다.”에서 브라우저 구독과 서버 저장 완료 후 “이 브라우저로 알림을 받습니다.”로 바뀝니다. 끄면 현재 브라우저의 구독을 해제합니다. 저장 실패·권한 거부·미지원·서버 미준비를 구분하고 다른 기기는 유지합니다.
    • 로그인 화면·테마: 제목을 mail.2ex.cloud로 변경하고 PRIVATE MAIL 및 하단 소개 문구를 제거했습니다. 저장된 테마 선택이 없으면 다크모드를 기본 적용하며 기존 라이트모드 선택은 유지합니다.
    • 배포 기본값: 기본 호스트 포트를 30003으로, 영구 저장 기본 경로를 ./data/*로 통일했습니다. .env.example, Compose, 운영 문서와 패키지 버전을 1.1.1에 맞췄습니다. 컨테이너 내부 포트는 3000입니다.
    • 검증: 설치 취소 저장, 알림 스위치, 5초 갱신 간격, 페이지·체크·스크롤 보존 및 오류 복구 모의 브라우저 시험을 추가했습니다. Cloudflare 수신 Worker와 HMAC 프로토콜은 변경하지 않았습니다.

    업데이트

    기존 데이터·키를 백업한 뒤 .env에서 IMAGE_TAG=latest를 지정합니다. latest와 1.1.1은 현재 같은 이미지를 가리키며 고정 운영에는 IMAGE_TAG=1.1.1을 사용할 수 있습니다. 게시 후 main의 Compose·환경 예시는 latest를 기본값으로 변경했습니다. 이미 게시된 1.1.1 Git 태그의 기본값은 1.1.1로 유지합니다. 기존 DATA_PATH, LOGS_PATH, BACKUP_PATH, CLAMAV_DB_PATH, MASTER_KEY_PATH 값은 실제 저장 위치에 맞춰 유지하세요. 경로 기본값 변경만으로 기존 데이터가 이동하지 않습니다. 기존 DB에 사용하는 마스터키를 새로 생성하지 마세요.

    기존 .env의 HOST_PORT가 있으면 그 값이 우선합니다. 30003으로 전환할 경우 운영 프록시 포트도 함께 맞춰야 합니다. 새 기본 경로는 ./data/data, ./data/logs, ./data/backups, ./data/clamav-db, ./data/secrets/master.key입니다.

    docker compose pull
    docker compose up -d --no-build
    

    ClamAV 시작 스크립트와 conf 파일은 컨테이너 UID 1000이 읽을 수 있어야 합니다. /bin/sh: cannot open /run/mail-clamav-start.sh: Permission denied가 발생하면 공개 설정 파일인 scripts/clamav-start.sh, clamav.conf, freshclam.conf의 읽기 권한을 확인하세요. 비밀 파일 권한은 완화하지 않습니다.

    이미지와 검증

    • 이미지: git.2ex.dev/hanyul/cloudflare-email-webhook:1.1.1, :latest (Linux amd64, 동일 이미지)
    • 고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:4be024378a89b3825bee100f5b6abb915329d7c3d5002d96f4d69c916ae0537e
    • 소스 커밋: c40c4f78055698aaa14923daa71154287aadf819
    • Windows 시험 19개 통과·Linux 전용 4개 건너뜀. 해당 배포 이미지 Linux 시험 23개 통과·실패/건너뜀 0, bind mount 재생성·강제 종료/재전송·백업 복구 검증 통과.
    • UI lint/build, Chromium 패스키·미리보기·320~1440px 반응형 및 설치/알림/5초 갱신 모의 시험, Compose latest/30003 설정 검증 통과.
    • 새 앱 이미지 Trivy High/Critical 0건. 검사 시점 2026-09-28T11:55:47.917179796Z. 알려진 로컬 비밀값 2개와 대조한 현재 번들·이미지 일치 0건, 이미지 내 .env/마스터키 없음. 기존 Git 이력 6개 객체 일치는 유지합니다.
    • 원격 annotated tag/peeled ref, 이미지 version/revision label, 레지스트리 index/platform manifest와 고정 digest pull 및 패키지 1.1.1/PWA 파일 존재 확인.

    미실행: 실제 Android/iPhone 설치와 Push 제공자 전달·잠금 화면 알림, 운영 NAS·Cloudflare Worker 배포, 실제 외부 SMTP 수신. 로컬 모의 시험을 실제 Push 전달로 표시하지 않습니다. ClamAV upstream 이미지는 기존 태그를 재사용하며 이번에 빌드·재게시·취약점 재검사하지 않았습니다. 과거 ClamAV 취약점 기록은 별도로 유지합니다.

    전체 변경 · 운영 절차 · 검증 기록

    Downloads 2
  • 1.1.0

    개인 이메일 수신 서버 1.1.0

    1.0.1 대비 휴대폰 화면과 메일 알림을 개선했습니다. 우측 하단에서 홈 화면 앱 설치와 알림을 등록하고, 앱을 닫은 상태에서도 지원 기기에서 새 메일 수신 사실을 확인할 수 있습니다.

    1.0.1 대비 변경사항

    • 반응형 메일함: 데스크톱 3단·태블릿 2단·모바일 목록/상세 전환. 모바일과 태블릿에 접이식 폴더/라벨 메뉴를 추가하고 터치 영역, 설정·검색 필터·첨부 화면, 노치 안전 영역과 포커스 복귀를 보완했습니다.
    • 우측 하단 설치·알림 안내: 하나의 카드에서 PWA 설치와 알림 상태를 안내합니다. ‘나중에’는 자동 안내를 7일간 접고, 입력 중이나 대화상자가 열리면 작은 버튼으로 전환합니다. 등록 완료·권한 거부·미지원·등록 실패를 구분합니다.
    • PWA: Manifest, 앱/Apple 터치 아이콘, 루트 Service Worker를 추가했습니다. 지원 브라우저에서는 설치 창을 열고 iPhone/iPad에는 홈 화면 추가 순서를 안내합니다. 메일·첨부·인증 응답은 캐시하지 않으며 오프라인에서는 연결 안내만 제공합니다.
    • Web Push: ‘새 메일이 도착했습니다’만 표시하고 발신자·제목·본문은 노출하지 않습니다. 알림 클릭 시 기존 창을 활성화하거나 메일함을 열고, 세션이 만료되면 패스키 로그인 후 해당 메일로 이동합니다.
    • 영속 발송 큐: 원문 저장과 DB 커밋에 맞춰 신규 메시지의 알림 작업을 기록하고 별도로 발송합니다. 재전송·추가 envelope·재처리에 중복 생성하지 않으며, 최대 5회/24시간 재시도와 만료 구독 정리를 지원합니다. Push 서비스 수락은 실제 기기 표시나 정확히 한 번 전달을 보장하지 않습니다.
    • 구독 보호와 복구: VAPID 키와 구독 정보를 기존 마스터키로 암호화합니다. 관리자 인증·Origin/CSRF를 유지하고 Push endpoint와 DNS 주소를 제한합니다. 세션 만료에는 알림이 유지되며 로그아웃 시 해당 기기, 관리자 인증 복구·백업 복원 시 모든 구독과 대기 작업을 해제합니다.
    • 검증·운영: 설정에 기기별 알림 해제를 추가하고 서버·Service Worker·반응형/설치 상태 시험을 확장했습니다. 비밀값 검사에 Manifest와 Service Worker를 포함하고 패키지·Compose 기본 이미지 태그를 1.1.0으로 올렸습니다.

    업데이트

    메일 데이터와 마스터키를 백업한 뒤 기존 .env의 IMAGE_TAG=1.1.0을 설정합니다. 기존 bind 경로는 유지합니다. 새 구독/큐 테이블은 시작 시 추가되며 기존 DB 이관·메일 보관은 유지됩니다. 추가 VAPID 환경변수나 외부 메시지 브로커는 필요하지 않습니다.

    docker compose pull
    docker compose up -d --no-build
    

    로그인 후 우측 하단에서 설치·알림을 등록하세요. iPhone/iPad는 홈 화면에 추가한 앱에서 알림을 켜야 합니다. 서버에서 지원 Push 제공자로 외부 HTTPS/443 연결이 필요하며 현재 발송 연결은 공인 IPv4를 사용합니다. 이미 Push 제공자에 전달된 알림은 로그아웃으로 되돌릴 수 없습니다.

    이미지와 검증

    • 이미지: git.2ex.dev/hanyul/cloudflare-email-webhook:1.1.0 (Linux amd64)
    • 고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:8cd74db0f50d62e259e41598a90ded3b6c52e8dd9b8566b4fab26abde7c42540
    • 소스 커밋: 29749a4470a03b853ce35bc757420534a0f4b2c8
    • Windows 시험 19개 통과·Linux 전용 4개 건너뜀. 릴리즈 이미지 Linux 시험 23개 통과·실패/건너뜀 0. bind mount 재생성·강제 종료/재전송·백업 복구 통과.
    • UI lint/build, Chromium 가상 패스키·미리보기·다크모드·320~1440px 반응형과 설치/구독 상태 모의 시험, Compose 설정 검증 통과.
    • 새 앱 이미지 Trivy High/Critical 0건(2026-09-28 검사). 알려진 로컬 비밀값 2개 대조 결과 현재 번들·이미지 일치 0건. 기존 Git 이력 6개 객체 일치는 유지되므로 운영 웹훅 키 교체 필요성은 그대로입니다.
    • ClamAV는 기존 upstream stable-debian13-slim을 재사용하며 이번에 빌드·재게시·취약점 재검사하지 않았습니다. 1.0.1 당시 ClamAV 검사에서 기록한 High 55건·Critical 1건(고유 CVE 20개)은 과거 검사 결과이며 새 앱의 0건 결과와 합산하거나 해결된 것으로 표시하지 않습니다.

    미실행: 실제 Android/iPhone/Safari/Firefox의 Push 제공자 전달·잠금 화면 알림, 운영 NAS·Cloudflare Worker 배포 및 실제 외부 SMTP 수신. 설치/구독 UI와 서버 Push 전송은 로컬 모의 시험이며 운영 전환 완료를 의미하지 않습니다. Cloudflare 수신 Worker와 HMAC 프로토콜은 변경하지 않았습니다.

    전체 변경 · 운영 절차 · 검증 기록

    Downloads 2
  • 1.0.1

    이메일 수신 서버 1.0.1

    1.0 대비 NAS 배포 설정을 단순화하고 초기 등록 암호 정책을 조정했습니다.

    1.0 대비 변경 사항

    • Compose의 로컬 build 제거. 게시된 레지스트리 이미지를 pull해 실행하며 기본 태그는 1.0.1입니다.
    • 호스트 bind 기본 경로를 Compose 기준 ./app/data, ./app/logs, ./app/backups, ./app/clamav-db, ./app/secrets/master.key로 변경했습니다. 컨테이너 내부 경로는 유지합니다.
    • ClamAV를 stable-debian13-slim으로 변경하고 UID/GID 1000:1000, Docker init 및 임시 디렉터리 권한을 맞췄습니다.
    • 최초 패스키 등록·NAS 복구 암호의 최소 길이를 16자에서 8자로 변경했습니다. UI와 서버 정책을 일치시키고 7자 거부·8자 등록/복구 회귀 시험을 반영했습니다.
    • .env.example을 Compose 배포 설정에 맞추고 app/을 Git·Docker 빌드에서 제외했습니다. 로컬 .env와 비밀값은 릴리즈에 포함되지 않습니다.
    • 프록시 설정·권한·이미지 적용 문서를 갱신했습니다. 비밀값 검사에서 경로 설정 오탐을 제거하고 8자 암호를 검사 대상에 포함했습니다.

    업데이트 시 확인

    기존 .env의 경로 값은 기본값보다 우선합니다. 데이터·마스터키는 자동 이동되지 않으므로 기존 경로를 유지하거나 백업 후 이전하세요. 기존 ClamAV 정의 디렉터리는 UID/GID 1000:1000에 쓰기 권한이 필요합니다.

    docker compose pull
    docker compose up -d --no-build
    

    이미지와 검증

    이미지: git.2ex.dev/hanyul/cloudflare-email-webhook:1.0.1 (Linux amd64)

    고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:c6ca04bba12f1d3f0273a1cd7086700d5c17bf3e8d1095a8349aaefadd38d6ab

    소스 커밋: a34a419e058094f80c223752cbddec452944cd56

    릴리즈 이미지 통합 시험 17개 통과, 건너뜀 0. 강제 종료·재전송·bind mount 재생성·백업 복구, 브라우저 패스키·미리보기·모바일 화면 및 Compose 설정 검증을 통과했습니다. 앱 이미지의 Trivy High/Critical 0건이며 알려진 비밀값의 새 번들·이미지 포함 0건입니다.

    ClamAV stable-debian13-slim 이미지 검사에서는 패키지별 High 55건·Critical 1건(고유 CVE 20개)이 검출됐으며 스캐너의 수정 버전 표기는 모두 비어 있습니다. Critical 항목은 libxml2의 CVE-2026-6653입니다. 이는 취약점 목록 검사 결과이며 실제 악용 가능성을 검증한 결과가 아닙니다. 따라서 전체 이미지 취약점 검증을 통과한 것으로 보지 않으며 운영 전환 전 별도 조치·재검사가 필요합니다.

    실제 NAS·Cloudflare Worker 배포/SMTP 수신은 수행하지 않았습니다. 기존 이력에 노출됐던 웹훅 키는 운영 전환 시 Worker와 함께 교체해야 합니다. ClamAV는 upstream 이미지를 사용하며 자체 레지스트리로 복제하지 않습니다.

    전체 변경 · 운영 절차

    Downloads 2
  • 1.0

    이메일 수신 서버 1.0

    개인 메일함의 인증·수신·첨부 처리 구조를 개선한 첫 릴리즈입니다. 패키지 버전은 1.0.0이며 원문 수신 프로토콜은 v2입니다.

    • 초기 등록 전용 암호와 패스키 인증, HMAC 서명 원문 수신 및 영속 작업 복구
    • PDF·이미지·ZIP, ClamAV 검사, OpenPGP/S/MIME·암호 PDF/ZIP 처리
    • 한국어 검색·분류·모바일 UI와 SQLite 백업·복원
    • 비루트 Docker, host bind mount, 구 JSON 웹훅 제거 및 문서 정리

    이미지

    git.2ex.dev/hanyul/cloudflare-email-webhook:1.0 — Linux amd64

    고정 참조: git.2ex.dev/hanyul/cloudflare-email-webhook@sha256:57cbc914d826dac37a64c8489150f8229380421771f801f43196ed27f7b3d5e0

    소스 커밋: 37c121ac936389cce9d0dbde258a232500629249

    ClamAV는 Compose에 지정된 기존 upstream digest를 사용하며 별도 재게시하지 않습니다.

    검증 및 전환

    릴리즈 이미지의 Linux 통합 시험 17개 통과, 강제 종료·재전송·bind mount 재생성·백업 복구 확인. Trivy High/Critical 0건(검사 시점 기준), 알려진 비밀값의 새 이미지 포함 0건. 프런트 브라우저 및 로컬 workerd 검증 기록은 저장소 문서에 있습니다.

    실제 NAS 배포·Cloudflare SMTP 수신/재시도·Worker 운영 자원 한도는 미검증입니다. 이 릴리즈 게시는 운영 전환 완료를 의미하지 않습니다. 기존 Git 이력에 있던 웹훅 키는 반드시 교체하고 서버와 Worker v2를 함께 전환하세요. 구 /webhook JSON 경로는 지원하지 않습니다.

    배포·복구 절차 · 검증 범위

    Downloads 2