Proton Mail Bridge, K8s 에 올리기
ARM 환경 포팅 및 API 기능 구현기
Proton Mail을 사용하여 메일 발송/수신을 관리하고 있다.
홈 서버를 구현하면서 각 서비스에 smtp, imap을 사용할 일이 생겼는데, Proton Mail 은 해당 기능을 사용하기 위해 Bridge 서비스를 사용하여야 했다.
위 플로우를 보면 Bridge 는 로컬에서의 메일 암호화,복호화를 담당하고 이를 Proton 서버와 통신하는 서비스다.
그냥 K8s 에 올리면 그만 아닌가? 라고 생각하면 오답이다.
Proton Bridge 의 경우에는 데스크톱 GUI 클라이언트, CLI 만 지원하였고 이마저도 arm 환경에서는 동작하지 않았다.
하필 OCI 의 A1 flex 를 이용하던 나는 Bridge 서비스를 올릴 수 없게 되었다.
이대로 포기할 수는 없으니 개조하자.
1) ARM 환경에서도 돌아갈 수 있게 만들기
우선 기존 레포를 분석해보았다.
- ProtonMail Bridge 는 Go 언어로 개발되었다.
- CLI 는 ARM 환경과 이슈없이 동작할 수 있었다.
나는 브릿지를 K8s 에 올려야하기 때문에 도커파일을 작성하였다.
Golang Build Layer 에서 애플리케이션을 빌드하고 Debian 으로 Bridge 를 실행하였다.
그럼 ARM 으로 돌아가나요?
답은 아니다. ARM 으로 돌리기 위해 Github Workflow, QEMU 에뮬레이터를 추가하였고, 해당 DockerFile 을 ARM 에서 빌드한 후 Packages 에 업로드하였다.

이제 bridge 는 내 홈 서버에서 정상적으로 동작한다.
2) 관리의 어려움
다만 CLI 애플리케이션의 한계로 인해 컨테이너에 직접 접근하여 accounts 를 추가, 삭제 및 동기화 할수밖에 없는 단점이 있었고, 이를 해결하기 위해 API 서비스를 추가하였다.
관리의 복잡성을 해소하기 위해 Basic Auth 를 사용하였고, API 를 통해 accounts 를 제어할 수 있게 되었다.

3) K8s 에 배포하기
Bridge 를 배포하기 위해 Kustomization 에 Deployment 를 구성하고, 이를 Argocd 를 통해 배포하였다.
서비스가 파일에 메일 정보를 동기화하기 때문에, PV를 사용하여 노드에 데이터를 저장하였다.

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



같은 클러스터에 배포 된 n8n service 에서 bridge 를 통해 SMTP 를 잘 발송하였고
Proton Mail 클라이언트에서도 E2E Encrypted 되었다고 노출된다.
반영한 코드는 아래 주소에서 확인할 수 있다.