โฮสต์ด้วยตนเอง

เริ่มต้นใช้งาน

โซลูชันอีเมลที่โฮสต์ด้วยตนเองของเรา เช่นเดียวกับผลิตภัณฑ์ทั้งหมดของเรา เป็นโอเพนซอร์ส 100% ทั้งฝั่ง frontend และ backend ซึ่งหมายความว่า:

  1. ความโปร่งใสอย่างสมบูรณ์: โค้ดทุกบรรทัดที่ประมวลผลอีเมลของคุณพร้อมให้สาธารณชนตรวจสอบได้
  2. การมีส่วนร่วมของชุมชน: ทุกคนสามารถมีส่วนร่วมในการปรับปรุงหรือแก้ไขปัญหาได้
  3. ความปลอดภัยผ่านการเปิดเผย: ชุมชนทั่วโลกสามารถระบุและแก้ไขช่องโหว่ได้
  4. ไม่มีการผูกขาดกับผู้ขาย: คุณไม่ต้องพึ่งพาการดำรงอยู่ของบริษัทเราอีกต่อไป

ฐานโค้ดทั้งหมดมีอยู่ใน GitHub ที่ https://github.com/forwardemail/forwardemail.net, ซึ่งได้รับอนุญาตภายใต้ใบอนุญาต MIT

สถาปัตยกรรมนี้ประกอบด้วยคอนเทนเนอร์สำหรับ:

  • เซิร์ฟเวอร์ SMTP สำหรับอีเมลขาออก
  • เซิร์ฟเวอร์ IMAP/POP3 สำหรับการดึงอีเมล
  • อินเทอร์เฟซเว็บสำหรับการจัดการ
  • ฐานข้อมูลสำหรับจัดเก็บการกำหนดค่า
  • Redis สำหรับการแคชและเพิ่มประสิทธิภาพการทำงาน
  • SQLite สำหรับการจัดเก็บกล่องจดหมายที่ปลอดภัยและเข้ารหัส

Note

อย่าลืมดู บล็อกที่โฮสต์ด้วยตนเอง ของเรา

และสำหรับผู้ที่สนใจเวอร์ชันแบบทีละขั้นตอนโดยละเอียด โปรดดูคู่มือ อูบุนตู หรือ เดเบียน ของเรา

ข้อกำหนด

ก่อนที่จะรันสคริปต์การติดตั้ง ให้แน่ใจว่าคุณมีสิ่งต่อไปนี้:

  • ระบบปฏิบัติการ: เซิร์ฟเวอร์ที่ใช้ Linux (ปัจจุบันรองรับ Ubuntu 22.04 ขึ้นไป)
  • ทรัพยากร: 1 vCPU และ RAM 2GB
  • สิทธิ์การเข้าถึงรูท: สิทธิ์ผู้ดูแลระบบเพื่อดำเนินการคำสั่ง
  • ชื่อโดเมน: โดเมนที่กำหนดเองพร้อมสำหรับการกำหนดค่า DNS
  • IP ที่สะอาด: ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณมีที่อยู่ IP ที่สะอาด และไม่มีประวัติสแปมมาก่อน โดยการตรวจสอบบัญชีดำ ดูข้อมูลเพิ่มเติมได้ที่ ที่นี่
  • ที่อยู่ IP สาธารณะพร้อมรองรับพอร์ต 25
  • สามารถตั้งค่า PTR ย้อนกลับ ได้
  • รองรับ IPv4 และ IPv6

การเริ่มต้นระบบคลาวด์ / ข้อมูลผู้ใช้

ผู้ให้บริการคลาวด์ส่วนใหญ่รองรับการกำหนดค่า cloud-init เมื่อมีการจัดเตรียมเซิร์ฟเวอร์ส่วนตัวเสมือน (VPS) วิธีนี้เป็นวิธีที่ดีเยี่ยมในการตั้งค่าไฟล์และตัวแปรสภาพแวดล้อมล่วงหน้าเพื่อให้ตรรกะการตั้งค่าเริ่มต้นของสคริปต์ใช้งานได้ ซึ่งจะช่วยหลีกเลี่ยงการแจ้งขอข้อมูลเพิ่มเติมขณะที่สคริปต์กำลังทำงาน

