mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-11 04:36:20 +00:00
v4 save copy
This commit is contained in:
parent
49ddd5fe13
commit
331d493346
6 changed files with 108 additions and 4 deletions
32
Notes/notes.txt
Normal file
32
Notes/notes.txt
Normal file
|
@ -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 $>
|
BIN
db/x-ui.db
Normal file
BIN
db/x-ui.db
Normal file
Binary file not shown.
4
main.go
4
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)
|
||||
}
|
||||
}
|
||||
|
|
23
web/service/backup_test.go
Normal file
23
web/service/backup_test.go
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
|
Loading…
Reference in a new issue