โฮสต์ด้วยตนเอง
เริ่มต้นใช้งาน
โซลูชันอีเมลโฮสต์ด้วยตนเองของเรา เช่นเดียวกับผลิตภัณฑ์ทั้งหมดของเรา เป็นโอเพนซอร์ส 100% ทั้งส่วนหน้าและส่วนหลัง ซึ่งหมายความว่า:
- ความโปร่งใสอย่างสมบูรณ์: ทุกบรรทัดของโค้ดที่ประมวลผลอีเมลของคุณเปิดให้ตรวจสอบโดยสาธารณะ
- การมีส่วนร่วมของชุมชน: ทุกคนสามารถมีส่วนร่วมในการปรับปรุงหรือแก้ไขปัญหาได้
- ความปลอดภัยผ่านความโปร่งใส: ช่องโหว่สามารถถูกระบุและแก้ไขโดยชุมชนทั่วโลก
- ไม่มีการล็อกกับผู้ขาย: คุณจะไม่ขึ้นอยู่กับการดำรงอยู่ของบริษัทของเรา
โค้ดทั้งหมดพร้อมให้ดูได้ที่ GitHub ที่ https://github.com/forwardemail/forwardemail.net ภายใต้ใบอนุญาต MIT License
สถาปัตยกรรมประกอบด้วยคอนเทนเนอร์สำหรับ:
- เซิร์ฟเวอร์ SMTP สำหรับอีเมลขาออก
- เซิร์ฟเวอร์ IMAP/POP3 สำหรับการดึงอีเมล
- อินเทอร์เฟซเว็บสำหรับการบริหารจัดการ
- ฐานข้อมูลสำหรับเก็บการกำหนดค่า
- Redis สำหรับแคชและประสิทธิภาพ
- SQLite สำหรับเก็บกล่องจดหมายที่ปลอดภัยและเข้ารหัส
Note
อย่าลืมตรวจสอบ บล็อกโฮสต์ด้วยตนเอง ของเรา
และสำหรับผู้ที่สนใจเวอร์ชันที่แยกขั้นตอนอย่างละเอียดดูได้จากคู่มือ Ubuntu หรือ Debian
ข้อกำหนด
ก่อนรันสคริปต์ติดตั้ง ให้แน่ใจว่าคุณมีสิ่งต่อไปนี้:
- ระบบปฏิบัติการ: เซิร์ฟเวอร์ที่ใช้ระบบปฏิบัติการลินุกซ์ (รองรับ Ubuntu 22.04+ ในปัจจุบัน)
- ทรัพยากร: 1 vCPU และ RAM 2GB
- สิทธิ์ root: สิทธิ์ผู้ดูแลระบบในการรันคำสั่ง
- ชื่อโดเมน: โดเมนที่กำหนดเองพร้อมสำหรับการตั้งค่า DNS
- IP ที่สะอาด: ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณมีที่อยู่ IP ที่สะอาด ไม่มีประวัติสแปมโดยตรวจสอบจากรายการบล็อกต่างๆ ดูข้อมูลเพิ่มเติม ที่นี่
- ที่อยู่ IP สาธารณะที่รองรับพอร์ต 25
- ความสามารถในการตั้งค่า reverse PTR
- รองรับ IPv4 และ IPv6
Tip
ดูรายชื่อผู้ให้บริการ mail server ที่ยอดเยี่ยม ของเรา
Cloud-init / User-data
ผู้ให้บริการคลาวด์ส่วนใหญ่รองรับการตั้งค่า 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. การตั้งค่าเริ่มต้น
2. ตั้งค่าการสำรองข้อมูล
3. ตั้งค่าการอัปเกรดอัตโนมัติ
4. ต่ออายุใบรับรอง
5. กู้คืนจากการสำรองข้อมูล
6. ความช่วยเหลือ
7. ออกจากระบบ
- การตั้งค่าเริ่มต้น: ดาวน์โหลดโค้ด forward email ล่าสุด กำหนดค่าสภาพแวดล้อม ถามโดเมนที่กำหนดเองของคุณ และตั้งค่าใบรับรอง กุญแจ และความลับที่จำเป็นทั้งหมด
- ตั้งค่าการสำรองข้อมูล: จะตั้งค่า cron เพื่อสำรองข้อมูล mongoDB และ redis โดยใช้ที่เก็บข้อมูลแบบเข้ากันได้กับ S3 สำหรับการจัดเก็บระยะไกลที่ปลอดภัย แยกต่างหาก sqlite จะถูกสำรองข้อมูลเมื่อเข้าสู่ระบบหากมีการเปลี่ยนแปลง เพื่อการสำรองข้อมูลที่ปลอดภัยและเข้ารหัส
- ตั้งค่าการอัปเกรด: ตั้งค่า cron เพื่อตรวจสอบการอัปเดตประจำคืนซึ่งจะสร้างและรีสตาร์ทส่วนประกอบโครงสร้างพื้นฐานอย่างปลอดภัย
- ต่ออายุใบรับรอง: ใช้ Certbot / lets encrypt สำหรับใบรับรอง SSL และกุญแจซึ่งจะหมดอายุทุก 3 เดือน การดำเนินการนี้จะต่ออายุใบรับรองสำหรับโดเมนของคุณและวางไว้ในโฟลเดอร์ที่จำเป็นสำหรับส่วนประกอบที่เกี่ยวข้องใช้งาน ดู เส้นทางไฟล์สำคัญ
- กู้คืนจากการสำรองข้อมูล: จะสั่งให้ mongodb และ redis กู้คืนจากข้อมูลสำรอง
การตั้งค่าเริ่มต้น (ตัวเลือก 1)
เลือกตัวเลือก 1. การตั้งค่าเริ่มต้น เพื่อเริ่มต้น
เมื่อเสร็จสิ้น คุณควรเห็นข้อความสำเร็จ คุณยังสามารถรัน docker ps เพื่อดู ส่วนประกอบ ที่ถูกเปิดใช้งาน ข้อมูลเพิ่มเติมเกี่ยวกับส่วนประกอบด้านล่าง
บริการ
| ชื่อบริการ | พอร์ตเริ่มต้น | คำอธิบาย |
|---|---|---|
| เว็บ | 443 |
อินเทอร์เฟซเว็บสำหรับการโต้ตอบผู้ดูแลระบบทั้งหมด |
| API | 4000 |
ชั้น API สำหรับแยกฐานข้อมูล |
| Bree | ไม่มี | งานพื้นหลังและตัวจัดการงาน |
| SMTP | 465 (แนะนำ) / 587 |
เซิร์ฟเวอร์ SMTP สำหรับอีเมลขาออก |
| SMTP Bree | ไม่มี | งานพื้นหลัง SMTP |
| MX | 2525 |
ตัวแลกเปลี่ยนอีเมลสำหรับอีเมลขาเข้าและการส่งต่ออีเมล |
| IMAP | 993/2993 |
เซิร์ฟเวอร์ IMAP สำหรับอีเมลขาเข้าและการจัดการกล่องจดหมาย |
| POP3 | 995/2995 |
เซิร์ฟเวอร์ POP3 สำหรับอีเมลขาเข้าและการจัดการกล่องจดหมาย |
| SQLite | 3456 |
เซิร์ฟเวอร์ SQLite สำหรับการโต้ตอบกับฐานข้อมูล sqlite(s) |
| SQLite Bree | ไม่มี | งานพื้นหลัง SQLite |
| CalDAV | 5000 |
เซิร์ฟเวอร์ CalDAV สำหรับการจัดการปฏิทิน |
| CardDAV | 6000 |
เซิร์ฟเวอร์ CardDAV สำหรับการจัดการปฏิทิน |
| MongoDB | 27017 |
ฐานข้อมูล MongoDB สำหรับการจัดการข้อมูลส่วนใหญ่ |
| Redis | 6379 |
Redis สำหรับแคชและการจัดการสถานะ |
| SQLite | ไม่มี | ฐานข้อมูล SQLite สำหรับกล่องจดหมายที่เข้ารหัส |
เส้นทางไฟล์สำคัญ
หมายเหตุ: เส้นทางโฮสต์ ด้านล่างสัมพันธ์กับ /root/forwardemail.net/self-hosting/
| ส่วนประกอบ | เส้นทางโฮสต์ | เส้นทางในคอนเทนเนอร์ |
|---|---|---|
| MongoDB | ./mongo-backups |
/backups |
| Redis | ./redis-data |
/data |
| Sqlite | ./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_address> | auto |
| CNAME | api | <domain_name> | auto |
| CNAME | caldav | <domain_name> | auto |
| CNAME | carddav | <domain_name> | auto |
| CNAME | fe-bounces | <domain_name> | auto |
| CNAME | imap | <domain_name> | auto |
| CNAME | mx | <domain_name> | auto |
| CNAME | pop3 | <domain_name> | auto |
| CNAME | smtp | <domain_name> | auto |
| MX | "@", ".", หรือว่าง | mx.<domain_name> (priority 0) | auto |
| TXT | "@", ".", หรือว่าง | "v=spf1 a -all" | auto |
Reverse DNS / PTR record
Reverse DNS (rDNS) หรือบันทึกตัวชี้ย้อนกลับ (PTR records) มีความสำคัญสำหรับเซิร์ฟเวอร์อีเมลเพราะช่วยยืนยันความถูกต้องของเซิร์ฟเวอร์ที่ส่งอีเมล ผู้ให้บริการคลาวด์แต่ละรายจะมีวิธีการที่แตกต่างกัน ดังนั้นคุณจะต้องค้นหาวิธีเพิ่ม "Reverse DNS" เพื่อแมปโฮสต์และ IP ให้ตรงกับชื่อโฮสต์ที่เกี่ยวข้อง โดยส่วนใหญ่จะอยู่ในส่วนเครือข่ายของผู้ให้บริการ
Port 25 ถูกบล็อก
ผู้ให้บริการอินเทอร์เน็ตและคลาวด์บางรายบล็อกพอร์ต 25 เพื่อป้องกันผู้ไม่หวังดี คุณอาจต้องส่งคำขอสนับสนุนเพื่อเปิดพอร์ต 25 สำหรับ SMTP / อีเมลขาออก
การเริ่มต้นใช้งาน
-
เปิดหน้า Landing Page ไปที่ https://<domain_name> โดยแทนที่ <domain_name> ด้วยโดเมนที่ตั้งค่าใน DNS ของคุณ คุณจะเห็นหน้า Landing Page ของ Forward Email
-
เข้าสู่ระบบและเพิ่มโดเมนของคุณ
- ลงชื่อเข้าใช้ด้วยอีเมลและรหัสผ่านที่ถูกต้อง
- ป้อนชื่อโดเมนที่คุณต้องการตั้งค่า (ต้องตรงกับการตั้งค่า DNS)
- ทำตามคำแนะนำเพื่อเพิ่มบันทึก MX และ TXT ที่จำเป็นสำหรับการยืนยัน
- เสร็จสิ้นการตั้งค่า
- เมื่อตรวจสอบเรียบร้อยแล้ว ให้เข้าไปที่หน้าสร้างนามแฝง (Aliases) เพื่อสร้างนามแฝงแรกของคุณ
- หากต้องการ สามารถตั้งค่า SMTP สำหรับอีเมลขาออก ใน การตั้งค่าโดเมน ซึ่งต้องมีบันทึก DNS เพิ่มเติม
Note
ไม่มีข้อมูลใดถูกส่งออกนอกเซิร์ฟเวอร์ของคุณ ตัวเลือกโฮสต์ด้วยตนเองและบัญชีเริ่มต้นนี้ใช้สำหรับการเข้าสู่ระบบผู้ดูแลและดูเว็บเพื่อจัดการโดเมน นามแฝง และการตั้งค่าอีเมลที่เกี่ยวข้องเท่านั้น
การทดสอบ
การสร้างนามแฝงแรกของคุณ
- ไปที่หน้าจัดการนามแฝง เปิดหน้าจัดการนามแฝง:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
- เพิ่มนามแฝงใหม่
- คลิก Add Alias (มุมขวาบน)
- ป้อนชื่อนามแฝงและปรับการตั้งค่าอีเมลตามต้องการ
- (ไม่บังคับ) เปิดใช้งานการสนับสนุน IMAP/POP3/CalDAV/CardDAV โดยเลือกช่องทำเครื่องหมาย
- คลิก Create Alias
- ตั้งรหัสผ่าน
- คลิก Generate Password เพื่อสร้างรหัสผ่านที่ปลอดภัย
- รหัสผ่านนี้จะต้องใช้สำหรับเข้าสู่ระบบไคลเอนต์อีเมลของคุณ
- ตั้งค่าไคลเอนต์อีเมลของคุณ
- ใช้ไคลเอนต์อีเมลเช่น Thunderbird
- ป้อนชื่อนามแฝงและรหัสผ่านที่สร้างขึ้น
- ตั้งค่า IMAP และ SMTP ตามที่กำหนด
การตั้งค่าเซิร์ฟเวอร์อีเมล
ชื่อผู้ใช้: <alias name>
| ประเภท | ชื่อโฮสต์ | พอร์ต | ความปลอดภัยการเชื่อมต่อ | การรับรองความถูกต้อง |
|---|---|---|---|---|
| SMTP | smtp.<domain_name> | 465 | SSL / TLS | รหัสผ่านปกติ |
| IMAP | imap.<domain_name> | 993 | SSL / TLS | รหัสผ่านปกติ |
การส่ง / รับอีเมลแรกของคุณ
เมื่อการตั้งค่าเสร็จสมบูรณ์ คุณจะสามารถส่งและรับอีเมลไปยังที่อยู่อีเมลที่สร้างและโฮสต์ด้วยตนเองได้!
การแก้ไขปัญหา
ทำไมสิ่งนี้ถึงไม่ทำงานนอก Ubuntu และ Debian
ขณะนี้เรากำลังมองหาการสนับสนุน MacOS และจะพิจารณาแพลตฟอร์มอื่น ๆ โปรดเปิด การสนทนา หรือมีส่วนร่วมหากคุณต้องการให้สนับสนุนแพลตฟอร์มอื่น ๆ
ทำไมการท้าทาย certbot acme ถึงล้มเหลว
ข้อผิดพลาดที่พบบ่อยที่สุดคือ certbot / letsencrypt บางครั้งจะร้องขอ 2 การท้าทาย คุณต้องแน่ใจว่าได้เพิ่มระเบียน 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 อัตโนมัติของ certbot โดยตั้งค่าไฟล์ /root/.cloudflare.ini ด้วยโทเค็น API ใน cloud-init / user-data ของคุณในขั้นตอนการตั้งค่า VPS ครั้งแรก หรือสร้างไฟล์นี้และรันสคริปต์อีกครั้ง ซึ่งจะจัดการการเปลี่ยนแปลง DNS และการอัปเดตการท้าทายโดยอัตโนมัติ
ชื่อผู้ใช้และรหัสผ่านสำหรับ basic auth คืออะไร
สำหรับการโฮสต์ด้วยตนเอง เราจะเพิ่มการแจ้งเตือนการยืนยันตัวตนแบบเนทีฟของเบราว์เซอร์ครั้งแรกด้วยชื่อผู้ใช้ง่าย ๆ (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 ที่ดีที่สุด
ลองดูที่ คำถามที่พบบ่อยของเรา