ตัวเลือก

  • EMAIL - อีเมลที่ใช้สำหรับแจ้งเตือนการหมดอายุของ certbot
  • DOMAIN - โดเมนที่กำหนดเอง (เช่น example.com) ใช้สำหรับการตั้งค่าโฮสติ้งด้วยตนเอง
  • AUTH_BASIC_USERNAME - ชื่อผู้ใช้ที่ใช้ในการตั้งค่าครั้งแรกเพื่อปกป้องเว็บไซต์
  • AUTH_BASIC_PASSWORD - รหัสผ่านที่ใช้ในการตั้งค่าครั้งแรกเพื่อปกป้องเว็บไซต์
  • /root/.cloudflare.ini - (เฉพาะผู้ใช้ Cloudflare) ไฟล์กำหนดค่า cloudflare ที่ certbot ใช้สำหรับการกำหนดค่า DNS คุณต้องตั้งค่าโทเค็น API ผ่าน dns_cloudflare_api_token อ่านเพิ่มเติม ที่นี่

ตัวอย่าง:

#cloud-config
write_files:
  - path: /root/.cloudflare.ini
    content: |
      dns_cloudflare_api_token = "xxx"
    owner: root:root
    permissions: '0600'
  - path: /etc/profile.d/env.sh
    content: |
      export EMAIL="test@myemail.com"
      export DOMAIN="mydomain.com"

runcmd:
  - chmod +x /etc/profile.d/env.sh

ติดตั้ง

เรียกใช้คำสั่งต่อไปนี้ในเซิร์ฟเวอร์ของคุณเพื่อดาวน์โหลดและดำเนินการสคริปต์การติดตั้ง:

bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)

ดีบักสคริปต์การติดตั้ง

เพิ่ม DEBUG=true ไว้ข้างหน้าสคริปต์การติดตั้งสำหรับเอาต์พุตแบบละเอียด:

DEBUG=true bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)

แจ้งเตือน

1. Initial setup
2. Setup Backups
3. Setup Auto Upgrades
4. Renew certificates
5. Restore from Backup
6. Help
7. Exit
  • การตั้งค่าเริ่มต้น: ดาวน์โหลดโค้ดอีเมลส่งต่อล่าสุด กำหนดค่าสภาพแวดล้อม แจ้งโดเมนที่กำหนดเองของคุณ และตั้งค่าใบรับรอง คีย์ และความลับที่จำเป็นทั้งหมด
  • การตั้งค่าการสำรองข้อมูล: จะตั้งค่า cron เพื่อสำรองข้อมูล MongoDB และ Redis โดยใช้พื้นที่จัดเก็บที่รองรับ S3 สำหรับการจัดเก็บข้อมูลระยะไกลที่ปลอดภัย SQLite จะได้รับการสำรองข้อมูลแยกต่างหากเมื่อเข้าสู่ระบบ หากมีการเปลี่ยนแปลงสำหรับการสำรองข้อมูลที่ปลอดภัยและเข้ารหัส
  • การตั้งค่าการอัปเกรด: ตั้งค่า cron เพื่อค้นหาการอัปเดตทุกคืน ซึ่งจะสร้างและรีสตาร์ทส่วนประกอบโครงสร้างพื้นฐานอย่างปลอดภัย
  • การต่ออายุใบรับรอง: Certbot / lets encrypt ใช้สำหรับใบรับรอง SSL และคีย์จะหมดอายุทุก 3 เดือน การดำเนินการนี้จะต่ออายุใบรับรองสำหรับโดเมนของคุณและจัดเก็บไว้ในโฟลเดอร์ที่จำเป็นสำหรับการใช้งานส่วนประกอบที่เกี่ยวข้อง ดู เส้นทางไฟล์ที่สำคัญ
  • การคืนค่าจากการสำรองข้อมูล: จะสั่งให้ MongoDB และ Redis คืนค่าจากข้อมูลสำรอง

