Mailcow: ตั้ง Mail Server ของบริษัทเองบน Cloud Server

ติดตั้ง Mailcow เป็นเมลเซิร์ฟเวอร์ของบริษัทบน Cloud Server ด้วย Docker: ตรวจสเปกและพอร์ต 25 ตั้ง DNS กับ PTR เพิ่มโดเมนและกล่องจดหมาย และตั้งสำรองข้อมูลทุกคืน

โดย ทีมงาน THAI DATA CLOUD อ่าน 12 นาที

แชร์FacebookXLINELinkedIn
Mailcow — Mailcow: ตั้ง Mail Server ของบริษัทเองบน Cloud Server
Mailcow: ตั้ง Mail Server ของบริษัทเองบน Cloud Server

คำตอบสั้น ๆ: ติดตั้ง Mailcow เป็นเมลเซิร์ฟเวอร์ของบริษัทบน Cloud Server ด้วย Docker: ตรวจสเปกและพอร์ต 25 ตั้ง DNS กับ PTR เพิ่มโดเมนและกล่องจดหมาย และตั้งสำรองข้อมูลทุกคืน

คู่มือนี้อธิบาย Mailcow ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Mailcow (ชื่อเต็ม mailcow: dockerized) คือชุดเมลเซิร์ฟเวอร์โอเพนซอร์สที่รวม Postfix, Dovecot, Rspamd กรองสแปม, ClamAV, SOGo สำหรับเว็บเมลและปฏิทิน และหน้าจัดการผ่านเว็บไว้ใน Docker Compose ชุดเดียว เหมาะกับบริษัทที่ต้องการมีเมลเซิร์ฟเวอร์ของตัวเองบน Cloud Server เก็บข้อมูลไว้ในเครื่องที่ควบคุมได้ และไม่ต้องจ่ายค่าไลเซนส์ต่อผู้ใช้

คู่มือนี้เหมาะกับผู้ดูแล Linux ที่คุ้นกับ DNS และ Docker เมื่อทำครบ คุณจะมีเครื่องที่สเปกพอ มีระเบียน DNS และ PTR ครบ ติดตั้ง Mailcow สำเร็จ เปลี่ยนรหัสผ่านผู้ดูแลแล้ว เพิ่มโดเมนและกล่องจดหมาย มีสคริปต์สำรองข้อมูลรายวัน และรู้ว่าเมื่อใดควรใช้บริการแบบมีผู้ดูแลแทน

สิ่งที่ต้องเตรียม

  • Cloud Server แบบ virtualization เต็มรูปแบบ เช่น KVM ห้ามใช้ LXC หรือ OpenVZ RAM อย่างน้อย 6 GiB พร้อม swap 1 GiB ตามค่าเริ่มต้นของ Mailcow ผู้พัฒนาแนะนำ 8 GiB สำหรับผู้ใช้ประมาณ 5–10 คน และดิสก์ 20 GiB สำหรับระบบโดยไม่รวมอีเมล ถ้ายังไม่มี swap ให้สร้าง swap file ก่อน
  • ระบบปฏิบัติการที่รองรับ เช่น Ubuntu 22.04 หรือใหม่กว่า, Debian 12 หรือ AlmaLinux 9 ติดตั้งใหม่ ไม่มีโปรแกรมอื่นจับพอร์ตอีเมลหรือพอร์ต 80/443 อยู่
  • IP สาธารณะที่ส่งออกพอร์ต 25 ได้ ผู้ให้บริการคลาวด์หลายรายปิดพอร์ต 25 ขาออกเป็นค่าเริ่มต้น ต้องขอเปิดก่อน
  • สิทธิ์ตั้ง Reverse DNS (PTR) ของ IP ให้ตรงกับชื่อโฮสต์ เช่น mail.example.com ดู คู่มือตั้งค่า Reverse DNS (PTR)
  • นาฬิกาเครื่องตรงและเปิด NTP แล้ว ตรวจด้วย timedatectl status
แผนภาพ Mailcow บน Cloud Server รับอีเมลจากอินเทอร์เน็ตผ่าน Postfix กรองด้วย Rspamd เก็บใน Dovecot และสำรองข้อมูลออกนอกเครื่อง
ทุกส่วนอยู่ในเครื่องเดียว ข้อมูลสำรองจึงต้องถูกส่งออกไปเก็บนอกเครื่องทุกคืน

