개요
Mailcow는 Docker 기반의 완전한 오픈소스 메일 서버 스위트입니다. GPL v3 라이선스로 배포되며, 9K+ GitHub Stars를 보유하고 있습니다. Postfix, Dovecot, SOGo, Rspamd, ClamAV 등 메일 서버에 필요한 모든 컴포넌트를 하나의 패키지로 제공하여, Gmail/Microsoft 365의 셀프호스팅 대안으로 사용할 수 있습니다.
Mailcow의 핵심 철학
Mailcow는 “🐮 + 🐋 = 💕” (소 + 고래 = 사랑)이라는 슬로건처럼, 복잡한 메일 서버 스택을 Docker로 단순화했습니다. 개별 컴포넌트 설정 없이 docker compose up -d 한 번으로 완전한 메일 서버를 구축할 수 있습니다.
주요 컴포넌트
| 컴포넌트 | 역할 | 설명 |
|---|---|---|
| Postfix | MTA (Mail Transfer Agent) | SMTP 메일 송수신 |
| Dovecot | MDA (Mail Delivery Agent) | IMAP/POP3 메일 저장 및 접근 |
| SOGo | Groupware | 웹메일, 캘린더, 연락처, ActiveSync |
| Rspamd | 스팸 필터 | 머신러닝 기반 스팸 탐지 |
| ClamAV | 바이러스 스캔 | 첨부파일 악성코드 검사 |
| Nginx | 웹 서버 | 웹 UI 및 리버스 프록시 |
| MariaDB | 데이터베이스 | 사용자, 도메인, 설정 저장 |
| Redis | 캐시 | 스팸 정보, DKIM 키 저장 |
| Unbound | DNS 리졸버 | DNSSEC 검증용 내장 DNS |
| ACME | SSL 인증서 | Let’s Encrypt 자동 발급/갱신 |
| Netfilter | 방화벽 | Fail2Ban 기반 브루트포스 차단 |
| Olefy | 문서 스캔 | Office 문서 악성코드 검사 |
주요 특징
| 기능 | 설명 |
|---|---|
| 멀티 도메인 | 무제한 도메인 호스팅 |
| 웹메일 (SOGo) | 반응형 UI, 드래그 앤 드롭 |
| 캘린더/연락처 | CalDAV/CardDAV 지원 |
| ActiveSync | 모바일 기기 자동 동기화 |
| 스팸 필터링 | Rspamd + Bayes 학습 |
| 바이러스 스캔 | ClamAV 실시간 검사 |
| DKIM/SPF/DMARC | 이메일 인증 자동 설정 |
| 2FA | TOTP 이중 인증 |
| 앱 비밀번호 | 앱별 별도 비밀번호 |
| 쿼터 관리 | 사용자별 용량 제한 |
| 에일리어스 | 무제한 별칭 주소 |
| 전달 규칙 | Sieve 필터링 |
| API | RESTful API 제공 |
| 자동 업데이트 | 원클릭 업데이트 |
| 암호화 저장 | 메일 암호화 저장 |
메일 서버 비교
| 기능 | Mailcow | Mailu | iRedMail | Mail-in-a-Box |
|---|---|---|---|---|
| Docker 기반 | ✅ | ✅ | ❌ | ❌ |
| 웹메일 | SOGo | Roundcube | Roundcube | Roundcube |
| 캘린더/연락처 | ✅ SOGo | ❌ | ❌ | Nextcloud |
| ActiveSync | ✅ | ❌ | ❌ | ❌ |
| 스팸 필터 | Rspamd | Rspamd | SpamAssassin | SpamAssassin |
| 바이러스 스캔 | ClamAV | ClamAV | ClamAV | ClamAV |
| 관리 UI | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 설치 난이도 | 쉬움 | 쉬움 | 중간 | 쉬움 |
| 리소스 사용 | 높음 (6GB+) | 중간 (2GB+) | 중간 | 중간 |
| 커뮤니티 | 매우 활발 | 활발 | 활발 | 활발 |
시스템 요구 사항
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| RAM | 4GB (ClamAV 비활성화 시 2GB) | 6GB 이상 |
| CPU | 2 코어 | 4 코어 이상 |
| 저장소 | 20GB | 50GB 이상 (SSD/NVMe) |
| Docker | 24.0.0+ | 최신 버전 |
| Docker Compose | 2.0+ | 최신 버전 |
| OS | Debian 11/12, Ubuntu 22.04/24.04 | Debian 12 |
필수 포트
| 포트 | 프로토콜 | 용도 |
|---|---|---|
| 25 | SMTP | 메일 수신 |
| 80 | HTTP | 웹 UI, ACME 인증 |
| 110 | POP3 | POP3 (선택) |
| 143 | IMAP | IMAP |
| 443 | HTTPS | 웹 UI (SSL) |
| 465 | SMTPS | SMTP over SSL |
| 587 | Submission | SMTP 발송 |
| 993 | IMAPS | IMAP over SSL |
| 995 | POP3S | POP3 over SSL |
| 4190 | Sieve | Sieve 필터 관리 |
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) 비밀번호 변경
- 우측 상단 admin 클릭
- Edit 선택
- 새 비밀번호 설정
4) 도메인 추가
- Configuration > Mail Setup > Domains
- Add domain 클릭
- 도메인 입력:
example.com - 설정 조정 (쿼터, 제한 등)
- Add domain 클릭
5) DKIM 키 생성
- Configuration > ARC/DKIM Keys
- 도메인 선택
- Generate 클릭 (2048비트 권장)
- 생성된 TXT 레코드를 DNS에 추가
6) 메일박스 생성
- Configuration > Mail Setup > Mailboxes
- Add mailbox 클릭
- 정보 입력:
- Username:
user - Domain:
example.com - Full name:
사용자 이름 - Password: 안전한 비밀번호
- Quota: 용량 제한 (MB)
- Username:
- 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 활성화
- 사용자 로그인 > 우측 상단 계정 클릭
- Two-factor authentication 활성화
- TOTP 앱 (Google Authenticator 등)으로 QR 코드 스캔
앱 비밀번호 생성
2FA 활성화 시 이메일 클라이언트용 별도 비밀번호:
- App passwords 메뉴
- Create app password 클릭
- 이름 입력 후 생성
- 생성된 비밀번호를 클라이언트에 사용
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 등)를 통해 발송:
- Configuration > Mail Setup > Routing
- Add sender-dependent transport 클릭
- 설정 입력:
- Host:
email-smtp.us-east-1.amazonaws.com - Port:
587 - Username/Password: SMTP 자격 증명
- Host:
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
업데이트 전 확인사항
- 백업 수행: 업데이트 전 항상 백업
- 릴리스 노트 확인: https://mailcow.email/
- 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
- 스팸 통계
- 학습 상태
- 실시간 로그
리소스 모니터링
# 컨테이너별 리소스 사용량
docker stats
# 디스크 사용량
docker system df -v
⚠️ 메일 서버 셀프호스팅 주의사항
메일 서버 운영은 지속적인 관리가 필요합니다:
| 항목 | 설명 |
|---|---|
| IP 평판 | 새 IP는 스팸으로 분류될 수 있음. 워밍업 필요 |
| 역방향 DNS | PTR 레코드 필수. 호스팅 업체에 요청 |
| 포트 25 차단 | 많은 클라우드에서 기본 차단. 해제 요청 필요 |
| 블랙리스트 | 정기적으로 IP 블랙리스트 모니터링 |
| 보안 업데이트 | 월간 업데이트 적용 권장 |
| 백업 | 일일 자동 백업 필수 |
| 모니터링 | 큐, 로그, 디스크 공간 모니터링 |
권장 전략
- 수신: Mailcow 셀프호스팅 ✅
- 발송: 대량 메일은 외부 SMTP (Amazon SES, Mailgun) 릴레이 권장