Proton Mail Bridge, K8s 에 올리기

ARM 환경 포팅 및 API 기능 구현기

Proton Mail을 사용하여 메일 발송/수신을 관리하고 있다.

홈 서버를 구현하면서 각 서비스에 smtp, imap을 사용할 일이 생겼는데, Proton Mail 은 해당 기능을 사용하기 위해 Bridge 서비스를 사용하여야 했다.

sequenceDiagram autonumber actor U as "사용자" participant C as "메일 앱" participant B as "Proton Bridge (로컬)" participant S as "Proton 서버" participant R as "수신자" U->>C: 메일 작성 C->>B: localhost SMTP/IMAP B->>B: 로컬에서 암호화/서명 B->>S: Proton API로 암호문 전송 S->>R: 암호문 전달 Note over S: 서버는 암호문만 확인 R->>S: 암호화 메일 도착 S->>B: 암호문 전달 B->>B: 로컬에서 복호화 B->>C: 평문 표시

위 플로우를 보면 Bridge 는 로컬에서의 메일 암호화,복호화를 담당하고 이를 Proton 서버와 통신하는 서비스다.

그냥 K8s 에 올리면 그만 아닌가? 라고 생각하면 오답이다.
Proton Bridge 의 경우에는 데스크톱 GUI 클라이언트, CLI 만 지원하였고 이마저도 arm 환경에서는 동작하지 않았다.

하필 OCI 의 A1 flex 를 이용하던 나는 Bridge 서비스를 올릴 수 없게 되었다.


이대로 포기할 수는 없으니 개조하자.

1) ARM 환경에서도 돌아갈 수 있게 만들기

우선 기존 레포를 분석해보았다.

GitHub - ProtonMail/proton-bridge: Proton Mail Bridge application
Proton Mail Bridge application. Contribute to ProtonMail/proton-bridge development by creating an account on GitHub.
  • ProtonMail Bridge 는 Go 언어로 개발되었다.
  • CLI 는 ARM 환경과 이슈없이 동작할 수 있었다.

나는 브릿지를 K8s 에 올려야하기 때문에 도커파일을 작성하였다.

bridge/Dockerfile at master · noeulnight/bridge
Proton Mail Bridge application with http api. Contribute to noeulnight/bridge development by creating an account on GitHub.

Golang Build Layer 에서 애플리케이션을 빌드하고 Debian 으로 Bridge 를 실행하였다.

그럼 ARM 으로 돌아가나요?

답은 아니다. ARM 으로 돌리기 위해 Github Workflow, QEMU 에뮬레이터를 추가하였고, 해당 DockerFile 을 ARM 에서 빌드한 후 Packages 에 업로드하였다.

Build software better, together
GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

이제 bridge 는 내 홈 서버에서 정상적으로 동작한다.

2) 관리의 어려움

다만 CLI 애플리케이션의 한계로 인해 컨테이너에 직접 접근하여 accounts 를 추가, 삭제 및 동기화 할수밖에 없는 단점이 있었고, 이를 해결하기 위해 API 서비스를 추가하였다.

bridge/internal/frontend/web/service.go at master · noeulnight/bridge
Proton Mail Bridge application with http api. Contribute to noeulnight/bridge development by creating an account on GitHub.
bridge/internal/services/imapsmtpserver/listener.go at master · noeulnight/bridge
Proton Mail Bridge application with http api. Contribute to noeulnight/bridge development by creating an account on GitHub.

관리의 복잡성을 해소하기 위해 Basic Auth 를 사용하였고, API 를 통해 accounts 를 제어할 수 있게 되었다.

성공적으로 동기화, imap,smtp 서버가 생성된 모습

3) K8s 에 배포하기

homelab/bridge at main · noeulnight/homelab
K8s manifests for personal homelab (well, it’s actually OCI) - noeulnight/homelab

Bridge 를 배포하기 위해 Kustomization 에 Deployment 를 구성하고, 이를 Argocd 를 통해 배포하였다.

서비스가 파일에 메일 정보를 동기화하기 때문에, PV를 사용하여 노드에 데이터를 저장하였다.

데이터가 잘 저장되는 모습

추가로 IMAP, SMTP 를 외부에서 이용할 일이 없어 내부 서비스로만 배포하였고, 클러스터 내부 서비스에서는 CoreDNS 를 통해 bridge-service.bridge.svc.cluster.local 로 접속할 수 있게 구성하였다.

실제 발송 모습

같은 클러스터에 배포 된 n8n service 에서 bridge 를 통해 SMTP 를 잘 발송하였고
Proton Mail 클라이언트에서도 E2E Encrypted 되었다고 노출된다.


반영한 코드는 아래 주소에서 확인할 수 있다.