Mailcow: 올인원 오픈소스 메일 서버 Docker 설치 가이드




개요

Mailcow는 Docker 기반의 완전한 오픈소스 메일 서버 스위트입니다. GPL v3 라이선스로 배포되며, 9K+ GitHub Stars를 보유하고 있습니다. Postfix, Dovecot, SOGo, Rspamd, ClamAV 등 메일 서버에 필요한 모든 컴포넌트를 하나의 패키지로 제공하여, Gmail/Microsoft 365의 셀프호스팅 대안으로 사용할 수 있습니다.

Mailcow의 핵심 철학

Mailcow는 “🐮 + 🐋 = 💕” (소 + 고래 = 사랑)이라는 슬로건처럼, 복잡한 메일 서버 스택을 Docker로 단순화했습니다. 개별 컴포넌트 설정 없이 docker compose up -d 한 번으로 완전한 메일 서버를 구축할 수 있습니다.

주요 컴포넌트

컴포넌트역할설명
PostfixMTA (Mail Transfer Agent)SMTP 메일 송수신
DovecotMDA (Mail Delivery Agent)IMAP/POP3 메일 저장 및 접근
SOGoGroupware웹메일, 캘린더, 연락처, ActiveSync
Rspamd스팸 필터머신러닝 기반 스팸 탐지
ClamAV바이러스 스캔첨부파일 악성코드 검사
Nginx웹 서버웹 UI 및 리버스 프록시
MariaDB데이터베이스사용자, 도메인, 설정 저장
Redis캐시스팸 정보, DKIM 키 저장
UnboundDNS 리졸버DNSSEC 검증용 내장 DNS
ACMESSL 인증서Let’s Encrypt 자동 발급/갱신
Netfilter방화벽Fail2Ban 기반 브루트포스 차단
Olefy문서 스캔Office 문서 악성코드 검사

주요 특징

기능설명
멀티 도메인무제한 도메인 호스팅
웹메일 (SOGo)반응형 UI, 드래그 앤 드롭
캘린더/연락처CalDAV/CardDAV 지원
ActiveSync모바일 기기 자동 동기화
스팸 필터링Rspamd + Bayes 학습
바이러스 스캔ClamAV 실시간 검사
DKIM/SPF/DMARC이메일 인증 자동 설정
2FATOTP 이중 인증
앱 비밀번호앱별 별도 비밀번호
쿼터 관리사용자별 용량 제한
에일리어스무제한 별칭 주소
전달 규칙Sieve 필터링
APIRESTful API 제공
자동 업데이트원클릭 업데이트
암호화 저장메일 암호화 저장

메일 서버 비교

기능MailcowMailuiRedMailMail-in-a-Box
Docker 기반
웹메일SOGoRoundcubeRoundcubeRoundcube
캘린더/연락처✅ SOGoNextcloud
ActiveSync
스팸 필터RspamdRspamdSpamAssassinSpamAssassin
바이러스 스캔ClamAVClamAVClamAVClamAV
관리 UI⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
설치 난이도쉬움쉬움중간쉬움
리소스 사용높음 (6GB+)중간 (2GB+)중간중간
커뮤니티매우 활발활발활발활발

시스템 요구 사항

항목최소 사양권장 사양
RAM4GB (ClamAV 비활성화 시 2GB)6GB 이상
CPU2 코어4 코어 이상
저장소20GB50GB 이상 (SSD/NVMe)
Docker24.0.0+최신 버전
Docker Compose2.0+최신 버전
OSDebian 11/12, Ubuntu 22.04/24.04Debian 12

필수 포트

포트프로토콜용도
25SMTP메일 수신
80HTTP웹 UI, ACME 인증
110POP3POP3 (선택)
143IMAPIMAP
443HTTPS웹 UI (SSL)
465SMTPSSMTP over SSL
587SubmissionSMTP 발송
993IMAPSIMAP over SSL
995POP3SPOP3 over SSL
4190SieveSieve 필터 관리

DNS 설정 (필수)

메일 서버 설치 전 DNS 설정이 매우 중요합니다.

필수 DNS 레코드

# A 레코드 - 메일 서버 IP
mail.example.com.    IN  A      203.0.113.1

# MX 레코드 - 메일 수신 서버
example.com.         IN  MX  10  mail.example.com.

# SPF 레코드 - 발송 서버 인증
example.com.         IN  TXT     "v=spf1 mx ~all"

# PTR 레코드 (역방향 DNS) - 호스팅 제공업체에서 설정
203.0.113.1          IN  PTR     mail.example.com.

선택 DNS 레코드 (설치 후 추가)

# DKIM 레코드 - Mailcow UI에서 생성된 값 사용
dkim._domainkey.example.com.  IN  TXT  "v=DKIM1; k=rsa; p=MIIBIj..."

# DMARC 레코드
_dmarc.example.com.  IN  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"

# 자동 검색 (Autodiscover)
autodiscover.example.com.  IN  CNAME  mail.example.com.
autoconfig.example.com.    IN  CNAME  mail.example.com.

Docker 설치

사전 준비

# 시스템 업데이트
sudo apt update && sudo apt upgrade -y

# 필수 패키지 설치
sudo apt install -y git openssl curl gawk coreutils grep jq

# Docker 설치
curl -sSL https://get.docker.com/ | CHANNEL=stable sh
sudo systemctl enable --now docker

# 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER
newgrp docker

포트 확인

# 사용 중인 포트 확인 (비어 있어야 함)
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

umask 설정

# umask 확인 (0022 또는 0002여야 함)
umask

# 필요시 설정
umask 0022

Mailcow 설치

# Mailcow 클론
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

# 설정 파일 생성
sudo ./generate_config.sh

설정 마법사에서:

  • Mail server hostname (FQDN): mail.example.com 입력
  • Timezone: Asia/Seoul 또는 원하는 시간대 선택

설정 파일 수정 (선택사항)

mailcow.conf 파일 수정:

sudo nano mailcow.conf

주요 설정:

# 호스트명 (generate_config.sh에서 설정됨)
MAILCOW_HOSTNAME=mail.example.com

# 시간대
TZ=Asia/Seoul

# ClamAV 비활성화 (메모리 부족 시)
SKIP_CLAMD=n

# 전문 검색 비활성화 (메모리 부족 시)
SKIP_FTS=n

# Solr (전문 검색) 대신 Flatcurve 사용 (권장)
# 2024년부터 기본값

# HTTPS 리다이렉트
ADDITIONAL_SAN=

# API 키 (나중에 UI에서 생성)
API_KEY=
API_KEY_READ_ONLY=
API_ALLOW_FROM=172.22.1.1,127.0.0.1

Mailcow 시작

# 이미지 다운로드 및 시작
sudo docker compose pull
sudo docker compose up -d

참고: 첫 시작 시 이미지 다운로드에 시간이 걸립니다. docker compose logs -f로 진행 상황을 확인하세요.

초기 설정

1) 웹 UI 접속

브라우저에서 https://mail.example.com으로 접속합니다.

2) 관리자 로그인

기본 관리자 계정:

  • 사용자명: admin
  • 비밀번호: moohoo

⚠️ 즉시 비밀번호를 변경하세요!

3) 비밀번호 변경

  1. 우측 상단 admin 클릭
  2. Edit 선택
  3. 새 비밀번호 설정

4) 도메인 추가

  1. Configuration > Mail Setup > Domains
  2. Add domain 클릭
  3. 도메인 입력: example.com
  4. 설정 조정 (쿼터, 제한 등)
  5. Add domain 클릭

5) DKIM 키 생성

  1. Configuration > ARC/DKIM Keys
  2. 도메인 선택
  3. Generate 클릭 (2048비트 권장)
  4. 생성된 TXT 레코드를 DNS에 추가

6) 메일박스 생성

  1. Configuration > Mail Setup > Mailboxes
  2. Add mailbox 클릭
  3. 정보 입력:
    • Username: user
    • Domain: example.com
    • Full name: 사용자 이름
    • Password: 안전한 비밀번호
    • Quota: 용량 제한 (MB)
  4. Add mailbox 클릭

