From 223c030eb8ca163044d2a736bec555c27774410b Mon Sep 17 00:00:00 2001 From: ssongliu Date: Mon, 12 Oct 2026 18:06:47 +0800 Subject: [PATCH] fix: improve database file handling --- agent/app/service/snapshot_recover.go | 3 ++ agent/app/service/snapshot_rollback.go | 3 ++ agent/utils/common/sqlite.go | 63 ++++++++++---------------- core/app/service/upgrade.go | 4 +- core/cmd/server/cmd/restore.go | 3 ++ core/utils/common/sqlite.go | 37 ++++++++++----- 6 files changed, 62 insertions(+), 51 deletions(-) diff --git a/agent/app/service/snapshot_recover.go b/agent/app/service/snapshot_recover.go index c283dd84b..ff4165e21 100644 --- a/agent/app/service/snapshot_recover.go +++ b/agent/app/service/snapshot_recover.go @@ -494,6 +494,9 @@ func restartCompose(composePath string, itemHelper *snapRecoverHelper) error { func recoverDBData(src string, itemHelper *snapRecoverHelper) error { itemHelper.Task.Log("---------------------- 11 / 11 ----------------------") itemHelper.Task.LogStart(i18n.GetMsgByKey("RecoverDBData")) + if err := os.Chmod(src, 0700); err != nil { + return err + } dbDir := path.Join(global.Dir.DataDir, "db") if err := os.RemoveAll(dbDir); err != nil { itemHelper.Task.LogWithStatus(i18n.GetMsgByKey("RecoverDBData"), err) diff --git a/agent/app/service/snapshot_rollback.go b/agent/app/service/snapshot_rollback.go index 5c5d6cea7..eacf422c7 100644 --- a/agent/app/service/snapshot_rollback.go +++ b/agent/app/service/snapshot_rollback.go @@ -106,6 +106,9 @@ func (u *SnapshotService) SnapshotRollback(req dto.SnapshotRecover) error { taskItem.AddSubTask( i18n.GetWithName("SnapCopy", global.Dir.BaseDir), func(t *task.Task) error { + if err := os.Chmod(path.Join(rootDir, "1panel/db"), 0700); err != nil { + return err + } return FileOp.CopyDir(path.Join(rootDir, "1panel"), global.Dir.BaseDir) }, nil, diff --git a/agent/utils/common/sqlite.go b/agent/utils/common/sqlite.go index 3c098704a..e71a2ad80 100644 --- a/agent/utils/common/sqlite.go +++ b/agent/utils/common/sqlite.go @@ -7,43 +7,20 @@ import ( "path" "time" - "github.com/1Panel-dev/1Panel/agent/global" "github.com/glebarez/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func LoadDBConnByPath(fullPath, dbName string) *gorm.DB { - if _, err := createDirWhenNotExist(true, path.Dir(fullPath)); err != nil { - panic(fmt.Errorf("init db dir failed, err: %v", err)) - } - if _, err := os.Stat(fullPath); err != nil { - f, err := os.Create(fullPath) - if err != nil { - panic(fmt.Errorf("init %s db file failed, err: %v", dbName, err)) - } - _ = f.Close() - } - db, err := GetDBWithPath(fullPath) if err != nil { - panic(err) + panic(fmt.Errorf("init %s db failed, err: %w", dbName, err)) } return db } func LoadDBConnByPathWithErr(fullPath, dbName string) (*gorm.DB, error) { - if _, err := createDirWhenNotExist(true, path.Dir(fullPath)); err != nil { - return nil, fmt.Errorf("init db dir failed, err: %v", err) - } - if _, err := os.Stat(fullPath); err != nil { - f, err := os.Create(fullPath) - if err != nil { - return nil, fmt.Errorf("init %s db file failed, err: %v", dbName, err) - } - _ = f.Close() - } - db, err := GetDBWithPath(fullPath) if err != nil { return nil, fmt.Errorf("init %s db failed, err: %v", dbName, err) @@ -60,6 +37,30 @@ func CloseDB(db *gorm.DB) { } func GetDBWithPath(dbPath string) (*gorm.DB, error) { + dbDir := path.Dir(dbPath) + if err := os.MkdirAll(dbDir, 0700); err != nil { + return nil, fmt.Errorf("init db dir failed, err: %w", err) + } + if err := os.Chmod(dbDir, 0700); err != nil { + return nil, fmt.Errorf("set db dir permissions failed, err: %w", err) + } + file, err := os.OpenFile(dbPath, os.O_CREATE|os.O_RDWR, 0600) + if err != nil { + return nil, fmt.Errorf("init db file failed, err: %w", err) + } + if err := file.Chmod(0600); err != nil { + _ = file.Close() + return nil, fmt.Errorf("set db file permissions failed, err: %w", err) + } + if err := file.Close(); err != nil { + return nil, err + } + for _, suffix := range []string{"-wal", "-shm", "-journal"} { + if err := os.Chmod(dbPath+suffix, 0600); err != nil && !os.IsNotExist(err) { + return nil, fmt.Errorf("set db sidecar permissions failed, err: %w", err) + } + } + db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, Logger: newLogger(), @@ -104,17 +105,3 @@ func newLogger() logger.Interface { }, ) } - -func createDirWhenNotExist(isDir bool, pathItem string) (string, error) { - checkPath := pathItem - if !isDir { - checkPath = path.Dir(pathItem) - } - if _, err := os.Stat(checkPath); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(checkPath, os.ModePerm); err != nil { - global.LOG.Errorf("mkdir %s failed, err: %v", checkPath, err) - return pathItem, err - } - } - return pathItem, nil -} diff --git a/core/app/service/upgrade.go b/core/app/service/upgrade.go index 6530337dc..e925baca6 100644 --- a/core/app/service/upgrade.go +++ b/core/app/service/upgrade.go @@ -495,7 +495,9 @@ func (u *UpgradeService) handleRollback(originalDir string, errStep int, svcInfo _ = settingRepo.Update("SystemStatus", "Free") dbPath := path.Join(global.CONF.Base.InstallDir, "1panel") if _, err := os.Stat(path.Join(originalDir, "db")); err == nil { - if err := files.CopyItem(true, true, path.Join(originalDir, "db"), dbPath); err != nil { + if err := os.Chmod(path.Join(originalDir, "db"), 0700); err != nil { + global.LOG.Errorf("set rollback db dir permissions failed, err: %v", err) + } else if err := files.CopyItem(true, true, path.Join(originalDir, "db"), dbPath); err != nil { global.LOG.Errorf("rollback 1panel db failed, err: %v", err) } } diff --git a/core/cmd/server/cmd/restore.go b/core/cmd/server/cmd/restore.go index c9b0c1f99..7e7ceee23 100644 --- a/core/cmd/server/cmd/restore.go +++ b/core/cmd/server/cmd/restore.go @@ -91,6 +91,9 @@ var restoreCmd = &cobra.Command{ } fmt.Println(i18n.GetMsgByKeyForCmd("RestoreStep4")) if _, err := os.Stat(path.Join(tmpPath, "db")); err == nil { + if err := os.Chmod(path.Join(tmpPath, "db"), 0700); err != nil { + return err + } dbPath := path.Join(baseDir, "1panel") targetDBDir := path.Join(dbPath, "db") if err := os.RemoveAll(targetDBDir); err != nil { diff --git a/core/utils/common/sqlite.go b/core/utils/common/sqlite.go index b6cdc4d3a..4dfa9cb5a 100644 --- a/core/utils/common/sqlite.go +++ b/core/utils/common/sqlite.go @@ -13,20 +13,9 @@ import ( ) func LoadDBConnByPath(fullPath, dbName string) *gorm.DB { - if _, err := CreateDirWhenNotExist(true, path.Dir(fullPath)); err != nil { - panic(fmt.Errorf("init db dir failed, err: %v", err)) - } - if _, err := os.Stat(fullPath); err != nil { - f, err := os.Create(fullPath) - if err != nil { - panic(fmt.Errorf("init %s db file failed, err: %v", dbName, err)) - } - _ = f.Close() - } - db, err := GetDBWithPath(fullPath) if err != nil { - panic(err) + panic(fmt.Errorf("init %s db failed, err: %w", dbName, err)) } return db } @@ -40,6 +29,30 @@ func CloseDB(db *gorm.DB) { } func GetDBWithPath(dbPath string) (*gorm.DB, error) { + dbDir := path.Dir(dbPath) + if err := os.MkdirAll(dbDir, 0700); err != nil { + return nil, fmt.Errorf("init db dir failed, err: %w", err) + } + if err := os.Chmod(dbDir, 0700); err != nil { + return nil, fmt.Errorf("set db dir permissions failed, err: %w", err) + } + file, err := os.OpenFile(dbPath, os.O_CREATE|os.O_RDWR, 0600) + if err != nil { + return nil, fmt.Errorf("init db file failed, err: %w", err) + } + if err := file.Chmod(0600); err != nil { + _ = file.Close() + return nil, fmt.Errorf("set db file permissions failed, err: %w", err) + } + if err := file.Close(); err != nil { + return nil, err + } + for _, suffix := range []string{"-wal", "-shm", "-journal"} { + if err := os.Chmod(dbPath+suffix, 0600); err != nil && !os.IsNotExist(err) { + return nil, fmt.Errorf("set db sidecar permissions failed, err: %w", err) + } + } + db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, Logger: newLogger(),