메일서버 구축기

Line Works 무료 서비스 종료 안내

요약: 님 이제 무료서비스 못 써요. 사서 쓰면 뭐 줄테니 사주실래요?

옛날에, 그러니까 2년 정도 지났네요. 아무튼, 그때는 Line Works를 네이버에서 운영했었습니다. 기업용 메일 서비스였지만 개인도 쓸 수 있었고 - 지금도 돈을 내면 개인이라도 쓸 수 있지만요. - 무료 요금제까지 있어서 신난다고 가입해서 썼죠. 딱히 자랑할 거리는 아니지만.

2년이나 쓰는 동안 네이버에서 분사하고 라인에 넘어가고 (뭐 어차피 같은 계열사긴 해도) 이름도 두 번이나 바꿨네요. 2년이면 오래 잘 썼죠. 솔직히 말해서 돈만 많았으면 그냥 돈 내고 쓰려고 했는데, 돈 없는 자취 + 대학생은 한 푼이라도 아껴서 맛있는 거 사 먹어야 하는 관계로 메일 서버 구축에 도전했습니다.

근데 서버도 네이버

옮기고 나서도 NHN 플랫폼에 얹혀있네요.

근데 메일서버가 참 골치 아프긴 합니다. 분명 다 오픈소스긴 한데, 왠지는 모르겠는데 설치만 해도 짜증이 밀려오고 두통이 이성을 갉아먹습니다. 쉬운 일이 아닌데, 쉽게 할 방법을 찾고 싶습니다. 이런 고민을 한 사람이 분명 있겠죠. 그리고 행동에 옮긴 사람도. 바퀴는 다시 만들지 말라고들 하는데 있는 거 가져다 씁시다.

https://hub.docker.com/r/hardware/mailserver/
1.1-stable

적당한 물건을 찾아줍니다. 이거 참 좋더라고요. 정말 누구나 생각은 할 수 있지만, 도저히 설치할 엄두가 안 나는 것들을 죄다 묶어다 컨테이너로 배포하고 있습니다. 이 컨테이너 이미지 안에는 Postfix, Dovecot, Rspamd, Clamav, Zeyple, Sieve, Fetchmail이 깔려있습니다. 네. 다 있어요. 설날에 한두개쯤은 받는 식용유 + 스팸 종합선물세트 같은 느낌입니다.

우선 가장 먼저 해야 할 일은 DNS 레코드 설정이겠죠. 아래처럼 설정해주세요.

  • A mail.domain.tld (IP)
  • A spam.main.domain.tld (IP)
  • A postfix.mail.domain.tld (IP)
  • MX domain.tld mail.redpumpkin.tld 10
  • TXT _dmarc v=DMARC1; p=reject; rua=mailto:(관리자 메일); ruf=mailto:(관리자 메일); fo=0; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject
  • TXT mail._domainkey v=DKIM1; k=rsa; p=(생성된 DKIM 키)
  • TXT domain.tld v=spf1 a mx ip4:(IP) ~all

공식 문서와는 조금 다르게 설정했습니다. traefik을 안 쓰다 보니, 완벽하게 같도록 설정할 필요성을 못 느꼈거든요.

그다음은 몇 가지 필요한 컨테이너들을 생성해줘야 합니다. redis, mysql(공식 문서는 mariadb 기준이지만, 어차피 호환되니까 괜찮아요), caddy.

redis와 mysql은 도커 공식 이미지로 생성하면 됩니다. caddy는 플러그인을 하나 깔아줘야 하는데, docker caddyfile loader을 깔아주시면 됩니다. 저는 설치해놓은 바이너리를 컨테이너로 만들어서 돌리고 있습니다. caddypath 어디다 마운트 시켜놓는 거 잊지 마세요. 경로는 ~/.caddy.

redis, mysql은 백엔드 네트워크로, caddy는 frontend 네트워크로 설정하고 메일서버 이미지를 올려봅시다.

