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

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

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

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

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

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

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

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

[!TIP] ดูรายการของเรา ผู้ให้บริการเซิร์ฟเวอร์อีเมลที่ยอดเยี่ยม

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

ผู้ให้บริการระบบคลาวด์ส่วนใหญ่สนับสนุนการกำหนดค่า 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อินเทอร์เฟซเว็บสำหรับการโต้ตอบของผู้ดูแลระบบทั้งหมด
API4000เลเยอร์ API สู่ฐานข้อมูลนามธรรม
บรีไม่มีงานเบื้องหลังและงานผู้ดำเนินการ
SMTP465/587เซิร์ฟเวอร์ SMTP สำหรับอีเมล์ขาออก
SMTP บรีไม่มีงานเบื้องหลัง SMTP
MX2525การแลกเปลี่ยนเมล์สำหรับอีเมล์ขาเข้าและการส่งต่ออีเมล์
IMAP993/2993เซิร์ฟเวอร์ IMAP สำหรับการจัดการอีเมลขาเข้าและกล่องจดหมาย
POP3995/2995เซิร์ฟเวอร์ POP3 สำหรับการจัดการอีเมลขาเข้าและกล่องจดหมาย
SQLite3456เซิร์ฟเวอร์ SQLite สำหรับการโต้ตอบกับฐานข้อมูล SQLite
SQLite บรีไม่มีงานพื้นหลัง SQLite
คาลเดฟ5000เซิร์ฟเวอร์ CalDAV สำหรับการจัดการปฏิทิน
มอนโกดีบี27017ฐานข้อมูล MongoDB สำหรับการจัดการข้อมูลส่วนใหญ่
เรดิส6379Redis สำหรับการแคชและการจัดการสถานะ
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

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

การตั้งค่า DNS เบื้องต้น

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

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

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

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

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

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

  1. เปิดหน้า Landing Page ไปที่ https://<ชื่อโดเมน> โดยแทนที่ <ชื่อโดเมน> ด้วยโดเมนที่กำหนดค่าไว้ในการตั้งค่า 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 สนับสนุนโดยการเลือกช่องกาเครื่องหมาย
  • คลิก สร้างนามแฝง
  1. ตั้งรหัสผ่าน
  • คลิก สร้างรหัสผ่าน เพื่อสร้างรหัสผ่านที่ปลอดภัย
  • รหัสผ่านนี้จำเป็นสำหรับการเข้าสู่ระบบไคลเอนต์อีเมลของคุณ
  1. กำหนดค่าไคลเอนต์อีเมลของคุณ
  • ใช้ไคลเอนต์อีเมล์เช่น Thunderbird
  • กรอกชื่อนามแฝงและรหัสผ่านที่สร้างขึ้น
  • กำหนดค่า IMAP และ SMTP ตั้งค่าให้เหมาะสม

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

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

ชนิดชื่อโฮสต์ท่าเรือความปลอดภัยในการเชื่อมต่อการรับรอง
SMTPsmtp.<ชื่อโดเมน>465SSL / TLSรหัสผ่านปกติ
IMAPimap.<ชื่อโดเมน>993SSL / TLSรหัสผ่านปกติ

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

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

ทำไมสิ่งนี้ถึงไม่ทำงานนอก Ubuntu

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

เหตุใดความท้าทายของ Certbot Acme จึงล้มเหลว

ข้อผิดพลาดที่พบบ่อยที่สุดคือ certbot / letsencrypt บางครั้งจะร้องขอ 2 ความท้าทาย คุณต้องแน่ใจว่าจะเพิ่ม BOTH บันทึก txt

ตัวอย่าง: คุณอาจเห็นความท้าทายสองแบบดังนี้: _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 เพื่อดูทุกอย่าง (รวมถึงคอนเทนเนอร์ที่ไม่ได้ทำงานอยู่) คุณอาจเห็นบันทึกหรือหมายเหตุการออก

ฉันจะค้นหาบันทึกได้อย่างไร

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

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

เหตุใดอีเมลขาออกของฉันจึงหมดเวลา

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

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

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