mirror of
				https://github.com/MHSanaei/3x-ui.git
				synced 2025-11-04 06:12:52 +00:00 
			
		
		
		
	Add database migration
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
This commit is contained in:
		
							parent
							
								
									2b460bac1a
								
							
						
					
					
						commit
						262e3c0985
					
				
					 4 changed files with 62 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -70,6 +70,7 @@ install_base() {
 | 
			
		|||
 | 
			
		||||
#This function will be called when user installed x-ui out of sercurity
 | 
			
		||||
config_after_install() {
 | 
			
		||||
    /usr/local/x-ui/x-ui migrate
 | 
			
		||||
    echo -e "${yellow}Install/update finished! For security it's recommended to modify panel settings ${plain}"
 | 
			
		||||
    read -p "Do you want to continue with the modification [y/n]? ": config_confirm
 | 
			
		||||
    if [[ x"${config_confirm}" == x"y" || x"${config_confirm}" == x"Y" ]]; then
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								main.go
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -204,6 +204,19 @@ func updateSetting(port int, username string, password string) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateDb() {
 | 
			
		||||
	inboundService := service.InboundService{}
 | 
			
		||||
 | 
			
		||||
	err := database.InitDB(config.GetDBPath())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("Start migrating database...")
 | 
			
		||||
	inboundService.MigrationRequirements()
 | 
			
		||||
	inboundService.RemoveOrphanedTraffics()
 | 
			
		||||
	fmt.Println("Migration done!")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func removeSecret() {
 | 
			
		||||
	err := database.InitDB(config.GetDBPath())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -265,6 +278,7 @@ func main() {
 | 
			
		|||
		fmt.Println("Commands:")
 | 
			
		||||
		fmt.Println("    run            run web panel")
 | 
			
		||||
		fmt.Println("    v2-ui          migrate form v2-ui")
 | 
			
		||||
		fmt.Println("    migrate        migrate form other/old x-ui")
 | 
			
		||||
		fmt.Println("    setting        set settings")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -282,6 +296,8 @@ func main() {
 | 
			
		|||
			return
 | 
			
		||||
		}
 | 
			
		||||
		runWebServer()
 | 
			
		||||
	case "migrate":
 | 
			
		||||
		migrateDb()
 | 
			
		||||
	case "v2-ui":
 | 
			
		||||
		err := v2uiCmd.Parse(os.Args[2:])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -528,14 +528,17 @@ func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.Cl
 | 
			
		|||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				inbounds[inbound_index].Settings = string(modifiedSettings)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		err = tx.Save(inbounds).Error
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logger.Warning("AddClientTraffic update inbounds ", err)
 | 
			
		||||
			logger.Error(inbounds)
 | 
			
		||||
		}	
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dbClientTraffics, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -778,3 +781,43 @@ func (s *InboundService) SearchInbounds(query string) ([]*model.Inbound, error)
 | 
			
		|||
	}
 | 
			
		||||
	return inbounds, nil
 | 
			
		||||
}
 | 
			
		||||
func (s *InboundService) MigrationRequirements() {
 | 
			
		||||
	db := database.GetDB()
 | 
			
		||||
	var inbounds []*model.Inbound
 | 
			
		||||
	err := db.Model(model.Inbound{}).Where("protocol IN (?)", []string{"vmess", "vless", "trojan"}).Find(&inbounds).Error
 | 
			
		||||
	if err != nil && err != gorm.ErrRecordNotFound {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for inbound_index := range inbounds {
 | 
			
		||||
		settings := map[string]interface{}{}
 | 
			
		||||
		json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings)
 | 
			
		||||
		clients, ok := settings["clients"].([]interface{})
 | 
			
		||||
		if ok {
 | 
			
		||||
			var newClients []interface{}
 | 
			
		||||
			for client_index := range clients {
 | 
			
		||||
				c := clients[client_index].(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
				// Add email='' if it is not exists
 | 
			
		||||
				if _, ok := c["email"]; !ok {
 | 
			
		||||
					c["email"] = ""
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Remove "flow": "xtls-rprx-direct"
 | 
			
		||||
				if _, ok := c["flow"]; ok {
 | 
			
		||||
					if c["flow"] == "xtls-rprx-direct" {
 | 
			
		||||
						c["flow"] = ""
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				newClients = append(newClients, interface{}(c))
 | 
			
		||||
			}
 | 
			
		||||
			settings["clients"] = newClients
 | 
			
		||||
			modifiedSettings, err := json.MarshalIndent(settings, "", "  ")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			inbounds[inbound_index].Settings = string(modifiedSettings)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	db.Save(inbounds)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,7 +69,6 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	s.inboundService.DisableInvalidClients()
 | 
			
		||||
	s.inboundService.RemoveOrphanedTraffics()
 | 
			
		||||
 | 
			
		||||
	inbounds, err := s.inboundService.GetAllInbounds()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +123,7 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) {
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			settings["clients"] = final_clients
 | 
			
		||||
			modifiedSettings, err := json.Marshal(settings)
 | 
			
		||||
			modifiedSettings, err := json.MarshalIndent(settings, "", "  ")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue