SSD Nodes Learn Hosting plans →
가이드 Matt Connor작성자 Matt Connor · 업데이트됨 2026-08-28

Mailcow 구축 및 Gmail 수신 오류 해결 방법

Mailcow 설치 전 VPS의 아웃바운드 25번 포트 차단 여부를 반드시 확인하십시오. 포트가 막히면 메일이 큐에 쌓여 전송되지 않습니다. 또한 Gmail의 550 5.7.25 오류를 방지하기 위한 올바른 PTR 레코드 설정과 필수 DNS 구성 방법을 상세히 안내합니다.

구축할 시스템

직접 소유한 서버에 구축하는 완전한 메일 서버입니다. 메일 송수신을 위한 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번 포트를 차단합니다. 이 차단은 조용히 이루어지며, 부팅 시 오류도 없고 모든 것이 정상처럼 보이지만 메일은 큐에 영원히 머물게 됩니다. 무엇을 설치하기 전에 먼저 테스트하십시오. 차단되어 있다면 유일한 해결책은 제공업체에 문의하여 포트를 열어달라고 요청하는 것뿐입니다. 오래된 계정은 허용해주기도 하지만, 아예 허용하지 않는 곳도 있습니다.

사용 가능한 평판을 가진 깨끗한 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 바이러스 스캐너 비활성화를 제안합니다. 시작 시 20 GB의 SSD를 할당하십시오.

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(<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는 Compose v2 플러그인이 포함된 Docker Engine이 필요합니다. Ubuntu의 docker.io 패키지는 Compose 플러그인을 전혀 포함하고 있지 않으므로, 대신 Docker 공식 편의 스크립트를 사용하십시오.

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

Docker Compose version v2.x 줄이 표시되어야 합니다. docker compose version 명령의 결과로 docker: 'compose' is not a docker command가 출력된다면, Docker Engine은 설치되었으나 Compose 플러그인이 누락된 상태입니다. Docker 저장소에서 플러그인을 설치하거나, 위의 스크립트를 다시 실행하거나, 혹은 Docker Compose 기초 가이드를 따라 Docker 공식 apt 저장소에서 두 가지 모두를 설정하십시오.

단계 4, mailcow 복제 및 설정 생성

cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.sh

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 box

SKIP_FTS=y은 메모리가 부족한 서버에서 사용할 수 있는 또 다른 설정입니다. 전문 검색(full-text search)은 mailcow 문서에서 언급하는 두 번째 메모리 점유 요소이며, 이를 비활성화하면 웹메일에서 본문 검색 기능만 사용할 수 없게 됩니다.

호스트의 다른 서비스가 이미 사용 중인 경우가 아니라면 HTTP_PORT=80HTTPS_PORT=443는 그대로 두십시오. mailcow의 내장 ACME 클라이언트는 인증서를 발급받기 위해 인터넷에서 80번 포트로 접근할 수 있어야 합니다. 이것이 바로 같은 서버에서 별도의 nginx-plus-Certbot 설정을 운영하지 않는 이유입니다. mailcow는 자체적으로 TLS 인증서를 발급하고 갱신하며, 80/443 포트를 점유하는 다른 서비스가 있으면 이 과정이 중단됩니다. 공개 웹 프런트엔드를 필요로 하는 다른 모든 서비스에도 동일하게 적용됩니다. 예를 들어 Jellyfin 라이브러리를 90년대 비디오 가게처럼 꾸미는 Halcyon과 같이 443 포트에서 자체 리버스 프록시를 요구하는 서비스는 다른 호스트에서 운영해야 합니다. 예외는 공개 웹 포트를 전혀 요구하지 않는 서비스입니다. 자체 호스팅 RustDesk 릴레이는 21115에서 21119 범위의 포트만 사용하므로, 대역폭 여유가 있다면 같은 서버에서 공유할 수 있습니다.

5단계, 스택 시작 및 로그인

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

이미지를 내려받는 데는 수십 개의 이미지가 포함되므로 몇 분 정도 소요됩니다. docker compose ps 명령을 실행했을 때 모든 컨테이너가 running (또는 healthy) 상태로 표시되면, 브라우저에서 https://mail.example.com에 접속합니다. 기본 관리자 계정은 사용자 이름 admin, 비밀번호 moohoo입니다. 관리자 UI의 Access → Administrators 메뉴에서 즉시 비밀번호를 변경하십시오. 브라우저에 NET::ERR_CERT_AUTHORITY_INVALID 경고가 표시된다면 ACME 인증서가 아직 발급되지 않은 상태입니다. 시스템이 고장 났다고 판단하기 전에 아래의 ACME 실패 항목을 먼저 확인하십시오. 초기 1~2분 동안 자체 서명된 임시 인증서가 나타나는 것은 정상입니다.

6단계, 도메인 및 메일함 추가와 DKIM 게시

관리자 UI에서 메일 설정(Mail Setup) 페이지(Configuration → Mail Setup)를 열고, Domains 탭에서 Add domain을 클릭한 뒤 example.com을 입력합니다. 그 다음 Mailboxes 항목에서 Add mailbox를 클릭하여 비밀번호와 함께 you@example.com을 생성합니다. 이제 IMAP을 통해 접근 가능한 메일함이 준비되었습니다.

이제 DKIM 키를 설정합니다. Configuration → ARC/DKIM keys로 이동합니다. 도메인을 추가할 때 mailcow가 이미 키를 생성했을 수도 있습니다. 만약 생성되지 않았다면 해당 페이지에서 키를 생성하십시오. 도메인을 선택하고 selector는 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 페이지에는 필요한 모든 레코드를 나열하고 실제 게시된 상태에 따라 녹색 체크 표시나 빨간색 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._domainkey TXT 레코드가 누락되었거나, 아직 전파 중이거나, 형식이 잘못된 경우입니다. 가장 흔한 실수입니다.
  • 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 all

all은 다음 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의 메일 큐를 확인하십시오. 항목들이 다음 메시지와 함께 지연(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에서 해당 메시지를 열고 "원본 보기(Show original)"를 선택하여 인증 결과를 확인하십시오. dkim=fail 또는 dkim=nonedkim._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 40

Cannot validate any hostnames, skipping Let's Encrypt for 1 hour.와 같은 줄이 보이거나 챌린지 실패 메시지가 나타난다면, 인터넷에서 80번 포트에 접근할 수 없거나 A 레코드가 이 서버를 가리키지 않는 상태입니다. mail.example.com이 해당 서버로 올바르게 해석되는지 확인하고, 호스트 방화벽에서 80번과 443번 포트를 개방하십시오. 또한 다른 서비스가 해당 포트를 점유하고 있지 않은지 확인하십시오. 원인을 해결한 후, 1시간 동안의 대기 시간(back-off)을 기다리는 대신 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에서 "원본 보기"를 선택하여 spf=pass, dkim=pass, dmarc=pass 항목을 확인하십시오. dkim=faildkim._domainkey TXT 레코드 누락이나 오류를 나타냅니다. PTR 불일치나 발송 이력이 없는 새로운 IP 주소도 악영향을 미칩니다. 먼저 mail-tester.com에서 10/10 점수를 받은 다음, 첫날부터 대량으로 발송하지 말고 하루에 몇 통씩 보내며 서서히 IP 예열(warm-up)을 진행하십시오.

정확히 무엇을 백업해야 합니까?

backup_and_restore.sh backup all를 실행하여 전체 세트를 서버 외부로 보관하십시오. 이 명령은 vmail(메일함), crypt(복호화 키), MariaDB 데이터베이스(도메인, 사용자, 별칭, 설정), Redis, Rspamd 학습 데이터, Postfix 큐를 모두 포함합니다. crypt 볼륨은 사람들이 자주 간과하는 부분인데, 이 볼륨이 없으면 vmail 백업은 읽을 수 없는 암호문이 됩니다. 최소 한 번은 테스트용 서버에 복원 과정을 수행해 보십시오.

2 GB RAM을 가진 VPS에서 mailcow를 실행할 수 있습니까?

원활하게 실행하기 어렵습니다. generate_config.sh은 약 2.5 GiB 미만의 환경에서 ClamAV를 비활성화하도록 제안하지만, 그 상태에서도 Rspamd, ClamAV, Dovecot, MariaDB가 메모리를 점유하므로 실제 부하가 발생하면 스왑(swap)을 사용하게 되고 OOM(Out of Memory) 킬러에 의해 프로세스가 종료될 것입니다. 안정적인 1인용 설치를 위해서는 6 GiB RAM과 1 GiB 스왑을 최소 사양으로 고려하고, 두 명 이상의 사용자가 사용하게 되는 즉시 8 GiB로 업그레이드하십시오.