一阶段ok
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"mail_go/config"
|
||||
"mail_go/internal/db"
|
||||
"mail_go/internal/imap_server"
|
||||
"mail_go/internal/pop3_server"
|
||||
"mail_go/internal/smtp_server"
|
||||
"mail_go/internal/storage"
|
||||
"mail_go/internal/store"
|
||||
"mail_go/internal/web"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 1. Load configuration
|
||||
cfg, err := config.LoadConfig()
|
||||
if err != nil {
|
||||
log.Fatalf("加载配置失败: %v", err)
|
||||
}
|
||||
fmt.Println("配置加载成功")
|
||||
|
||||
// 2. Initialize database
|
||||
database, err := db.InitDB(cfg.Database, cfg.Storage)
|
||||
if err != nil {
|
||||
log.Fatalf("数据库初始化失败: %v", err)
|
||||
}
|
||||
fmt.Println("数据库初始化成功")
|
||||
|
||||
// 3. Create Store layer
|
||||
stores := store.NewStores(database)
|
||||
|
||||
// 4. Ensure default admin user exists
|
||||
ensureAdminUser(stores, cfg)
|
||||
|
||||
// 5. Initialize attachment storage
|
||||
attStorage := storage.NewAttachmentStorage(cfg.Storage.AttachDir)
|
||||
|
||||
// 6. Start SMTP server
|
||||
smtpSrv := smtp_server.NewSMTPServer(cfg.SMTP, stores, attStorage)
|
||||
go func() {
|
||||
if err := smtpSrv.Start(); err != nil {
|
||||
log.Printf("SMTP 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
// Start SMTPS if TLS is configured
|
||||
if cfg.SMTP.TLSCert != "" && cfg.SMTP.TLSKey != "" {
|
||||
go func() {
|
||||
if err := smtpSrv.StartTLS(); err != nil {
|
||||
log.Printf("SMTPS 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// 7. Start IMAP server
|
||||
imapSrv := imap_server.NewIMAPServer(cfg.IMAP, stores)
|
||||
go func() {
|
||||
if err := imapSrv.Start(); err != nil {
|
||||
log.Printf("IMAP 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
// Start IMAPS if TLS is configured
|
||||
if cfg.IMAP.TLSCert != "" && cfg.IMAP.TLSKey != "" {
|
||||
go func() {
|
||||
if err := imapSrv.StartTLS(); err != nil {
|
||||
log.Printf("IMAPS 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// 8. Start POP3 server
|
||||
pop3Srv := pop3_server.NewPOP3Server(cfg.POP3, stores)
|
||||
go func() {
|
||||
if err := pop3Srv.Start(); err != nil {
|
||||
log.Printf("POP3 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
// Start POP3S if TLS is configured
|
||||
if cfg.POP3.TLSCert != "" && cfg.POP3.TLSKey != "" {
|
||||
go func() {
|
||||
if err := pop3Srv.StartTLS(); err != nil {
|
||||
log.Printf("POP3S 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// 9. Start Web server
|
||||
webServer := web.NewWebServer(cfg.Web, stores, attStorage)
|
||||
fmt.Printf("Web 服务启动在 %s\n", cfg.Web.Addr)
|
||||
go func() {
|
||||
if err := webServer.Start(); err != nil {
|
||||
log.Fatalf("Web 服务启动失败: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
fmt.Println("MailGo 邮件系统启动完成")
|
||||
select {} // Block main goroutine
|
||||
}
|
||||
|
||||
// ensureAdminUser checks if an admin user exists and creates one if not.
|
||||
// It also ensures the default domain "example.com" exists.
|
||||
func ensureAdminUser(stores *store.Stores, cfg *config.Config) {
|
||||
// Check if admin user exists by trying to authenticate
|
||||
_, err := stores.Users.GetByEmail("admin@example.com")
|
||||
if err == nil {
|
||||
fmt.Println("管理员账户已存在,跳过创建")
|
||||
return
|
||||
}
|
||||
|
||||
// Ensure the default domain exists
|
||||
domain, err := stores.Domains.GetByName("example.com")
|
||||
if err != nil {
|
||||
// Domain doesn't exist, create it
|
||||
domain = &db.Domain{
|
||||
Name: "example.com",
|
||||
SmtpPort: 25,
|
||||
ImapPort: 143,
|
||||
Pop3Port: 110,
|
||||
TlsEnabled: false,
|
||||
}
|
||||
if createErr := stores.Domains.Create(domain); createErr != nil {
|
||||
log.Printf("创建默认域名失败: %v", createErr)
|
||||
return
|
||||
}
|
||||
fmt.Println("默认域名 example.com 创建成功")
|
||||
}
|
||||
|
||||
// Hash the default admin password
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte("admin"), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
log.Printf("密码哈希失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Create the admin user
|
||||
adminUser := &db.User{
|
||||
Username: "admin",
|
||||
PasswordHash: string(hashedPassword),
|
||||
DomainID: domain.ID,
|
||||
QuotaBytes: 5 * 1024 * 1024 * 1024, // 5GB
|
||||
UsedBytes: 0,
|
||||
IsActive: true,
|
||||
IsAdmin: true,
|
||||
}
|
||||
|
||||
if createErr := stores.Users.Create(adminUser); createErr != nil {
|
||||
log.Printf("创建管理员账户失败: %v", createErr)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("管理员账户 admin@example.com 创建成功(密码: admin)")
|
||||
}
|
||||
Reference in New Issue
Block a user