• 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