ขั้นตอนที่ 1: ตรวจเครื่องและเครือข่ายก่อนติดตั้ง Mailcow

free -h
dig +short -x 203.0.113.25
nc -vz -w 5 mx.example.net 25
ss -tlnp | grep -E ':(25|80|110|143|443|465|587|993|995|4190)\s'

คำสั่งแรกดู RAM และ swap คำสั่งที่สองต้องตอบชื่อ mail.example.com. คำสั่งที่สามทดสอบว่าเครื่องต่อพอร์ต 25 ของเมลเซิร์ฟเวอร์ภายนอกได้ ถ้าค้างจนหมดเวลา แปลว่าผู้ให้บริการปิดพอร์ต 25 ขาออกไว้ ส่วนคำสั่งสุดท้ายต้องไม่แสดงอะไร ถ้ามีบริการอื่น เช่น Postfix หรือ Exim ของระบบปฏิบัติการจับพอร์ตอยู่ ให้หยุดและปิดก่อน

เปิดพอร์ตขาเข้า TCP 25, 465, 587, 143, 993, 110, 995, 4190, 80 และ 443 ที่ไฟร์วอลล์ระดับคลาวด์ เช่น Security Group ผู้พัฒนา Mailcow แนะนำให้ไม่ใช้ ufw หรือ firewalld บนเครื่องเดียวกันถ้าเลี่ยงได้ เพราะชนกับกฎที่ Docker สร้าง ถ้าต้องกรองบนเครื่องให้ใส่กฎใน chain DOCKER-USER

ผลคำสั่งตรวจเครื่องก่อนติดตั้ง Mailcow ทั้ง RAM และ swap ค่า PTR ของ IP การเชื่อมต่อพอร์ต 25 ขาออก และพอร์ตที่ยังว่าง
ถ้า nc ค้างจนหมดเวลา ให้ขอเปิดพอร์ต 25 ขาออกจากผู้ให้บริการก่อนติดตั้ง

ขั้นตอนที่ 2: ตั้งระเบียน DNS

ตั้งระเบียนชุดนี้ก่อนติดตั้ง เพื่อให้ Mailcow ขอใบรับรอง Let's Encrypt ได้ทันทีที่เริ่มทำงาน

mail.example.com.          3600  IN  A      203.0.113.25
example.com.               3600  IN  MX     10 mail.example.com.
autodiscover.example.com.  3600  IN  CNAME  mail.example.com.
autoconfig.example.com.    3600  IN  CNAME  mail.example.com.
example.com.               3600  IN  TXT    "v=spf1 mx a -all"
_dmarc.example.com.        3600  IN  TXT    "v=DMARC1; p=none; rua=mailto:[email protected]"

ระเบียน DKIM (dkim._domainkey) ได้หลังเพิ่มโดเมนในขั้นตอนที่ 4 ถ้าโดเมนยังรับอีเมลอยู่ที่ระบบเดิม ให้ตั้งเฉพาะระเบียน A, CNAME และ DKIM ไว้ก่อน แล้วค่อยเปลี่ยน MX และ SPF ในวันย้ายจริงตามแผน MX Cutover

ขั้นตอนที่ 3: ติดตั้ง Docker และ Mailcow

Mailcow ต้องการ Docker Engine รุ่นล่าสุดจาก Docker ไม่ใช่แพ็กเกจเก่าของระบบปฏิบัติการ บน Debian และ Ubuntu ใช้สคริปต์ทางการ แล้วโคลนโปรเจกต์ไว้ที่ /opt

curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker
umask 0022
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
docker compose pull
docker compose up -d

สคริปต์ generate_config.sh จะถามชื่อโฮสต์ ให้ตอบเป็น FQDN ของเครื่อง เช่น mail.example.com ไม่ใช่โดเมนอีเมล แล้วถามเขตเวลา ให้ตอบ Asia/Bangkok ค่าทั้งหมดอยู่ในไฟล์ mailcow.conf ถ้าเครื่องมี RAM จำกัด ตั้ง SKIP_CLAMD=y เพื่อปิดการสแกนไวรัส และ SKIP_FTS=y เพื่อปิดการทำดัชนีค้นหาเต็มข้อความ ซึ่งทั้งสองส่วนใช้ RAM มาก แล้วรัน docker compose up -d อีกครั้ง ขั้นตอนเต็มอยู่ใน เอกสารติดตั้งของ Mailcow

