From 331d493346e765cfbb982483b1ee03067ae6099f Mon Sep 17 00:00:00 2001 From: Danila Manakov Date: Sat, 9 Nov 2024 17:25:11 +0300 Subject: [PATCH] v4 save copy --- Notes/notes.txt | 32 +++++++++++++++++++++++++++ db/x-ui.db | Bin 0 -> 49152 bytes main.go | 4 ++++ web/service/backup_test.go | 23 +++++++++++++++++++ web/service/tgbot.go | 44 +++++++++++++++++++++++++++++++++++++ web/web.go | 9 ++++---- 6 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 Notes/notes.txt create mode 100644 db/x-ui.db create mode 100644 web/service/backup_test.go 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 0000000000000000000000000000000000000000..0811aac0f43aa9a81dcbe9e88c6075510c1f53bc GIT binary patch literal 49152 zcmeI*&u-#I90%|*B>W9^FIy{$B3bPvG^i9syHXD;l~AXPmXHmBRykn@2IK-ZvB%x) zs)r`4eV3K`9{T{*zClmTrBV-j?%3GG#zAV76WOm7Ff;x)^ZCt;;}|(7#|@oPd0<)- zjmdlDb0P@jds!xgyyveC{tBiP|F9M$_*@8mUiR@l`R4U`LEIww%sV1F;#Y;yXV)8F z7IyM~7p$Z@)A^oDYTtZmgp%}Ps#~wROrP-0 z{lk}3W-^U$K2KZJrfi;;e^3spokm;!wp2T6p0r!ldb2I7gHhKnoZa>7XETl2s(f(N zQtCf8z3T9a-qfHdx0C~=r8H~Gi5x7jRS%;W*|}rr!A=9=u3yPcvwqxBxZo^ZEI!Sr zq~l$I=tiGj*ym&Z+hkXBnCYcsd#NnMV&k%xNlTTAaCPp*H7KsXnm)DTIoW7*<15@D z!2WR}5#$H;gBb>QP2z_ND!8Z<*>AB}%ci8CE6b2>*=;4Bmvho-X?t6^eCkQ@Ho|mc zXb1C5R3*s1gT;ux3L5dR+SuVu)NRqltK@oGDwl;fkG4|QqhvcmfxXB zOdAG83iYc{mx%VT@PcTs3N2X-YOH)+@2K;J?xu>xYAPjl%F7}c-$x~umA?8d=>_oZ z^KerS8o0d{W%C;VZ;JnWv~p}}MTe>oT5K?i0+m#Yw_$4(aK{I^TgR@kZZpbT9`?A8dD z*HTh#dszhMn+844UgxLWjCKZ*EJ z{F~1(K>z{}fB*y_009U<00Izz00bbg5(1Bs$+8gp_DLe2NN#6?uUce;q?Gl(UEp5- z^Dq5lf&c^{009U<00Izz00bZa0SG|g0Sn~Zy5ai&0Y?~Bg8&2|009U<00Izz00bZa z0SFM{-v3XCe-ZIt{)Pzx5P$##AOHafKmY;|fB*y_0D)B%C?ry3E0f8b@nlW=X_x^uEye8tc_;FP$h;l;!0uX=z1Rwwb2tWV=5P$##AP@-TlUsuSCxApY zxtX0^|IeQP|AB}fg7q+m00bZa0SG_<0uX=z1Rwwb2tZ&J1ilv5$mZef-~3t6_LS4J z{e5NcyINydsan&)liKT}L8JdnaUTEl3!eYC3K2yaApijgKmY;|fB*y_009U<00Q?D z!1Mp^=ZCE!009U<00Izz00bZa0SG_<0;?c^`~RyDC6o~Y5P$##AOHafKmY;|fB*y_ ia6bXu|G%FfwuS%%AOHafKmY;|fB*y_009WBg1~=X;o8pt literal 0 HcmV?d00001 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{