웹메일 (SOGo) 사용

접속

https://mail.example.com/SOGo 또는 상단 메뉴 Apps > Webmail

로그인

  • 사용자명: 전체 이메일 주소 (user@example.com)
  • 비밀번호: 메일박스 비밀번호

주요 기능

  • 메일: 읽기, 작성, 폴더 관리
  • 캘린더: 일정 관리, 공유 캘린더
  • 연락처: 주소록 관리, CardDAV 동기화
  • 설정: 필터, 자동 응답, 서명

이메일 클라이언트 설정

Thunderbird / Outlook

수신 서버 (IMAP):
  서버: mail.example.com
  포트: 993
  보안: SSL/TLS
  인증: 일반 비밀번호

발신 서버 (SMTP):
  서버: mail.example.com
  포트: 587
  보안: STARTTLS
  인증: 일반 비밀번호

모바일 (ActiveSync)

iOS/Android 기본 메일 앱에서 Exchange 계정으로 추가:

이메일: user@example.com
서버: mail.example.com
도메인: (비워두기)
사용자명: user@example.com
비밀번호: 메일박스 비밀번호

자동 설정

Mailcow는 Autodiscover/Autoconfig를 지원합니다. DNS 설정이 올바르면 클라이언트가 자동으로 서버 정보를 가져옵니다.

보안 설정

2FA 활성화

  1. 사용자 로그인 > 우측 상단 계정 클릭
  2. Two-factor authentication 활성화
  3. TOTP 앱 (Google Authenticator 등)으로 QR 코드 스캔

앱 비밀번호 생성

2FA 활성화 시 이메일 클라이언트용 별도 비밀번호:

  1. App passwords 메뉴
  2. Create app password 클릭
  3. 이름 입력 후 생성
  4. 생성된 비밀번호를 클라이언트에 사용

Fail2Ban 설정

Mailcow는 Netfilter 컨테이너를 통해 자동으로 브루트포스 공격을 차단합니다.

설정 확인:

# 차단된 IP 확인
docker exec $(docker ps -qf name=netfilter-mailcow) cat /tmp/fail2ban_permban.txt

# 로그 확인
docker logs $(docker ps -qf name=netfilter-mailcow) --tail 100

고급 설정

HTTP → HTTPS 리다이렉트

# Nginx 설정 파일 생성
cat << 'EOF' | sudo tee /opt/mailcow-dockerized/data/conf/nginx/redirect.conf
server {
  root /web;
  listen 80 default_server;
  listen [::]:80 default_server;
  include /etc/nginx/conf.d/server_name.active;

  if ( $request_uri ~* "^(.*)/+$" ) {
    return 301 $1;
  }

  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }

  location / {
    return 301 https://$host$uri$is_args$args;
  }
}
EOF

# Nginx 재시작
docker compose restart nginx-mailcow

ClamAV 비활성화 (메모리 절약)

mailcow.conf 수정:

SKIP_CLAMD=y

재시작:

docker compose down
docker compose up -d

릴레이 호스트 설정 (외부 SMTP 사용)

외부 SMTP (Amazon SES, Mailgun 등)를 통해 발송:

  1. Configuration > Mail Setup > Routing
  2. Add sender-dependent transport 클릭
  3. 설정 입력:
    • Host: email-smtp.us-east-1.amazonaws.com
    • Port: 587
    • Username/Password: SMTP 자격 증명

LDAP/Active Directory 연동 (2025년 신규)

최신 버전에서 외부 인증 소스 지원:

Configuration > System > External Authentication
LDAP Server: ldap://ldap.example.com
Base DN: dc=example,dc=com
Bind DN: cn=admin,dc=example,dc=com

트러블슈팅

컨테이너 상태 확인

cd /opt/mailcow-dockerized

# 모든 컨테이너 상태
docker compose ps

# 특정 컨테이너 로그
docker compose logs -f postfix-mailcow
docker compose logs -f dovecot-mailcow
docker compose logs -f rspamd-mailcow

메일 큐 확인