ขั้นตอนที่ 4: เข้าหน้าผู้ดูแล เพิ่มโดเมนและกล่องจดหมาย

  1. เปิด https://mail.example.com/admin ล็อกอินด้วยค่าเริ่มต้น admin / moohoo แล้วเปลี่ยนรหัสผ่านทันที และเปิดการยืนยันตัวตนสองขั้นของบัญชีผู้ดูแล
  2. ไปที่ E-Mail > Configuration (เอกสารบางหน้ายังเรียกส่วนนี้ว่า Mail setup) แท็บ Domains คลิก Add domain ใส่ example.com กำหนดโควตารวมและจำนวนกล่องสูงสุด
  3. คัดลอกระเบียน DKIM ที่ Mailcow สร้างให้ไปใส่ใน DNS ดูได้จากปุ่ม DNS ในแถวของโดเมน หรือที่ System > Configuration > Options > ARC/DKIM keys หน้า DNS ของโดเมนยังบอกด้วยว่าระเบียนใดยังไม่ถูกต้อง
  4. ที่แท็บ Mailboxes คลิก Add mailbox สร้างกล่องให้ผู้ใช้ ตั้งชื่อที่อยู่ตาม Email Naming Convention ของบริษัท

ถ้าต้องย้ายอีเมลเก่าจากระบบเดิม Mailcow มีเครื่องมือ Sync jobs ที่ใช้ imapsync อยู่ภายใน ตั้งได้ที่แท็บ Sync jobs โดยไม่ต้องติดตั้งอะไรเพิ่ม หลักการเดียวกับการใช้ imapsync ย้ายข้อมูล

เช็กลิสต์ก่อนเปิดใช้ Mailcow เช่น เปลี่ยนรหัสผ่าน admin ระเบียน DKIM ผ่าน PTR ตรงชื่อโฮสต์ และทดลองกู้คืนข้อมูลแล้ว
ข้อสีแดงคือสิ่งที่พบบ่อยในเครื่องที่ถูกเจาะหรือกู้ข้อมูลไม่ได้

ขั้นตอนที่ 5: ตั้งสำรองข้อมูล Mailcow ทุกคืน

Mailcow มีสคริปต์สำรองข้อมูลมาให้ที่ helper-scripts/backup_and_restore.sh ห้ามคัดลอกสคริปต์ไปไว้ที่อื่น และห้ามเปลี่ยนชื่อโฟลเดอร์ mailcow-วันที่ ที่สคริปต์สร้าง เพราะจะกู้คืนไม่ได้ ทดสอบสำรองครั้งแรกด้วยมือ

mkdir -p /opt/backup
cd /opt/mailcow-dockerized
MAILCOW_BACKUP_LOCATION=/opt/backup ./helper-scripts/backup_and_restore.sh backup all --delete-days 7

เมื่อสำเร็จ ให้สร้างไฟล์ /etc/cron.d/mailcow-backup ให้รันทุกคืนเวลา 02:30

30 2 * * * root cd /opt/mailcow-dockerized && MAILCOW_BACKUP_LOCATION=/opt/backup ./helper-scripts/backup_and_restore.sh backup all --delete-days 7 >/var/log/mailcow-backup.log 2>&1

ข้อมูลสำรองที่อยู่บนเครื่องเดียวกันไม่ช่วยอะไรเมื่อดิสก์เสียหรือโดนแรนซัมแวร์ ให้ส่งโฟลเดอร์ /opt/backup ไปเก็บนอกเครื่องทุกคืน เช่น ด้วย rclone ไปยัง S3 Object Storage และทดลองกู้คืนบนเครื่องทดสอบอย่างน้อยไตรมาสละครั้งด้วยคำสั่ง backup_and_restore.sh restore

ขั้นตอนที่ 6: อัปเดตและเฝ้าดู Mailcow หลังเปิดใช้งาน

  • อัปเดตด้วย ./update.sh ในโฟลเดอร์ /opt/mailcow-dockerized หลังสำรองข้อมูลแล้ว อ่านบันทึกการเปลี่ยนแปลงของรุ่นใหม่ก่อนทุกครั้ง
  • ดูคิวอีเมลขาออกด้วยคำสั่ง docker compose exec postfix-mailcow mailq ถ้าคิวโตผิดปกติให้อ่านเหตุผลที่อีเมลค้างและหาต้นทางก่อนลบ
  • IP ใหม่ยังไม่มีชื่อเสียง ส่งออกมากในวันแรกเสี่ยงเข้า Spam ให้ค่อย ๆ เพิ่มปริมาณตาม คู่มือ IP Warmup และตรวจ Blacklist เป็นระยะ

