diff --git a/README_EN.md b/README_EN.md
index 901d6c2c..622f2670 100644
--- a/README_EN.md
+++ b/README_EN.md
@@ -107,7 +107,7 @@ If the Rat Panel is helpful to you, welcome to [sponsor us](https://opencollecti
- [无畏云加速](https://su.sctes.com/register?code=8st689ujpmm2p)
- [WAF PRO](https://waf.pro/)
-- [盾云CDN](http://cdn.ddunyun.com/)
+- [盾云SCDN](https://scdn.ddunyun.com/)
diff --git a/config/config.example.yml b/config/config.example.yml
index 5a27eccb..0b412587 100644
--- a/config/config.example.yml
+++ b/config/config.example.yml
@@ -11,6 +11,6 @@ http:
debug: false
port: 8888
entrance: /
- tls: false
+ tls: true
database:
debug: false
diff --git a/internal/bootstrap/app.go b/internal/bootstrap/app.go
index 7dfc194a..0f1f1dfb 100644
--- a/internal/bootstrap/app.go
+++ b/internal/bootstrap/app.go
@@ -21,7 +21,7 @@ func BootWeb() {
initSession()
initCron()
initQueue()
- go initHttp()
+ initHttp()
select {}
}
diff --git a/internal/bootstrap/conf.go b/internal/bootstrap/conf.go
index cca55b2c..c21f261a 100644
--- a/internal/bootstrap/conf.go
+++ b/internal/bootstrap/conf.go
@@ -1,7 +1,7 @@
package bootstrap
import (
- "fmt"
+ "log"
"os"
"path/filepath"
"strings"
@@ -17,22 +17,22 @@ import (
func initConf() {
executable, err := os.Executable()
if err != nil {
- panic(fmt.Sprintf("failed to get executable: %v", err))
+ log.Fatalf("failed to get executable: %v", err)
}
res, err := filepath.EvalSymlinks(filepath.Dir(executable))
if err != nil {
- panic(fmt.Sprintf("failed to get executable path: %v", err))
+ log.Fatalf("failed to get executable path: %v", err)
}
if isTesting() || isAir() || isDirectlyRun() {
res, err = os.Getwd()
if err != nil {
- panic(fmt.Sprintf("failed to get working directory: %v", err))
+ log.Fatalf("failed to get working directory: %v", err)
}
}
app.Conf = koanf.New(".")
if err = app.Conf.Load(file.Provider(filepath.Join(res, "config/config.yml")), yaml.Parser()); err != nil {
- panic(fmt.Sprintf("failed to load config: %v", err))
+ log.Fatalf("failed to load config: %v", err)
}
}
@@ -44,7 +44,7 @@ func initGlobal() {
// 初始化时区
loc, err := time.LoadLocation(app.Conf.MustString("app.timezone"))
if err != nil {
- panic(fmt.Sprintf("failed to load timezone: %v", err))
+ log.Fatalf("failed to load timezone: %v", err)
}
time.Local = loc
}
diff --git a/internal/bootstrap/cron.go b/internal/bootstrap/cron.go
index 3451f138..7b31d306 100644
--- a/internal/bootstrap/cron.go
+++ b/internal/bootstrap/cron.go
@@ -1,7 +1,7 @@
package bootstrap
import (
- "fmt"
+ "log"
"github.com/robfig/cron/v3"
@@ -22,7 +22,7 @@ func initCron() {
app.Cron = c
if err := job.Boot(app.Cron); err != nil {
- panic(fmt.Sprintf("failed to boot cron jobs: %v", err))
+ log.Fatalf("failed to boot cron jobs: %v", err)
}
c.Start()
diff --git a/internal/bootstrap/db.go b/internal/bootstrap/db.go
index dc180799..fb98852e 100644
--- a/internal/bootstrap/db.go
+++ b/internal/bootstrap/db.go
@@ -1,7 +1,7 @@
package bootstrap
import (
- "fmt"
+ "log"
"path/filepath"
"github.com/glebarez/sqlite"
@@ -29,7 +29,7 @@ func initOrm() {
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
- panic(fmt.Sprintf("failed to connect database: %v", err))
+ log.Fatalf("failed to connect database: %v", err)
}
app.Orm = db
}
@@ -40,6 +40,6 @@ func runMigrate() {
ValidateUnknownMigrations: true,
}, migration.Migrations)
if err := migrator.Migrate(); err != nil {
- panic(fmt.Sprintf("failed to migrate database: %v", err))
+ log.Fatalf("failed to migrate database: %v", err)
}
}
diff --git a/internal/bootstrap/http.go b/internal/bootstrap/http.go
index 02d74036..8de54bf4 100644
--- a/internal/bootstrap/http.go
+++ b/internal/bootstrap/http.go
@@ -1,8 +1,11 @@
package bootstrap
import (
+ "crypto/tls"
"fmt"
+ "log"
"net/http"
+ "path/filepath"
"github.com/go-chi/chi/v5"
@@ -22,12 +25,29 @@ func initHttp() {
route.Http(app.Http)
apps.Boot(app.Http)
- server := &http.Server{
+ srv := &http.Server{
Addr: fmt.Sprintf(":%d", app.Conf.MustInt("http.port")),
Handler: http.AllowQuerySemicolons(app.Http),
MaxHeaderBytes: 2048 << 20,
}
- if err := server.ListenAndServe(); err != nil {
- panic(fmt.Sprintf("failed to start http server: %v", err))
+
+ if app.Conf.Bool("http.tls") {
+ srv.TLSConfig = &tls.Config{
+ MinVersion: tls.VersionTLS12,
+ }
+
+ cert := filepath.Join(app.Root, "panel/storage/cert.pem")
+ key := filepath.Join(app.Root, "panel/storage/cert.key")
+ go func() {
+ if err := srv.ListenAndServeTLS(cert, key); err != nil {
+ log.Fatalf("failed to start https server: %v", err)
+ }
+ }()
+ } else {
+ go func() {
+ if err := srv.ListenAndServe(); err != nil {
+ log.Fatalf("failed to start http server: %v", err)
+ }
+ }()
}
}
diff --git a/internal/bootstrap/session.go b/internal/bootstrap/session.go
index aeeb8416..9d5933dc 100644
--- a/internal/bootstrap/session.go
+++ b/internal/bootstrap/session.go
@@ -1,7 +1,7 @@
package bootstrap
import (
- "fmt"
+ "log"
"github.com/go-rat/gormstore"
"github.com/go-rat/sessions"
@@ -18,13 +18,13 @@ func initSession() {
DisableDefaultDriver: true,
})
if err != nil {
- panic(fmt.Sprintf("failed to initialize session manager: %v", err))
+ log.Fatalf("failed to initialize session manager: %v", err)
}
// extend gorm store driver
store := gormstore.New(app.Orm)
if err = manager.Extend("default", store); err != nil {
- panic(fmt.Sprintf("failed to extend session manager: %v", err))
+ log.Fatalf("failed to extend session manager: %v", err)
}
app.Session = manager
diff --git a/internal/bootstrap/validator.go b/internal/bootstrap/validator.go
index 2427fb1c..c1efa244 100644
--- a/internal/bootstrap/validator.go
+++ b/internal/bootstrap/validator.go
@@ -1,7 +1,7 @@
package bootstrap
import (
- "fmt"
+ "log"
"github.com/go-playground/locales/zh_Hans_CN"
ut "github.com/go-playground/universal-translator"
@@ -18,7 +18,7 @@ func initValidator() {
validate := validator.New(validator.WithRequiredStructEnabled())
if err := zh.RegisterDefaultTranslations(validate, trans); err != nil {
- panic(fmt.Sprintf("failed to register validator translations: %v", err))
+ log.Fatalf("failed to register validator translations: %v", err)
}
app.Translator = &trans
diff --git a/internal/http/middleware/throttle.go b/internal/http/middleware/throttle.go
index 01f4cf1a..8c6f29ed 100644
--- a/internal/http/middleware/throttle.go
+++ b/internal/http/middleware/throttle.go
@@ -1,7 +1,7 @@
package middleware
import (
- "fmt"
+ "log"
"net/http"
"time"
@@ -16,12 +16,12 @@ func Throttle(tokens uint64, interval time.Duration) func(next http.Handler) htt
Interval: interval,
})
if err != nil {
- panic(fmt.Sprintf("failed to create throttle memorystore: %v", err))
+ log.Fatalf("failed to create throttle memorystore: %v", err)
}
limiter, err := httplimit.NewMiddleware(store, httplimit.IPKeyFunc())
if err != nil {
- panic(fmt.Sprintf("failed to initialize throttle middleware: %v", err))
+ log.Fatalf("failed to initialize throttle middleware: %v", err)
}
return limiter.Handle
diff --git a/internal/service/cli.go b/internal/service/cli.go
index 91945174..51fef8f4 100644
--- a/internal/service/cli.go
+++ b/internal/service/cli.go
@@ -70,8 +70,7 @@ func (s *CliService) Info(ctx context.Context, cmd *cli.Command) error {
user.Email = str.RandomString(8) + "@example.com"
}
- err = app.Orm.Save(user).Error
- if err != nil {
+ if err = app.Orm.Save(user).Error; err != nil {
return fmt.Errorf("管理员信息保存失败:%v", err)
}
diff --git a/pkg/api/api.go b/pkg/api/api.go
index b64916d5..7b21a756 100644
--- a/pkg/api/api.go
+++ b/pkg/api/api.go
@@ -2,6 +2,7 @@ package api
import (
"fmt"
+ "log"
"time"
"github.com/go-resty/resty/v2"
@@ -30,7 +31,7 @@ func NewAPI(panelVersion string, url ...string) *API {
hostInfo, err := host.Info()
if err != nil {
- panic(fmt.Sprintf("failed to get host info: %v", err))
+ log.Fatalf("failed to get host info: %v", err)
}
client := resty.New()
diff --git a/pkg/apploader/apploader.go b/pkg/apploader/apploader.go
index fed6d5f3..275ba4eb 100644
--- a/pkg/apploader/apploader.go
+++ b/pkg/apploader/apploader.go
@@ -3,6 +3,7 @@ package apploader
import (
"fmt"
+ "log"
"sync"
"github.com/go-chi/chi/v5"
@@ -14,7 +15,7 @@ var apps sync.Map
func Register(app *types.App) {
if _, ok := apps.Load(app.Slug); ok {
- panic(fmt.Sprintf("app %s already exists", app.Slug))
+ log.Fatalf("app %s already exists", app.Slug)
}
apps.Store(app.Slug, app)
}
diff --git a/pkg/str/string.go b/pkg/str/string.go
index fa596ea0..6842af05 100644
--- a/pkg/str/string.go
+++ b/pkg/str/string.go
@@ -5,6 +5,7 @@ import (
"crypto/rand"
"fmt"
"io"
+ "log"
"strings"
"text/template"
"unicode/utf8"
@@ -24,7 +25,7 @@ func RandomNumber(length int) string {
b := make([]byte, length)
n, err := io.ReadAtLeast(rand.Reader, b, length)
if n != length {
- panic(fmt.Sprintf("failed to generate random number: %v", err))
+ log.Panicf("failed to generate random number: %v", err)
}
for i := 0; i < len(b); i++ {
b[i] = table[int(b[i])%len(table)]
@@ -37,7 +38,7 @@ func RandomString(length int) string {
b := make([]byte, length)
_, err := rand.Read(b)
if err != nil {
- panic(fmt.Sprintf("failed to generate random string: %v", err))
+ log.Panicf("failed to generate random string: %v", err)
}
letters := "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i, v := range b {