mkdir /mnt/data/mail

docker service create --name mailserver --network frontend --network backend -e DBHOST=(데이터베이스 호스트) -e DBUSER=(데이터베이스 유저) -e DBPASS=(데이터베이스 비밀번호) -e DBNAME=(데이터베이스 이름) -e RSPAMD_PASSWORD=(비밀번호) -e ADD_DOMAINS=(도메인) -e DISABLE_CLAMAV=true(or false, 바이러스 검사 활성화 하고 싶으면) -e ENABLE_FETCHMAIL=true --hostname (도메인) --label caddy.address=spam.mail.domain.tld --label caddy.targetport=11334 --label caddy.proxy.transparent= -p 25:25 -p 143:143 -p 587:587 -p 993:993 -p 4190:4190 --mount type=bind,source=/mnt/data/mail,target=/var/mail hardware/mailserver:1.1-stable

면책사항: 이 명령어 틀렸을수도 있습니다.

짧죠?

... 아니라고요? 읽기 너무 힘들다고요?

mkdir /mnt/data/mail

docker service create \
    --name mailserver \
    --network frontend \
    --network backend \
    -e DBHOST=(데이터베이스 호스트) \
    -e DBUSER=(데이터베이스 유저) \
    -e DBPASS=(데이터베이스 비밀번호) \
    -e DBNAME=(데이터베이스 이름) \
    -e RSPAMD_PASSWORD=(비밀번호) \
    -e ADD_DOMAINS=(도메인) \
    -e DISABLE_CLAMAV=true(or false, 바이러스 검사 활성화 하고 싶으면) \
    -e ENABLE_FETCHMAIL=true \
    --hostname (도메인) \
    --label caddy.address=spam.mail.domain.tld \
    --label caddy.targetport=11334 \
    --label caddy.proxy.transparent= \
    -p 25:25 \
    -p 143:143 \
    -p 587:587 \
    -p 993:993 \
    -p 4190:4190 \
    --mount type=bind,source=/mnt/data/mail,target=/var/mail \
    hardware/mailserver:1.1-stable \

아무튼, 저 적당한 명령어를 실행시키면 메일서버가 뜹니다. 신난다! 라고 생각하고 메일 보내면 안 보내집니다. 로그인조차 안 돼요. 너무 신나죠?

당황하면서 로그를 찍어보면 답이 나옵니다. DB에서 테이블이 없다고 난리 치고 있더라고요. Postfix는 아무래도 상관없는데 Dovecot은 데이터베이스가 필요합니다. 그러니까, postfixadmin을 깔아줍니다.

docker service create \
    --name mailserver \
    --network frontend  \
    --network backend \
    -e DBHOST=(데이터베이스 호스트)  \
    -e DBUSER=(데이터베이스 유저) \
    -e DBPASS=(데이터베이스 비밀번호) \
    -e DBNAME=(데이터베이스 이름) \
    -e DOMAIN=domain.tld \
    -e SMTPHOST=mailserver \
    --label caddy.address=postfix.mail.domain.tld \
    --label caddy.targetport=11334 \
    --label caddy.proxy.transparent= \

들어가서 설치합니다. 비밀번호 치고 아래 명령어를 입력해줘야 합니다.

docker run -it (컨테이너 이름...) setup hash : (여러분 해시)

그리고, Domain List에 도메인 추가하고 Virutal List에 alias 전부 지우고 mailbox 추가하면 끝. 참고로 mailbox가 여러분의 메일 계정입니다.

Send Email 메뉴에서 눌러보면 잘 보내지는걸 확인할 수 있습니다.

이제 Fetch Email 눌러놓고 하고 한숨 자고 오면 됩니다.

참, 아웃룩에 연결할 때 이렇게 연결하면 됩니다.

  • SMTP/IMAP 호스트: mail.domain.tld
  • 계정: 여러분 이메일
  • 비밀번호: 이메일 비밀번호