การตั้งค่าเริ่มต้น (ตัวเลือกที่ 1)

เลือกตัวเลือก 1. Initial setup เพื่อเริ่มต้น

เมื่อเสร็จสมบูรณ์ คุณควรเห็นข้อความแจ้งว่าสำเร็จ คุณสามารถรัน docker ps เพื่อดู ส่วนประกอบ เริ่มทำงานได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนประกอบด้านล่าง

บริการ

ชื่อบริการ พอร์ตเริ่มต้น คำอธิบาย
เว็บไซต์ 443 อินเทอร์เฟซเว็บสำหรับการโต้ตอบของผู้ดูแลระบบทั้งหมด
API 4000 เลเยอร์ API สู่ฐานข้อมูลแบบนามธรรม
บรี ไม่มี งานเบื้องหลังและงานผู้ดำเนินการ
SMTP 465/587 เซิร์ฟเวอร์ SMTP สำหรับอีเมลขาออก
SMTP บรี ไม่มี งานพื้นหลัง SMTP
MX 2525 การแลกเปลี่ยนอีเมลสำหรับอีเมลขาเข้าและการส่งต่ออีเมล
IMAP 993/2993 เซิร์ฟเวอร์ IMAP สำหรับการจัดการอีเมลขาเข้าและกล่องจดหมาย
POP3 995/2995 เซิร์ฟเวอร์ POP3 สำหรับการจัดการอีเมลขาเข้าและกล่องจดหมาย
SQLite 3456 เซิร์ฟเวอร์ SQLite สำหรับการโต้ตอบกับฐานข้อมูล SQLite
SQLite บรี ไม่มี งานพื้นหลัง SQLite
คาลเดฟ 5000 เซิร์ฟเวอร์ CalDAV สำหรับการจัดการปฏิทิน
การ์ดเดฟ 6000 เซิร์ฟเวอร์ CardDAV สำหรับการจัดการปฏิทิน
มอนโกดีบี 27017 ฐานข้อมูล MongoDB สำหรับการจัดการข้อมูลส่วนใหญ่
เรดิส 6379 Redis สำหรับการแคชและการจัดการสถานะ
SQLite ไม่มี ฐานข้อมูล SQLite สำหรับกล่องจดหมายที่เข้ารหัส

เส้นทางไฟล์ที่สำคัญ

หมายเหตุ: เส้นทางโฮสต์ ด้านล่างนี้สัมพันธ์กับ /root/forwardemail.net/self-hosting/

ส่วนประกอบ เส้นทางโฮสต์ เส้นทางคอนเทนเนอร์
มอนโกดีบี ./mongo-backups /backups
เรดิส ./redis-data /data
สควอไลท์ ./sqlite-data /mnt/{SQLITE_STORAGE_PATH}
ไฟล์ Env ./.env /app/.env
ใบรับรอง/คีย์ SSL ./ssl /app/ssl/
คีย์ส่วนตัว ./ssl/privkey.pem /app/ssl/privkey.pem
ใบรับรองแบบโซ่เต็ม ./ssl/fullchain.pem /app/ssl/fullchain.pem
CA ที่ได้รับการรับรอง ./ssl/cert.pem /app/ssl/cert.pem
คีย์ส่วนตัว DKIM ./ssl/dkim.key /app/ssl/dkim.key

Important

บันทึกไฟล์ .env อย่างปลอดภัย สำคัญมากสำหรับการกู้คืนในกรณีที่เกิดข้อผิดพลาด คุณสามารถค้นหาไฟล์นี้ได้ใน /root/forwardemail.net/self-hosting/.env

การกำหนดค่า

การตั้งค่า DNS เริ่มต้น

ในผู้ให้บริการ DNS ที่คุณเลือก ให้กำหนดค่าระเบียน DNS ที่เหมาะสม โปรดทราบว่าข้อมูลใดๆ ในวงเล็บ (<>) จะเป็นแบบไดนามิกและจำเป็นต้องอัปเดตด้วยค่าของคุณ

พิมพ์ ชื่อ เนื้อหา TTL
A "@", ".", หรือว่างเปล่า <ที่อยู่ IP> อัตโนมัติ
CNAME เอพี <ชื่อโดเมน> อัตโนมัติ
CNAME คาลดาว <ชื่อโดเมน> อัตโนมัติ
CNAME การ์ดดาว <ชื่อโดเมน> อัตโนมัติ
CNAME fe-bounces <ชื่อโดเมน> อัตโนมัติ
CNAME ไอแมป <ชื่อโดเมน> อัตโนมัติ
CNAME เอ็มเอ็กซ์ <ชื่อโดเมน> อัตโนมัติ
CNAME ป๊อป3 <ชื่อโดเมน> อัตโนมัติ
CNAME เอสเอ็มทีพี <ชื่อโดเมน> อัตโนมัติ
MX "@", ".", หรือว่างเปล่า mx.<ชื่อโดเมน> (ลำดับความสำคัญ 0) อัตโนมัติ
TXT "@", ".", หรือว่างเปล่า "v=spf1 a -all" อัตโนมัติ

บันทึก DNS / PTR ย้อนกลับ

Reverse DNS (rDNS) หรือ Reverse Pointer Records (PTR Records) มีความสำคัญอย่างยิ่งสำหรับเซิร์ฟเวอร์อีเมล เพราะช่วยยืนยันความถูกต้องของเซิร์ฟเวอร์ที่ส่งอีเมล ผู้ให้บริการคลาวด์แต่ละรายมีการดำเนินการที่แตกต่างกัน ดังนั้นคุณจะต้องค้นหาวิธีเพิ่ม "Reverse DNS" เพื่อจับคู่โฮสต์และ IP กับชื่อโฮสต์ที่เกี่ยวข้อง ซึ่งส่วนใหญ่มักจะอยู่ในส่วนเครือข่ายของผู้ให้บริการ

พอร์ต 25 ถูกบล็อก

ผู้ให้บริการอินเทอร์เน็ตและผู้ให้บริการคลาวด์บางรายบล็อกหมายเลข 25 เพื่อหลีกเลี่ยงผู้ไม่หวังดี คุณอาจต้องยื่นคำร้องสนับสนุนเพื่อเปิดพอร์ต 25 สำหรับ SMTP / อีเมลขาออก

การเริ่มต้นใช้งาน

  1. เปิดหน้า Landing Page ไปที่ https://<domain_name> โดยแทนที่ <domain_name> ด้วยโดเมนที่กำหนดค่าไว้ในการตั้งค่า DNS ของคุณ คุณจะเห็นหน้า Landing Page สำหรับส่งต่ออีเมล

  2. เข้าสู่ระบบและออนบอร์ดโดเมนของคุณ

  • ลงชื่อเข้าใช้ด้วยอีเมลและรหัสผ่านที่ถูกต้อง
  • ป้อนชื่อโดเมนที่คุณต้องการตั้งค่า (ต้องตรงกับการกำหนดค่า DNS)
  • ทำตามคำแนะนำเพื่อเพิ่มระเบียน MX และ TXT ที่จำเป็นสำหรับการยืนยัน
  1. การตั้งค่าเสร็จสมบูรณ์
  • เมื่อยืนยันแล้ว ให้เข้าไปที่หน้านามแฝงเพื่อสร้างนามแฝงแรกของคุณ
  • คุณสามารถเลือกกำหนดค่า SMTP สำหรับอีเมลขาออก ใน การตั้งค่าโดเมน ได้ ซึ่งต้องใช้ระเบียน DNS เพิ่มเติม

Note

ไม่มีการส่งข้อมูลออกนอกเซิร์ฟเวอร์ของคุณ ตัวเลือกโฮสต์ด้วยตนเองและบัญชีเริ่มต้นมีไว้สำหรับการเข้าสู่ระบบของผู้ดูแลระบบและมุมมองเว็บเพื่อจัดการโดเมน นามแฝง และการกำหนดค่าอีเมลที่เกี่ยวข้องเท่านั้น

กำลังทดสอบ

กำลังสร้างนามแฝงแรกของคุณ

  1. ไปที่หน้านามแฝง เปิดหน้าการจัดการนามแฝง:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
  1. เพิ่มนามแฝงใหม่
  • คลิก เพิ่มนามแฝง (ด้านขวาบน)
  • ป้อนชื่อนามแฝงและปรับการตั้งค่าอีเมลตามต้องการ
  • (ไม่บังคับ) เปิดใช้งานการรองรับ IMAP/POP3/CalDAV/CardDAV โดยเลือกช่องทำเครื่องหมาย
  • คลิก สร้างนามแฝง
  1. ตั้งรหัสผ่าน
  • คลิก สร้างรหัสผ่าน เพื่อสร้างรหัสผ่านที่ปลอดภัย
  • จำเป็นต้องใช้รหัสผ่านนี้ในการเข้าสู่ระบบโปรแกรมรับส่งอีเมลของคุณ
  1. กำหนดค่าไคลเอนต์อีเมลของคุณ
  • ใช้โปรแกรมรับส่งอีเมล เช่น Thunderbird
  • ป้อนชื่อนามแฝงและรหัสผ่านที่สร้างขึ้น
  • กำหนดค่า IMAP และ SMTP ให้เหมาะสม

การตั้งค่าเซิร์ฟเวอร์อีเมล

ชื่อผู้ใช้: <alias name>

พิมพ์ ชื่อโฮสต์ ท่าเรือ ความปลอดภัยในการเชื่อมต่อ การตรวจสอบความถูกต้อง
SMTP smtp.<ชื่อโดเมน> 465 SSL / TLS รหัสผ่านปกติ
IMAP imap.<ชื่อโดเมน> 993 SSL / TLS รหัสผ่านปกติ

การส่ง/รับอีเมลฉบับแรกของคุณ

เมื่อกำหนดค่าแล้ว คุณจะสามารถส่งและรับอีเมลไปยังที่อยู่อีเมลที่คุณสร้างขึ้นใหม่และโฮสต์ด้วยตนเองได้!

การแก้ไขปัญหา

เหตุใดจึงไม่ทำงานนอก Ubuntu และ Debian

ขณะนี้เรากำลังมองหาการสนับสนุนสำหรับ MacOS และจะมองหาเวอร์ชันอื่นๆ ด้วย โปรดเปิด การอภิปราย หรือร่วมแบ่งปันหากคุณต้องการให้เวอร์ชันอื่นๆ ได้รับการสนับสนุน

เหตุใดความท้าทาย certbot acme จึงล้มเหลว

ปัญหาที่พบบ่อยที่สุดคือ certbot / letsencrypt บางครั้งจะขอ 2 challenge คุณต้องแน่ใจว่าได้เพิ่ม ทั้งสอง txt records

ตัวอย่าง: คุณอาจเห็นสองความท้าทายดังนี้: _acme-challenge.example.com -> "randomstring1" _acme-challenge.example.com -> "randomstring2"

เป็นไปได้เช่นกันว่าการแพร่กระจาย DNS ยังไม่เสร็จสมบูรณ์ คุณสามารถใช้เครื่องมือเช่น https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.<your_domain> ซึ่งจะช่วยให้คุณทราบว่าการเปลี่ยนแปลงในระเบียน TXT ของคุณควรได้รับการสะท้อนหรือไม่ นอกจากนี้ แคช DNS ภายในบนโฮสต์ของคุณยังอาจใช้ค่าเก่าที่ไม่ทันสมัย หรือไม่ได้รับการเปลี่ยนแปลงล่าสุด

