โฮสต์ด้วยตนเอง
เริ่มต้นใช้งาน
โซลูชันอีเมลที่โฮสต์ด้วยตนเองของเรา เช่นเดียวกับผลิตภัณฑ์ทั้งหมดของเรา เป็นโอเพนซอร์ส 100% ทั้งฝั่ง frontend และ backend ซึ่งหมายความว่า:
- ความโปร่งใสอย่างสมบูรณ์: โค้ดทุกบรรทัดที่ประมวลผลอีเมลของคุณพร้อมให้สาธารณชนตรวจสอบได้
- การมีส่วนร่วมของชุมชน: ทุกคนสามารถมีส่วนร่วมในการปรับปรุงหรือแก้ไขปัญหาได้
- ความปลอดภัยผ่านการเปิดเผย: ชุมชนทั่วโลกสามารถระบุและแก้ไขช่องโหว่ได้
- ไม่มีการผูกขาดกับผู้ขาย: คุณไม่ต้องพึ่งพาการดำรงอยู่ของบริษัทเราอีกต่อไป
ฐานโค้ดทั้งหมดมีอยู่ใน 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
Tip
ดูรายการ ผู้ให้บริการเซิร์ฟเวอร์อีเมลที่ยอดเยี่ยม ของเรา
การเริ่มต้นระบบคลาวด์ / ข้อมูลผู้ใช้
ผู้ให้บริการคลาวด์ส่วนใหญ่รองรับการกำหนดค่า cloud-init เมื่อมีการจัดเตรียมเซิร์ฟเวอร์ส่วนตัวเสมือน (VPS) วิธีนี้เป็นวิธีที่ดีเยี่ยมในการตั้งค่าไฟล์และตัวแปรสภาพแวดล้อมล่วงหน้าเพื่อให้ตรรกะการตั้งค่าเริ่มต้นของสคริปต์ใช้งานได้ ซึ่งจะช่วยหลีกเลี่ยงการแจ้งขอข้อมูลเพิ่มเติมขณะที่สคริปต์กำลังทำงาน
ตัวเลือก
EMAIL
- อีเมลที่ใช้สำหรับแจ้งเตือนการหมดอายุของ certbotDOMAIN
- โดเมนที่กำหนดเอง (เช่น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 / อีเมลขาออก
การเริ่มต้นใช้งาน
-
เปิดหน้า Landing Page ไปที่ https://<domain_name> โดยแทนที่ <domain_name> ด้วยโดเมนที่กำหนดค่าไว้ในการตั้งค่า DNS ของคุณ คุณจะเห็นหน้า Landing Page สำหรับส่งต่ออีเมล
-
เข้าสู่ระบบและออนบอร์ดโดเมนของคุณ
- ลงชื่อเข้าใช้ด้วยอีเมลและรหัสผ่านที่ถูกต้อง
- ป้อนชื่อโดเมนที่คุณต้องการตั้งค่า (ต้องตรงกับการกำหนดค่า DNS)
- ทำตามคำแนะนำเพื่อเพิ่มระเบียน MX และ TXT ที่จำเป็นสำหรับการยืนยัน
- การตั้งค่าเสร็จสมบูรณ์
- เมื่อยืนยันแล้ว ให้เข้าไปที่หน้านามแฝงเพื่อสร้างนามแฝงแรกของคุณ
- คุณสามารถเลือกกำหนดค่า SMTP สำหรับอีเมลขาออก ใน การตั้งค่าโดเมน ได้ ซึ่งต้องใช้ระเบียน DNS เพิ่มเติม
Note
ไม่มีการส่งข้อมูลออกนอกเซิร์ฟเวอร์ของคุณ ตัวเลือกโฮสต์ด้วยตนเองและบัญชีเริ่มต้นมีไว้สำหรับการเข้าสู่ระบบของผู้ดูแลระบบและมุมมองเว็บเพื่อจัดการโดเมน นามแฝง และการกำหนดค่าอีเมลที่เกี่ยวข้องเท่านั้น
กำลังทดสอบ
กำลังสร้างนามแฝงแรกของคุณ
- ไปที่หน้านามแฝง เปิดหน้าการจัดการนามแฝง:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
- เพิ่มนามแฝงใหม่
- คลิก เพิ่มนามแฝง (ด้านขวาบน)
- ป้อนชื่อนามแฝงและปรับการตั้งค่าอีเมลตามต้องการ
- (ไม่บังคับ) เปิดใช้งานการรองรับ IMAP/POP3/CalDAV/CardDAV โดยเลือกช่องทำเครื่องหมาย
- คลิก สร้างนามแฝง
- ตั้งรหัสผ่าน
- คลิก สร้างรหัสผ่าน เพื่อสร้างรหัสผ่านที่ปลอดภัย
- จำเป็นต้องใช้รหัสผ่านนี้ในการเข้าสู่ระบบโปรแกรมรับส่งอีเมลของคุณ
- กำหนดค่าไคลเอนต์อีเมลของคุณ
- ใช้โปรแกรมรับส่งอีเมล เช่น 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
ลองดู คำถามที่พบบ่อยที่นี่ ของเรา