# Postfix 큐 확인
docker exec $(docker ps -qf name=postfix-mailcow) postqueue -p

# 큐 플러시
docker exec $(docker ps -qf name=postfix-mailcow) postqueue -f

스팸 필터 학습

# 스팸으로 학습
docker exec $(docker ps -qf name=rspamd-mailcow) rspamc learn_spam < spam_mail.eml

# 햄(정상)으로 학습
docker exec $(docker ps -qf name=rspamd-mailcow) rspamc learn_ham < good_mail.eml

SSL 인증서 갱신

# 인증서 상태 확인
docker exec $(docker ps -qf name=acme-mailcow) acme.sh --list

# 강제 갱신
docker exec $(docker ps -qf name=acme-mailcow) acme.sh --renew -d mail.example.com --force

이메일 전송 테스트

# 테스트 메일 발송
docker exec $(docker ps -qf name=postfix-mailcow) \
  swaks --to test@gmail.com --from user@example.com \
  --server localhost --tls

IP 블랙리스트 확인

# MXToolbox에서 확인
curl "https://mxtoolbox.com/SuperTool.aspx?action=blacklist%3a203.0.113.1"

# 또는 웹에서 확인
# https://mxtoolbox.com/blacklists.aspx

백업 및 복원

내장 백업 스크립트

cd /opt/mailcow-dockerized

# 백업 실행
./helper-scripts/backup_and_restore.sh backup all

# 백업 위치: /opt/mailcow-dockerized/backups/

수동 백업

#!/bin/bash
BACKUP_DIR="/backups/mailcow/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

cd /opt/mailcow-dockerized

# 서비스 중지 (선택적, 일관성을 위해)
# docker compose down

# 설정 파일 백업
cp mailcow.conf $BACKUP_DIR/

# Docker 볼륨 백업
for vol in $(docker volume ls -q | grep mailcow); do
  echo "Backing up $vol..."
  docker run --rm \
    -v ${vol}:/data \
    -v $BACKUP_DIR:/backup \
    alpine tar czf /backup/${vol}.tar.gz /data
done

# 서비스 재시작
# docker compose up -d

echo "Backup completed: $BACKUP_DIR"

복원

cd /opt/mailcow-dockerized

# 내장 스크립트로 복원
./helper-scripts/backup_and_restore.sh restore

업데이트

자동 업데이트

cd /opt/mailcow-dockerized

# 업데이트 확인 및 적용
./update.sh

# 또는 강제 업데이트
./update.sh --force

업데이트 전 확인사항

  1. 백업 수행: 업데이트 전 항상 백업
  2. 릴리스 노트 확인: https://mailcow.email/
  3. Breaking Changes 확인: 주요 변경사항 체크

버전 확인

# 현재 버전
cat /opt/mailcow-dockerized/data/conf/postfix/custom_header_checks 2>/dev/null || \
  git -C /opt/mailcow-dockerized describe --tags

모니터링

Mailcow UI 통계

  • Configuration > Debug > Container information
  • Mailbox > Statistics

Rspamd 웹 UI

https://mail.example.com/rspamd
  • 스팸 통계
  • 학습 상태
  • 실시간 로그

리소스 모니터링

# 컨테이너별 리소스 사용량
docker stats

# 디스크 사용량
docker system df -v

⚠️ 메일 서버 셀프호스팅 주의사항

메일 서버 운영은 지속적인 관리가 필요합니다:

항목설명
IP 평판새 IP는 스팸으로 분류될 수 있음. 워밍업 필요
역방향 DNSPTR 레코드 필수. 호스팅 업체에 요청
포트 25 차단많은 클라우드에서 기본 차단. 해제 요청 필요
블랙리스트정기적으로 IP 블랙리스트 모니터링
보안 업데이트월간 업데이트 적용 권장
백업일일 자동 백업 필수
모니터링큐, 로그, 디스크 공간 모니터링

권장 전략

  • 수신: Mailcow 셀프호스팅 ✅
  • 발송: 대량 메일은 외부 SMTP (Amazon SES, Mailgun) 릴레이 권장



댓글 남기기