อีกทางเลือกหนึ่งคือการใช้การเปลี่ยนแปลง DNS ของ Cerbot อัตโนมัติ โดยการตั้งค่าไฟล์ /root/.cloudflare.ini ด้วยโทเค็น API ใน cloud-init / user-data ของคุณในการตั้งค่า VPS ครั้งแรก หรือสร้างไฟล์นี้แล้วรันสคริปต์อีกครั้ง การดำเนินการนี้จะจัดการการเปลี่ยนแปลง DNS และการอัปเดตความท้าทายโดยอัตโนมัติ

ชื่อผู้ใช้และรหัสผ่านการตรวจสอบสิทธิ์พื้นฐานคืออะไร

สำหรับการโฮสต์ด้วยตนเอง เราได้เพิ่มป๊อปอัปการยืนยันตัวตนแบบเนทีฟของเบราว์เซอร์ครั้งแรก โดยใช้ชื่อผู้ใช้ง่ายๆ (admin) และรหัสผ่าน (สร้างขึ้นแบบสุ่มในการตั้งค่าครั้งแรก) เราเพียงแค่เพิ่มสิ่งนี้เพื่อป้องกันในกรณีที่ระบบอัตโนมัติ/โปรแกรมสแกนข้อมูลไม่สามารถช่วยคุณลงทะเบียนใช้งานเว็บได้ คุณสามารถค้นหารหัสผ่านนี้ได้หลังจากการตั้งค่าครั้งแรกในไฟล์ .env ภายใต้ AUTH_BASIC_USERNAME และ AUTH_BASIC_PASSWORD

ฉันจะทราบได้อย่างไรว่ามีอะไรกำลังทำงานอยู่

คุณสามารถเรียกใช้ docker ps เพื่อดูคอนเทนเนอร์ทั้งหมดที่กำลังทำงานอยู่ ซึ่งกำลังถูกหมุนขึ้นมาจากไฟล์ docker-compose-self-hosting.yml คุณยังสามารถเรียกใช้ docker ps -a เพื่อดูทุกอย่าง (รวมถึงคอนเทนเนอร์ที่ไม่ได้ทำงานอยู่) ได้อีกด้วย

ฉันจะรู้ได้อย่างไรว่ามีอะไรไม่ทำงานอยู่ ซึ่งควรเป็น

คุณสามารถเรียกใช้ docker ps -a เพื่อดูทุกอย่าง (รวมถึงคอนเทนเนอร์ที่ไม่ได้ทำงานอยู่) คุณอาจเห็นบันทึกหรือหมายเหตุการออกจากระบบ

ฉันจะค้นหาบันทึก {#how-do-i-find-logs} ได้อย่างไร

คุณสามารถรับบันทึกเพิ่มเติมได้ผ่าน docker logs -f <container_name> หากมีสิ่งใดเกิดขึ้น อาจเกี่ยวข้องกับไฟล์ .env ที่ถูกกำหนดค่าไม่ถูกต้อง

ภายใน UI เว็บ คุณสามารถดู /admin/emails และ /admin/logs สำหรับบันทึกอีเมลขาออกและบันทึกข้อผิดพลาดตามลำดับ

ทำไมอีเมลขาออกของฉันถึงหมดเวลา

หากคุณเห็นข้อความเช่น Connection timed out (การเชื่อมต่อหมดเวลา) เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ MX... คุณอาจต้องตรวจสอบว่าพอร์ต 25 ถูกบล็อกหรือไม่ เป็นเรื่องปกติที่ ISP หรือผู้ให้บริการคลาวด์จะบล็อกข้อความนี้ไว้ตามค่าเริ่มต้น ซึ่งคุณอาจต้องติดต่อฝ่ายสนับสนุนหรือยื่นคำร้องเพื่อเปิดข้อความนี้

ฉันควรใช้เครื่องมือใดเพื่อทดสอบแนวทางปฏิบัติที่ดีที่สุดในการกำหนดค่าอีเมลและชื่อเสียงของ IP

ลองดู คำถามที่พบบ่อยที่นี่ ของเรา