เมื่อใดควรใช้บริการแบบมีผู้ดูแลแทน Mailcow

Mailcow ทำงานได้ดี แต่บริษัทต้องรับผิดชอบเองทั้งหมด ตั้งแต่อัปเดตความปลอดภัย สำรองและกู้คืน แก้ปัญหา IP ติด Blacklist ไปจนถึงตอบผู้ใช้ตอนเช้าวันจันทร์ที่อีเมลเข้าไม่ได้ ถ้าบริษัทไม่มีผู้ดูแล Linux ที่รับหน้าที่นี้ได้ต่อเนื่อง ต้องการ SLA หรือต้องผ่านการตรวจสอบด้านความปลอดภัย บริการเมลเซิร์ฟเวอร์ที่มีผู้ดูแลมักคุ้มกว่าเมื่อคิดค่าเวลาของคน

ตารางเปรียบเทียบการดูแล Mailcow เองบน Cloud Server กับ Private Mail Server ที่มีทีมงานดูแล ในเรื่องค่าใช้จ่าย งานดูแล และความรับผิดชอบ
Mailcow ประหยัดค่าไลเซนส์ แต่ต้องมีคนรับผิดชอบงานดูแลต่อเนื่อง

ปัญหาที่พบบ่อยเกี่ยวกับ Mailcow

ติดตั้ง Mailcow แล้วส่งอีเมลออกไม่ได้ อีเมลค้างในคิวด้วย Connection timed out ทำไม?

เกือบทุกครั้งเกิดจากผู้ให้บริการคลาวด์ปิดพอร์ต 25 ขาออก ทดสอบด้วยคำสั่ง nc ในขั้นตอนที่ 1 ถ้าปิดอยู่ให้ขอเปิดจากผู้ให้บริการ หรือตั้ง relayhost ส่งผ่านบริการ SMTP ที่ใช้พอร์ต 587 โดยเพิ่มที่แท็บ Routing ส่วน Add sender-dependent transport แล้วเลือกใช้ในหน้าแก้ไขโดเมนช่อง Sender-dependent transports

Mailcow ขอใบรับรอง Let's Encrypt ไม่สำเร็จ แก้อย่างไร?

ตรวจว่า A record ของ mail.example.com และ CNAME ของ autodiscover และ autoconfig ชี้มาที่เครื่องแล้ว และพอร์ต 80 เปิดจากอินเทอร์เน็ต หลังแก้ให้สั่ง docker compose restart acme-mailcow แล้วดู log ด้วย docker compose logs --tail=200 -f acme-mailcow

RAM 4 GB พอสำหรับ Mailcow หรือไม่?

ต่ำกว่าขั้นต่ำที่ผู้พัฒนาระบุไว้ 6 GiB อาจเริ่มทำงานได้ถ้าปิด ClamAV และ Full-text search แต่เสี่ยงที่ container จะถูกปิดเพราะหน่วยความจำไม่พอเมื่อใช้งานจริง สำหรับบริษัทที่มีผู้ใช้หลายคน ควรเริ่มที่ 8 GiB

อีเมลจาก Mailcow เข้า Spam ของ Gmail ต้องตรวจอะไรบ้าง?

ตรวจ PTR ตรงกับชื่อโฮสต์ ระเบียน SPF, DKIM และ DMARC ผ่าน IP ไม่ติด Blacklist และเพิ่มปริมาณการส่งทีละน้อยสำหรับ IP ใหม่ จากนั้นติดตามผลด้วย Postmaster Tools

ถ้าต้องการให้ช่วยติดตั้งหรือตรวจ Mailcow บน Cloud Server ติดต่อทีมงาน THAI DATA CLOUD ได้ ถ้าต้องการเมลเซิร์ฟเวอร์ส่วนตัวที่มีทีมงานดูแลการอัปเดต สำรองข้อมูล และชื่อเสียงของ IP ให้ ดูรายละเอียดได้ที่ Private Mail Server

อ่านเพิ่มเติมเกี่ยวกับ Mailcow

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน