Mailcow 메일 서버 구축 및 Gmail 수신 설정 가이드
Mailcow 설치 전 VPS의 25번 포트 차단 여부를 반드시 확인하십시오. 차단 시 메일이 큐에 쌓여 반송됩니다. 또한 Gmail의 550 5.7.25 오류를 해결하기 위한 올바른 PTR 레코드 설정법을 상세히 설명합니다.
구축할 시스템
직접 소유한 서버에서 SMTP로 메일을 송수신하고, IMAP으로 휴대폰과 노트북 간 동기화를 유지하며, 웹메일 클라이언트와 양방향 스팸 필터를 갖춘 완전한 메일 서버를 구축합니다. mailcow-dockerized는 Postfix, Dovecot, Rspamd, SOGo 웹메일, MariaDB, Redis 및 ACME 클라이언트를 하나의 Docker Compose 스택으로 묶어 제공하므로 소프트웨어 설치 자체는 어렵지 않습니다. 30분이면 구동할 수 있습니다.
어려운 부분은 그 외의 환경 설정입니다. 이메일은 인터넷상의 다른 서버들이 신규 서버를 적극적으로 불신하는 유일한 서비스입니다. "작동은 하지만 Gmail이 모든 메시지를 조용히 삭제하는" 상태와 정상적인 메일 서버 사이의 차이는 대부분 4개의 DNS 레코드와 직접 통제하기 어려운 IP 평판 설정 하나에 달려 있습니다. 서버를 임대하기 전에 아래의 사전 요구 사항을 읽어 보십시오. 내용을 확인한 후 평판 관리에 들이는 노력이 가치가 없다고 판단된다면, 그것 또한 타당한 결정입니다. 2026년 기준 직접 호스팅할 가치가 있는 서비스 문서에서도 바로 이러한 이유로 이메일 호스팅을 "진지하게 운영할 의지가 있을 때만" 권장하는 항목으로 분류하고 있습니다.
사전 요구 사항이 곧 프로젝트 그 자체입니다
이 중 하나라도 빠뜨리면 메일이 절대 도착하지 않습니다. 사용자들이 가장 자주 겪는 문제 순서대로 정리했습니다.
아웃바운드 25번 포트가 열려 있어야 합니다. 서버는 TCP 25번 포트를 통해 Gmail과 Microsoft로 메일을 전달합니다. 많은 VPS 및 클라우드 제공업체는 스팸 방지를 위해 기본적으로 아웃바운드 25번 포트를 차단합니다. 이 차단은 조용히 이루어지며, 부팅 시 오류가 발생하지 않고 모든 것이 정상처럼 보입니다. 메일은 큐에 대기 상태로 머물다가 Postfix가 포기하고 반송할 때까지 기다리게 됩니다(mailcow는 최대 큐 유지 시간을 5일로 설정합니다). 설치 전에 반드시 테스트하십시오. 포트가 차단되어 있다면 유일한 해결책은 제공업체에 문의하여 포트를 열어달라고 요청하는 것뿐입니다. 일부 업체는 계정 사용 기간이 길면 열어주지만, 절대 열어주지 않는 곳도 있습니다.
사용 가능한 평판을 가진 깨끗한 IP여야 합니다. 재활용된 VPS IP는 이전 사용자의 스팸 활동으로 인해 이미 차단 목록에 올라 있는 경우가 많습니다. 작업을 시작하기 전에 Spamhaus 조회나 mxtoolbox 같은 서비스에서 IP 상태를 확인하십시오. 차단 목록에 오른 IP는 코드로 해결할 수 없는 거부 사유가 됩니다.
DNS 제어권과 올바른 PTR 레코드 설정이 필요합니다. 도메인 존에 레코드를 추가해야 하며, 서버 IP가 메일 호스트네임을 가리키는 역방향 DNS(PTR) 레코드가 필요합니다. PTR 레코드는 거의 DNS 패널에서 설정하지 않으며, IP 소유자가 관리하므로 VPS 제공업체의 제어 패널이나 고객 지원 티켓을 통해 설정해야 합니다.
6 GiB RAM과 2 vCPU가 안정적인 최소 사양입니다. mailcow의 개인 설치 최소 사양은 6 GiB RAM과 1 GiB 스왑이며, 사용자가 늘어나면 8 GiB를 권장합니다. 약 2.5 GiB 미만일 경우, generate_config.sh는 커널이 컨테이너를 강제 종료하지 않도록 ClamAV 바이러스 스캐너를 비활성화할 것을 제안합니다. mailcow의 문서상 최소 디스크 용량은 메일 저장 전 20 GiB이므로, 시작 시 이보다 더 많은 용량을 할당하여 메일함이 커질 공간을 확보하십시오.
IP 주소가 아닌 DNS 이름을 사용해야 합니다. mail.example.com과 같은 호스트네임을 선택하십시오. 이 단일 이름이 귀하의 MAILCOW_HOSTNAME, TLS 인증서 주체, PTR 대상, 그리고 SMTP 배너가 됩니다. 모든 곳에서 일관되게 유지하십시오.
1단계, 아웃바운드 25번 포트 개방 확인
이 작업을 가장 먼저 수행하십시오. 이 단계가 실패하면 다른 모든 노력은 헛수고가 됩니다. 새로 생성한 VPS에서 실제 메일 서버와 SMTP 통신을 시도해 보십시오.
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25정상적으로 작동하면 즉시 다음과 같은 결과가 나타납니다.
Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!포트가 차단된 경우 5초 동안 응답을 기다리다가 실패합니다.
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress사용자가 별도의 아웃바운드 방화벽 규칙을 설정하지 않은 새 VPS에서 이러한 타임아웃이 발생한다면, 이는 서비스 제공업체에서 차단한 것입니다. 이는 로컬 방화벽이 아닌 제공업체 측의 네트워크 필터에 의한 것이므로 로컬 설정 변경으로는 해결할 수 없습니다. 고객 지원 센터에 다음과 같이 문의하십시오: "제 VPS(<IP>)의 아웃바운드 TCP 25번 포트를 활성화해 주십시오. 합법적인 메일 서버를 운영할 예정입니다." 이 요청이 "성공(succeeded)"으로 처리되기 전까지는 mailcow를 설치하지 마십시오. 인바운드 25번 포트(외부 서버가 귀하의 서버로 접속하는 경로)는 별개의 경로이며 보통 개방되어 있습니다. 서비스 제공업체가 제한하는 것은 아웃바운드 측입니다.
2단계, 지금 DNS 레코드 설정하기
DNS 변경 사항이 전파되는 데 시간이 걸리므로, 설치하기 전에 가능한 모든 레코드를 게시하십시오. 도메인은 example.com, 메일 호스트는 mail.example.com, IP 주소는 10.0.0.10라고 가정합니다. 존(zone) 파일에 다음을 생성하십시오.
mail.example.com. A 10.0.0.10
mail.example.com. AAAA 2001:db8::10 ; only if you have IPv6
example.com. MX 10 mail.example.com.
example.com. TXT "v=spf1 mx -all"
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.com"SPF 레코드는 "내 MX만 이 도메인으로 메일을 보낼 수 있으며, 나머지는 거부한다"는 의미입니다. DMARC는 p=none으로 시작하여 메일이 차단되지 않도록 보고서를 모니터링하십시오. 정렬(alignment)이 확인되면 p=quarantine로 강화하고, 이후 p=reject로 설정하십시오. 의도적으로 누락된 레코드가 두 개 있습니다. 하나는 6단계에서 mailcow가 생성하는 DKIM이고, 다른 하나는 지금 호스팅 제공업체 패널에서 설정해야 하는 PTR 레코드입니다.
10.0.0.10에 대한 PTR(역방향 DNS) 레코드를 MAILCOW_HOSTNAME의 정확한 값인 mail.example.com로 설정하십시오. 이는 많은 사용자가 놓치는 유일한 레코드이며, 대형 메일 서비스 제공업체는 이 레코드가 없으면 메일을 거부합니다. 사용 중인 패널에 rDNS 필드가 없다면 고객 지원 센터에 문의하십시오.
3단계, Docker 설치
mailcow는 Docker Engine 24.0 이상과 Docker Compose 2.0 이상이 필요합니다. Compose 플러그인(docker compose)을 사용하는 것이 가장 간단한 방법이며, mailcow는 독립형 docker-compose 바이너리도 지원합니다. Ubuntu의 docker.io 패키지는 Compose 플러그인을 포함하지 않으므로, 대신 Docker 공식 편의 스크립트를 사용하십시오.
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose versionDocker Compose version 명령을 실행하면 v2.x 또는 v5.x 버전이 출력되어야 합니다. 2025년에 출시된 Compose v5는 기능적으로 v2와 동일하며, 둘 중 어느 것이든 mailcow 요구 사항을 충족합니다. 만약 docker compose version 명령이 docker: 'compose' is not a docker command을 출력한다면, Docker Engine은 설치되었으나 Compose 플러그인이 설치되지 않은 상태입니다. Docker 저장소에서 플러그인을 설치하거나, 위의 스크립트를 다시 실행하십시오. 또는 Docker 공식 apt 저장소에서 두 가지 모두를 설정하는 Docker Compose 기초 가이드를 참조하십시오.
4단계, mailcow 복제 및 설정 생성
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shumask 명령이 0022를 출력하는지 확인하는 것은 mailcow의 자체 설치 단계를 따르는 과정이며, 복제 전에 umask 0022을 설정합니다. mailcow 내에서 이 값을 검사하는 기능은 없으며, 새로 설치된 Ubuntu 24.04의 root 셸에서는 이미 0022이 설정되어 있습니다. 이후 스크립트는 가장 중요한 한 가지, 즉 정규화된 도메인 이름(FQDN)을 묻습니다. mail.example.com를 입력하십시오. 이 값은 A 레코드 및 PTR 레코드와 정확히 일치해야 합니다. 스크립트는 전체 스택이 참조하는 단일 환경 파일인 mailcow.conf을 생성합니다. 웹 포트(HTTP_PORT, HTTPS_PORT)를 변경하거나 사양이 낮은 서버에서 ClamAV를 비활성화해야 한다면 이 파일을 여십시오.
MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n # set to y to drop the virus scanner on a <2.5 GiB boxSKIP_FTS=y은 메모리가 부족한 서버에서 사용할 수 있는 또 다른 설정입니다. mailcow 문서에 따르면 전체 텍스트 검색은 메모리를 많이 소모하는 두 번째 요소이며, 이를 비활성화하면 웹메일에서 본문 검색 기능만 사용할 수 없게 됩니다.
호스트의 다른 서비스가 이미 사용 중인 경우가 아니라면 HTTP_PORT=80과 HTTPS_PORT=443은 그대로 두십시오. mailcow의 내장 ACME 클라이언트는 기본적으로 HTTP-01 챌린지를 사용하며, 인증서 발급을 위해 인터넷에서 80번 포트로 접근할 수 있어야 합니다. (mailcow 2026-03 버전부터는 ACME_DNS_CHALLENGE=y를 사용하여 DNS-01 챌린지를 수행할 수 있습니다. 이 방식은 80번 포트가 필요하지 않지만 DNS 호스트의 API 접근 권한이 필요합니다.) 이러한 이유로 단순한 구성에서는 동일한 서버에 별도의 nginx-plus-Certbot 설정을 운영하지 않습니다. mailcow는 내부적으로 TLS 인증서를 발급하고 갱신하므로, 다른 서비스가 80/443 포트를 점유하면 충돌이 발생합니다. mailcow 문서에서는 대안을 제시합니다. 웹 리스너를 HTTP_BIND=127.0.0.1 HTTP_PORT=8080 HTTPS_BIND=127.0.0.1 HTTPS_PORT=8443으로 로컬에 바인딩하고, 80 및 443 포트에 리버스 프록시를 배치한 뒤, 로컬 Certbot이 인증서를 관리하게 하려면 mailcow가 해당 인증서를 참조하도록 설정하고 갱신 훅을 추가하는 방식입니다. 메일 서버에서 관리할 요소가 늘어나므로, 공개 웹 프런트엔드를 필요로 하는 다른 서비스에도 동일한 절충안이 적용됩니다. 예를 들어 Jellyfin 라이브러리를 90년대 비디오 대여점처럼 꾸미는 Halcyon과 같이 443 포트에 자체 리버스 프록시를 요구하는 빌드는 mailcow를 해당 프록시 뒤로 옮기지 않는 한 다른 호스트에서 운영하는 것이 좋습니다. 예외적으로 공개 웹 포트를 전혀 요구하지 않는 서비스는 동일한 서버에서 운영할 수 있습니다. 예를 들어 자체 호스팅 RustDesk 릴레이는 21115에서 21119 범위의 포트만 사용하므로, 대역폭 여유가 있다면 같은 서버에서 함께 운영할 수 있습니다.
5단계, 스택 시작 및 로그인
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps이미지 풀(pull) 작업으로 약 24개 정도의 이미지를 내려받으므로 몇 분 정도 기다려야 합니다. docker compose ps 명령을 실행했을 때 모든 컨테이너가 running(또는 healthy) 상태가 되면, 브라우저에서 https://mail.example.com/admin를 엽니다. 기본 관리자 계정은 사용자 이름 admin, 비밀번호 moohoo입니다. 관리자 UI의 System → Configuration, 이어서 Access → Administrators 메뉴에서 즉시 비밀번호를 변경하십시오. 브라우저에 NET::ERR_CERT_AUTHORITY_INVALID 경고가 표시된다면 ACME 인증서가 아직 발급되지 않은 상태입니다. 시스템이 고장 났다고 판단하기 전에 아래의 ACME 실패 관련 내용을 확인하십시오. 초기 1~2분 동안 자체 서명된 임시 인증서가 표시되는 것은 정상입니다.
단계 6, 도메인 및 메일함 추가, DKIM 게시
관리자 UI에서 E-Mail → Configuration으로 이동한 뒤, Domains 탭에서 Add domain을 클릭하고 example.com를 입력하십시오. 그 다음 Mailboxes 메뉴에서 Add mailbox를 클릭하여 비밀번호와 함께 you@example.com 계정을 생성하십시오. 이제 IMAP을 통해 접근 가능한 메일함이 준비되었습니다.
이제 DKIM 키를 설정합니다. System → Configuration → Options → ARC/DKIM keys로 이동하십시오. 도메인을 추가할 때 mailcow가 이미 키를 생성했을 수도 있습니다. 생성되지 않았다면 해당 메뉴에서 도메인을 선택하고, 셀렉터 dkim를 유지한 채 2048-bit를 선택하여 Add를 클릭하십시오. 화면에 표시되는 긴 TXT 값을 복사하여 다음과 같이 게시하십시오.
dkim._domainkey.example.com. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"mailcow의 Domains 페이지에는 필요한 모든 DNS 레코드 목록을 보여주고, 실제 게시된 레코드와 비교하여 녹색 체크 표시나 빨간색 X 표시를 해주는 DNS 버튼이 있습니다. 이 기능을 체크리스트로 활용하여 모든 항목이 녹색으로 표시되도록 한 뒤 메일 발송을 테스트하십시오. 게시 후에도 DKIM 항목이 빨간색이라면 키가 TXT 청크로 잘못 분할되었을 가능성이 큽니다. 2048-bit 키는 단일 TXT 문자열의 255자 제한보다 길기 때문에, 하나의 논리적 값으로 붙여넣고 DNS 호스트가 자동으로 청크를 나누도록 설정하십시오.
7단계, 메일 전송 가능성 테스트 및 10/10 점수 달성
mail-tester.com에 접속하여 표시되는 임의의 주소를 복사합니다. 새 메일함에서 해당 주소로 메시지를 보냅니다. https://mail.example.com/SOGo의 SOGo 웹메일에 로그인하여 메일을 발송하십시오. 그 후 "Then check your score" 버튼을 클릭합니다.
10/10 점수를 목표로 합니다. 흔히 발생하는 감점 요인과 원인은 다음과 같습니다.
- SPF not aligned:
MX/SPF 레코드가 누락되었거나 발송 IP가 포함되지 않은 경우입니다. SPF TXT 레코드를 다시 확인하십시오. - DKIM signature does not verify:
dkim._domainkeyTXT 레코드가 누락되었거나, 아직 전파 중이거나, 형식이 잘못된 경우입니다. 가장 흔한 실수입니다. - No PTR / PTR mismatch: 역방향 DNS(reverse DNS)가
mail.example.com으로 확인되지 않는 경우입니다. 호스팅 제공업체에서 수정하십시오. - Listed on a blocklist: IP의 이전 평판 문제입니다. 차단 해제를 요청하거나 더 깨끗한 IP를 제공받으십시오.
점수가 10/10이 되기 전까지는 Gmail이나 Outlook으로 실제 메일을 보내지 마십시오. 낮은 점수 상태에서 새 IP로 메일을 보내면 첫날부터 도메인이 차단될 수 있습니다.
8단계, 실제 메일 클라이언트 연결
Thunderbird, Apple Mail 또는 스마트폰 메일 앱을 서버에 연결합니다. 모든 설정에서 서버 호스트는 mail.example.com를 사용합니다.
- IMAP: 포트 993, SSL/TLS 사용 (또는 143, STARTTLS 사용)
- SMTP submission: 포트 465, SSL/TLS 사용 (또는 587, STARTTLS 사용)
- 사용자 이름: 전체 메일 주소,
you@example.com - 비밀번호: 설정한 메일함 비밀번호
클라이언트 메일 전송에 포트 25를 절대 사용하지 마십시오. 해당 포트는 서버 간 통신 전용이며, mailcow는 해당 포트에서 인증된 메일 제출을 지원하지 않으므로 클라이언트가 연결을 시도하면 거부됩니다. 클라이언트에서 Relay access denied 오류가 발생한다면, 포트 25를 사용하거나 인증 없이 전송을 시도하는 경우입니다. 포트를 465 또는 587로 변경하고 메일함 자격 증명을 입력하십시오.
9단계, 실제로 중요한 데이터 백업하기
mailcow는 모든 상태 유지 볼륨을 스냅샷으로 저장하는 백업 스크립트를 제공합니다. 이 스크립트를 실행하여 외장 디스크나 마운트된 원격 저장소에 백업하십시오.
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall은 다음 6가지 항목을 캡처하며, 이 중 하나라도 유실되면 데이터 손실로 이어집니다. vmail(실제 메일함), crypt(vmail 복호화 키, vmail 없이는 무용지물), mysql(도메인, 사용자, 별칭, 설정을 담은 MariaDB), redis(큐 및 캐시 상태), rspamd(학습된 스팸/햄 데이터), postfix(메일 큐)가 이에 해당합니다. 이 스크립트는 도우미 컨테이너 내부에서 실행되어 압축된 아카이브를 생성하므로, 스택이 실행 중인 상태에서도 일관된 백업이 가능합니다. 매일 밤 cron 작업으로 자동화하고, --delete-days 14을 추가하여 오래된 백업 세트를 정리하십시오. 작동이 중단된 cron 작업은 아무런 알림 없이 실패하므로, 스크립트의 종료 상태를 즉시 확인할 수 있는 곳으로 전송해야 합니다. 자체 호스팅 ntfy 서버를 사용하면 동일한 cron 항목에서 한 줄의 curl 명령어로 실패 알림을 휴대폰으로 즉시 받을 수 있습니다. 복구는 restore 옵션을 사용하여 동일한 스크립트로 수행하며, 스냅샷 목록을 확인하고 복구할 항목을 선택할 수 있습니다. 복구 테스트를 거치지 않은 백업은 백업이 아니라 희망 사항일 뿐입니다. 테스트용 VPS에서 반드시 모의 복구를 수행해 보십시오.
단계 10, 일정에 따른 업데이트
mailcow는 자체 스크립트를 통해 업데이트를 수행합니다. 이 스크립트는 새로운 코드를 가져오고, mailcow.conf를 마이그레이션하며, 이미지를 미리 가져온 뒤 컨테이너를 순서대로 재시작합니다.
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies it스키마 마이그레이션은 되돌리기 어렵기 때문에 먼저 백업(단계 9)을 수행하십시오. 업데이트는 자주 배포되며 인터넷에 노출된 데몬에 대한 보안 패치를 포함하므로, 메일 서버를 몇 달 동안 방치하지 마십시오. 업데이트 후 컨테이너가 비정상 상태가 되면, sudo docker compose logs --tail=50 <service>-mailcow 명령으로 다시 시작되지 않은 데몬을 확인할 수 있습니다.
보안 강화에 관한 참고 사항
mailcow는 자체적인 netfilter 서비스인 netfilter-mailcow를 실행하여 메일 및 웹메일 포트에 무차별 대입 공격을 시도하는 IP를 차단하므로, 메일 관련 보안은 기본적으로 갖추어져 있습니다. 하지만 이는 호스트 자체의 SSH에는 적용되지 않으며, SSH는 여전히 노출되어 무차별 대입 공격의 대상이 될 수 있습니다. 이 빌드를 SSH 인증 로그를 감시하는 Fail2ban 및 키 기반 로그인과 함께 사용하십시오. mailcow 관리자 UI는 강력한 비밀번호로 보호하고, 가급적이면 공용 인터넷에서 분리하거나 VPN 내부에서만 접근하도록 설정하십시오.
실패 유형 및 정확한 문자열
메일이 큐에 쌓이고 전송되지 않습니다. sudo docker compose exec postfix-mailcow postqueue -p을 실행하거나 관리자 UI의 메일 큐를 확인하십시오. 항목은 Postfix가 반송(bounce)하기 전까지 최대 5일 동안 지연(deferred) 상태로 머무르며, 다음과 같은 메시지가 나타납니다.
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)이는 거의 항상 공급자가 아웃바운드 25번 포트를 차단했기 때문입니다(1단계). 호스트 방화벽의 아웃바운드 규칙에서도 동일한 타임아웃이 발생하므로 먼저 이를 배제하십시오. 호스트 설정이 정상인데도 문제가 지속된다면 설정 변경으로는 해결할 수 없으므로 공급자에게 문의 티켓을 제출하십시오. 이는 DNS나 TLS 문제가 아니며, 원격 MX의 25번 포트에 대해 timed out라는 단어가 나타나는 것이 결정적인 증거입니다.
Gmail이 모든 메일을 스팸으로 분류하거나 반송합니다. Gmail에서 메시지를 열고 "원본 보기"를 선택하여 인증 결과를 읽어보십시오. dkim=fail 또는 dkim=none는 dkim._domainkey TXT 레코드가 누락되었거나, 손상되었거나, 아직 전파되지 않았음을 의미합니다. ARC/DKIM 페이지에 표시된 내용을 정확히 다시 게시하고 TTL이 지날 때까지 기다리십시오. spf=fail은 SPF/MX 레코드가 귀하의 IP를 포함하지 않음을 의미합니다. 정렬(Alignment)이 가장 중요하며, 하나의 검사만 실패해도 스팸으로 분류되기에 충분합니다.
연결 시 대형 공급자로부터 거부됩니다. 반송 메일이나 Postfix 로그에 Gmail의 PTR 거부 메시지가 포함됩니다.
550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.550 5.7.25 코드는 역방향 DNS가 누락되었거나 일치하지 않음을 의미합니다. 공급자 측에서 귀하의 IP에 대한 PTR 레코드를 mail.example.com로 설정하십시오(2단계). 정방향(A) 레코드와 역방향(PTR) 레코드는 일치해야 하며, 둘 다 mailcow가 다른 서버에 자신을 소개할 때 사용하는 호스트 이름을 가리켜야 합니다.
브라우저에 인증서 경고가 계속 표시됩니다. acme-mailcow 컨테이너가 실제 인증서를 가져오는 데 실패한 것입니다. 해당 로그를 확인하십시오.
sudo docker compose logs acme-mailcow | tail -n 40Cannot validate any hostnames, skipping Let's Encrypt for 1 hour.와 같은 줄이 나타나거나 챌린지 실패가 발생한다면, 인터넷에서 80번 포트에 접근할 수 없거나 A 레코드가 이 서버를 가리키지 않는 것입니다. AAAA 레코드를 게시했다면 그 역시 확인하십시오. mailcow는 AAAA 레코드가 존재하면 이를 우선적으로 검증하고 A 레코드 검사를 건너뜁니다. 따라서 A 레코드가 올바르더라도 잘못된 AAAA 레코드나 80번 포트에 도달할 수 없는 IPv6 경로가 있으면 검증에 실패합니다. mail.example.com이 해당 서버로 올바르게 확인되는지 확인하고, 호스트 방화벽에서 80번과 443번 포트를 개방하며, 다른 서비스가 해당 포트를 점유하고 있지 않은지 확인하십시오. 원인을 해결한 후에는 1시간 동안의 대기 시간을 기다리지 말고 sudo docker compose restart acme-mailcow를 사용하여 클라이언트를 재시작하십시오.
FAQ
이메일 셀프 호스팅을 할 가치가 있습니까?
데이터 소유권, 무제한 별칭, 완전한 제어권을 원한다면 그렇습니다. mailcow는 VPS 비용으로 전문적인 스택을 제공합니다. 하지만 메일 발송 성공률(deliverability)은 지속적인 관리가 필요한 작업입니다. IP 평판, DNS 정렬, 차단 목록 모니터링은 결코 완전히 끝나지 않습니다. 하루라도 스팸 메일함에 들어가는 것이 비즈니스에 치명적인 중요한 주소라면, 관리형 서비스를 이용하는 것이 실용적인 선택입니다. 편의성보다 제어권을 중요하게 생각하고 실제로 직접 관리할 의지가 있을 때 셀프 호스팅을 하십시오. 이메일 자체가 아니라 단순히 타인의 서버에서 데이터를 분리하는 것이 목적이라면, 다른 사람의 영향력이 없는 서비스부터 시작하십시오. 사진 라이브러리는 메일 발송 문제와 무관하며, PhotoPrism과 Immich 비교 문서에서 동일한 VPS 환경을 구축하기 위한 RAM 최소 사양과 백업 명령을 다루고 있습니다.
아웃바운드 25번 포트가 차단되었는지 어떻게 확인합니까?
서버에서 nc -vz -w 5 gmail-smtp-in.l.google.com 25 명령을 실행하십시오. "succeeded!"가 출력되면 포트가 열려 있는 것입니다. 잠시 멈춘 뒤 timed out가 출력된다면 포트가 차단된 상태이며, 서버에 별도의 아웃바운드 방화벽 규칙을 설정하지 않았다면 이는 호스팅 제공업체의 정책입니다. 이는 셀프 호스팅 서버가 메일을 수신할 수는 있지만 발송하지 못하는 가장 흔한 원인이며, 제공업체가 포트를 열어주는 것 외에는 로컬 설정으로 해결할 방법이 없습니다.
왜 내 메일은 계속 Gmail의 스팸 메일함으로 들어갑니까?
거의 항상 인증 체인이 깨져 있기 때문입니다. Gmail에서 "원본 보기(Show original)"를 선택하여 spf=pass, dkim=pass, dmarc=pass 항목을 확인하십시오. dkim=fail은 dkim._domainkey TXT 레코드가 누락되었거나 잘못되었음을 의미합니다. PTR 불일치나 발송 이력이 없는 새로운 IP 주소도 부정적인 영향을 줍니다. 먼저 mail-tester.com에서 10/10 점수를 받은 다음, 첫날부터 대량으로 메일을 보내지 말고 하루에 몇 통씩 점진적으로 발송량을 늘려 IP 예열을 진행하십시오.
정확히 무엇을 백업해야 합니까?
backup_and_restore.sh backup all를 실행하여 전체 세트를 서버 외부로 보관하십시오. 이 명령은 vmail(메일함), crypt(복호화 키), MariaDB 데이터베이스(도메인, 사용자, 별칭, 설정), Redis, Rspamd 학습 데이터, Postfix 큐를 모두 포함합니다. crypt 볼륨은 사람들이 자주 간과하는 부분인데, 이 볼륨이 없으면 vmail 백업은 읽을 수 없는 암호문이 됩니다. 최소 한 번은 테스트용 서버에 복원 과정을 수행해 보십시오.
2 GB VPS에서 mailcow를 실행할 수 있습니까?
원활하게 실행하기 어렵습니다. generate_config.sh은 약 2.5 GiB 미만의 환경에서 ClamAV를 비활성화하도록 제안합니다. ClamAV를 끄더라도 Rspamd, Dovecot, MariaDB 및 나머지 스택이 메모리를 점유하므로, 실제 부하가 발생하면 스왑을 사용하게 되고 OOM(Out of Memory) 킬러에 의해 프로세스가 종료될 것입니다. 안정적인 1인용 설치를 위해서는 6 GiB RAM과 1 GiB 스왑을 최소 사양으로 고려하고, 3명 이상의 사용자가 사용하게 되는 즉시 8 GiB로 업그레이드하십시오.