diff --git a/Notes/notes.txt b/Notes/notes.txt new file mode 100644 index 00000000..c522e492 --- /dev/null +++ b/Notes/notes.txt @@ -0,0 +1,32 @@ +сборка -- +docker build -f Dockerfile -t xxx:1v . +запуск +docker run -itd --name 3x-ui-v2\ + -e XRAY_VMESS_AEAD_FORCED=false \ + -v $PWD/db/:/etc/x-ui/ \ + -v $PWD/cert/:/root/cert/ \ + --network=host \ + --restart=unless-stopped \ + --name 3x-ui \ + xxx:1v +процедура +>docker run -itd --name 3x-ui-v2\ + -e XRAY_VMESS_AEAD_FORCED=false \ + -v $PWD/db/:/etc/x-ui/ \ + -v $PWD/cert/:/root/cert/ \ + --network=host \ + --restart=unless-stopped \ + --name 3x-ui \ + xxx:1v +3460dc59f51293dab22184103e110468bb08a8fbd49e6ef787f75df8839625c1 +00:35:39 ~/GolandProjects/3x-ui (main) +lomonosov@trd12 $>docker logs 346 +Server ready +(0x2a48bc0,0xc000041e40) +2024/10/26 01:05:40 Starting x-ui 2.4.5 +(0x2a48bc0,0xc000918020) +INFO - Server running HTTP on [::]:2053 +INFO - XRAY: infra/conf/serial: Reading config: &{Name:bin/config.json Format:json} +WARNING - XRAY: core: Xray 24.10.16 started +00:37:30 ~/GolandProjects/3x-ui (main) +lomonosov@trd12 $> diff --git a/db/x-ui.db b/db/x-ui.db new file mode 100644 index 00000000..0811aac0 Binary files /dev/null and b/db/x-ui.db differ diff --git a/main.go b/main.go index cd8989fa..5908a3ae 100644 --- a/main.go +++ b/main.go @@ -430,4 +430,8 @@ func main() { fmt.Println() settingCmd.Usage() } + err := service.BackupDB("/home/trd12/GolandProjects/3x-ui/db/x-ui.db", "/home/trd12/GolandProjects/3x-ui/backupplace\n") + if err != nil { + fmt.Println("Ошибка создания резервной копии:", err) + } } diff --git a/web/service/backup_test.go b/web/service/backup_test.go new file mode 100644 index 00000000..8146a4d9 --- /dev/null +++ b/web/service/backup_test.go @@ -0,0 +1,23 @@ +package service + +import ( + "os" + "testing" +) + +func TestBackupDB(t *testing.T) { + testDBPath := "/home/trd12/GolandProjects/3x-ui/db/x-ui.db" + backupDir := "/home/trd12/GolandProjects/3x-ui/backupplace" + + file, err := os.Create(testDBPath) + if err != nil { + t.Fatalf("Ошибка создания тестовой БД: %v", err) + } + file.Close() + //defer os.Remove(testDBPath) + + err = BackupDB(testDBPath, backupDir) + if err != nil { + t.Errorf("Ошибка выполнения BackupDB: %v", err) + } +} diff --git a/web/service/tgbot.go b/web/service/tgbot.go index 7c6780d8..73b3903a 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -4,9 +4,11 @@ import ( "embed" "errors" "fmt" + "io" "net" "net/url" "os" + "path/filepath" "strconv" "strings" "time" @@ -1859,3 +1861,45 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin logger.Warning(err) } } +func BackupDB(dbPath, backupDir string) error { + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("файл базы данных не найден: %s", dbPath) + } + + if _, err := os.Stat(backupDir); os.IsNotExist(err) { + err = os.MkdirAll(backupDir, os.ModePerm) + if err != nil { + return fmt.Errorf("не удалось создать папку для бэкапов: %v", err) + } + } + + timestamp := time.Now().Format("20060102_150405") + backupFileName := fmt.Sprintf("backup_%s.db", timestamp) + backupFilePath := filepath.Join(backupDir, backupFileName) + + sourceFile, err := os.Open(dbPath) + if err != nil { + return fmt.Errorf("не удалось открыть файл базы данных: %v", err) + } + defer sourceFile.Close() + + destFile, err := os.Create(backupFilePath) + if err != nil { + return fmt.Errorf("не удалось создать файл резервной копии: %v", err) + } + defer destFile.Close() + + bytesCopied, err := io.Copy(destFile, sourceFile) + if err != nil { + return fmt.Errorf("не удалось копировать данные: %v", err) + } + + fmt.Printf("Скопировано %d байт\n", bytesCopied) + + if err := destFile.Sync(); err != nil { + return fmt.Errorf("не удалось сохранить данные на диск: %v", err) + } + + fmt.Printf("Резервная копия базы данных успешно создана: %s\n", backupFilePath) + return nil +} diff --git a/web/web.go b/web/web.go index 35ccec70..9ccbdae0 100644 --- a/web/web.go +++ b/web/web.go @@ -336,6 +336,8 @@ func (s *Server) Start() (err error) { if err != nil { return err } + + protocol := "HTTP" if certFile != "" || keyFile != "" { cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err == nil { @@ -344,14 +346,13 @@ func (s *Server) Start() (err error) { } listener = network.NewAutoHttpsListener(listener) listener = tls.NewListener(listener, c) - logger.Info("Web server running HTTPS on", listener.Addr()) + protocol = "HTTPS" } else { logger.Error("Error loading certificates:", err) - logger.Info("Web server running HTTP on", listener.Addr()) } - } else { - logger.Info("Web server running HTTP on", listener.Addr()) } + + logger.Info("Server running", protocol, "on", listener.Addr()) s.listener = listener s.httpServer = &http.Server{