name@ourcompany.com 같은 자체 도메인 이메일. 워크스페이스 구독으로 해결할 수도 있지만, 사용자 수만큼 매달 과금된다. Mailcow는 메일 서버 스택 전부 — 수신·발신·스팸필터·웹메일 — 를 도커로 묶어 제공하는 오픈소스다. 다만 이메일은 셀프호스팅 난이도 최상위 종목이라, 이 글은 설치법보다 "시작하기 전에 확인할 세 가지 관문"을 정직하게 먼저 다룬다.
필요한 것은 25번 포트가 열린 서버, 역방향 DNS를 설정할 수 있는 고정 IP, 그리고 도메인 DNS 제어권 — 아래에서 하나씩 설명한다.
메일 서버는 하나의 프로그램이 아니다. 발신(SMTP), 수신함(IMAP), 스팸 필터, 바이러스 검사, 웹메일 — 전문 분야가 다른 여러 프로그램의 조합이고, 이들을 서로 맞추는 게 자체 메일 서버 구축의 진입장벽이었다. Mailcow는 이 스택 전부를 검증된 조합으로 묶어 도커 컴포즈 한 번에 띄워주는 배포판이다.
| 구성 요소 | 역할 |
|---|---|
| Postfix | SMTP — 메일 발신·수신 |
| Dovecot | IMAP/POP3 — 수신함 |
| SOGo | 웹메일 + 캘린더·주소록, 모바일 동기화(ActiveSync) |
| Rspamd | 스팸 필터 — 자동 학습 지원 |
| ClamAV | 첨부파일 바이러스 검사 |
| 관리자 UI | 계정·도메인·쿼터 관리, DKIM 키 자동 생성 |
계정은 무제한, 도메인도 여러 개 운영 가능하다. DKIM 서명 키를 관리자 UI가 생성해주고, 스팸 필터는 사용자가 "스팸/스팸 아님" 버튼을 누를 때마다 학습한다.
flowchart TB
DNS["DNS 레코드 - MX · SPF · DKIM · DMARC"]
O["상대 메일 서버 - 구글 · 네이버 등"]
subgraph SRV["Docker - mailcow 스택"]
PF["Postfix - SMTP 수신·발신"]
RS["Rspamd - 스팸·바이러스 필터"]
DV["Dovecot - IMAP 수신함"]
SG["SOGo - 웹메일·캘린더"]
end
C["메일 클라이언트 - 폰 · PC"]
O -->|수신 메일| PF
PF -->|발신 메일| O
DNS -.->|발신자 신뢰 검증| O
PF --> RS
PF --> DV
C --> SG
SG --> DV
여기서 DNS 레코드가 차지하는 비중이 크다. 상대 메일 서버는 내가 누구인지 DNS에 등록된 증거들(SPF, DKIM, DMARC, 역방향 DNS)로 판단한다. 서버 설정만 완벽해도 DNS가 엉망이면 메일이 스팸함으로 사라진다.
메일 자체호스팅의 성패는 설치가 아니라 여기서 갈린다.
관문 1 — 25번 포트가 열려 있는가. 메일 발신은 TCP 25번 포트를 쓰는데, 대부분의 가정용 인터넷 회선과 주요 클라우드(AWS·GCP·Azure)는 스팸 방지를 위해 기본 차단한다. 국내 하이브리드/서버 호스팅이나 포트 개방 신청이 가능한 환경이어야 한다.
관문 2 — 역방향 DNS(PTR)를 설정할 수 있는가. 받는 쪽 서버는 발신 IP의 역방향 조회 결과가 발신 도메인과 일치하는지 확인한다. IP를 할당한 업체에 PTR 등록 요청이 가능해야 한다.
관문 3 — 도메인 DNS를 마음대로 수정할 수 있는가. MX, SPF, DKIM, DMARC 레코드를 직접 추가할 수 있어야 한다.
세 가지 모두 가능하면 mailcow 설치 자체는 의외로 단순하다. 하나라도 불가능하면 — 솔직히 말해 이 글은 참고만 하고, 발신은 메일 릴레이 서비스를 붙이거나 메일은 외부 서비스를 유지하는 편이 정신건강에 이롭다.
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh # 접속 도메인(mail.example.com)과 시간대를 입력하면 mailcow.conf 생성
docker compose up -d
기동 후 관리자 UI(https://mail.example.com, 초기 계정 admin/moohoo — 즉시 변경)에 접속해 다음 순서로 진행한다.
| DNS 레코드 | 값 예시 | 역할 |
|---|---|---|
| MX | mail.example.com (우선순위 10) | 이 도메인 메일의 수신 위치 |
| TXT (SPF) | v=spf1 mx ~all | 발신을 허가한 서버 선언 |
| TXT (DKIM) | dkim._domainkey — 관리자 UI가 생성 | 메일 서명 검증 공개키 |
| TXT (DMARC) | _dmarc — v=DMARC1; p=quarantine | 위조 메일 정책·리포트 |
| A + PTR | mail.example.com과 서버 IP 상호 일치 | 역방향 조회 일치 확인 |
발신 신뢰는 워밍업이 필요하다. DKIM·DMARC를 전부 세팅해도, 새 서버의 발신은 초기에 스팸함으로 분류되는 경우가 있다. 구글·네이버 같은 주요 서비스로 테스트 메일을 꾸준히 주고받으며 도메인 평판이 쌓이기를 기다리는 단계를 밟자. mail-tester 점수가 10점이면 설정은 완벽한 상태다.
스팸 필터는 가르친다. Rspamd는 사용자가 웹메일에서 스팸/스팸 아님 처리할 때마다 학습한다. 초기 며칠만 진지하게 눌러주면 이후 오탐이 눈에 띄게 줄어든다.
백업은 내장 스크립트로. ./backup_and_restore.sh backup all 한 줄이 메일함·설정 전체를 덤프한다. cron에 걸어 외부 저장소로 옮기는 구성이 기본값이다.
업데이트도 스크립트로. 저장소의 update.sh가 마이그레이션을 포함해 처리한다. 다만 메일은 회사의 급이 되는 서비스이니, 업데이트 전 백업과 업무 시간 외 실행은 원칙으로.
| 증상 | 원인 | 해결 |
|---|---|---|
| 발신 메일이 스팸함으로 간다 | DKIM·DMARC 미설정, PTR 불일치 | DNS 레코드 점검 + mail-tester 점수 확인 |
| 발신 자체가 안 된다 | 25번 포트 차단 | 회선·클라우드 정책 확인, 릴레이 검토 |
| 수신이 안 된다 | MX 레코드 누락·오류 | DNS 확인 후 dig로 조회 테스트 |
| 대용량 첨부가 실패한다 | 메시지 크기 제한 | mailcow.conf의 크기 설정 조정 후 재기동 |
| 업데이트 후 일부 컨테이너 재시작 반복 | 마이그레이션 중단 | update.sh 재실행, 로그 확인 |
세 가지 관문(25포트·PTR·DNS)이 통과되고 스팸함 워밍업을 견딜 수 있다면 충분히 가능하고, 한 번 안정되면 가장 만족스러운 셀프호스팅 영역이다. 반대로 관문이 막혔다면 억지로 하지 말자. 메일은 실패 비용(업무 메일 유실)이 큰 서비스다.
메일·캘린더·주소록·모바일 동기화는 가능하다(ActiveSync 지원). 문서 협업이나 드라이브는 별도 서비스(Seafile·Immich 같은 이 시리즈의 다른 화들)와 조합하는 구성이 된다.
Rspamd 자체가 상용급이고, 사용자 학습을 거칠수록 좋아진다. 발신 쪽은 DKIM+DMARC 덕에 위조 메일로 오인될 일이 없어진다.
backup_and_restore.sh가 전부 덤프해준다. 복구는 스크립트의 restore 모드로, 메일함 단위 선택 복구도 가능하다.
서버 한 대로 충분하다 연재 목차 — 시리즈 소개 · 1화. Home Assistant · 2화. Frigate + go2rtc · 3화. Seafile 13 · 4화. Immich · 5화. Vaultwarden
실제 운영 도메인 메일로 검증한 구성입니다. 발신 평판 관리 경험 포함.
| 이전 | 5화. Vaultwarden — 비밀번호 관리를 내 서버로 옮기기 (Bitwarden 호환) | 2026-09-30 | |
|---|---|---|---|
| 다음 | 7화. MinIO — S3 API를 내 방에. 오브젝트 스토리지 입문 | 2026-10-01 |