diff --git a/cmd/root.go b/cmd/root.go index b6e2bc1..eea0f59 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -34,14 +34,15 @@ Documentation: os.Exit(1) } if err := storage.InitDB(); err != nil { - logger.Log().Error(err.Error()) + logger.Log().Fatal(err.Error()) os.Exit(1) } go server.Listen() if err := smtpd.Listen(); err != nil { - logger.Log().Error(err.Error()) + storage.Close() + logger.Log().Fatal(err.Error()) os.Exit(1) } }, diff --git a/internal/storage/database.go b/internal/storage/database.go index 699aff9..71db412 100644 --- a/internal/storage/database.go +++ b/internal/storage/database.go @@ -127,14 +127,20 @@ func tenant(table string) string { return fmt.Sprintf("%s%s", config.TenantID, table) } -// Close will close the database, and delete if a temporary table +// Close will close the database, and delete if temporary func Close() { + // on a fatal exit (eg: ports blocked), allow Mailpit to run migration tasks before closing the DB + time.Sleep(200 * time.Millisecond) + if db != nil { if err := db.Close(); err != nil { logger.Log().Warn("[db] error closing database, ignoring") } } + // allow SQLite to finish closing DB & write WAL logs if local + time.Sleep(100 * time.Millisecond) + if dbIsTemp && isFile(dbFile) { logger.Log().Debugf("[db] deleting temporary file %s", dbFile) if err := os.Remove(dbFile); err != nil { diff --git a/server/server.go b/server/server.go index 0471395..60efd8f 100644 --- a/server/server.go +++ b/server/server.go @@ -105,11 +105,19 @@ func Listen() { } if config.UITLSCert != "" && config.UITLSKey != "" { + if err := server.ListenAndServeTLS(config.UITLSCert, config.UITLSKey); err != nil { + storage.Close() + logger.Log().Fatal(err) + } + logger.Log().Infof("[http] accessible via https://%s%s", logger.CleanHTTPIP(config.HTTPListen), config.Webroot) - logger.Log().Fatal(server.ListenAndServeTLS(config.UITLSCert, config.UITLSKey)) } else { + if err := server.ListenAndServe(); err != nil { + storage.Close() + logger.Log().Fatal(err) + } + logger.Log().Infof("[http] accessible via http://%s%s", logger.CleanHTTPIP(config.HTTPListen), config.Webroot) - logger.Log().Fatal(server.ListenAndServe()) } }