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()
|
fmt.Println()
|
||||||
settingCmd.Usage()
|
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"
|
"embed"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -1859,3 +1861,45 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
|
||||||
logger.Warning(err)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protocol := "HTTP"
|
||||||
if certFile != "" || keyFile != "" {
|
if certFile != "" || keyFile != "" {
|
||||||
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -344,14 +346,13 @@ func (s *Server) Start() (err error) {
|
||||||
}
|
}
|
||||||
listener = network.NewAutoHttpsListener(listener)
|
listener = network.NewAutoHttpsListener(listener)
|
||||||
listener = tls.NewListener(listener, c)
|
listener = tls.NewListener(listener, c)
|
||||||
logger.Info("Web server running HTTPS on", listener.Addr())
|
protocol = "HTTPS"
|
||||||
} else {
|
} else {
|
||||||
logger.Error("Error loading certificates:", err)
|
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.listener = listener
|
||||||
|
|
||||||
s.httpServer = &http.Server{
|
s.httpServer = &http.Server{
|
||||||
|
|
Loading…
Reference in a new issue