main.go raw

   1  package main
   2  
   3  import (
   4  	"flag"
   5  	"os"
   6  	"strconv"
   7  
   8  	"github.com/sirupsen/logrus"
   9  	"gorm.io/gorm"
  10  
  11  	"github.com/getAlby/hub/db"
  12  	"github.com/getAlby/hub/logger"
  13  )
  14  
  15  func main() {
  16  	var fromDSN, toDSN string
  17  
  18  	logger.Init(strconv.Itoa(int(logrus.DebugLevel)))
  19  
  20  	flag.StringVar(&fromDSN, "from", "", "source DSN")
  21  	flag.StringVar(&toDSN, "to", "", "destination DSN")
  22  
  23  	flag.Parse()
  24  
  25  	if fromDSN == "" || toDSN == "" {
  26  		flag.Usage()
  27  		logger.Logger.Error("missing DSN")
  28  		os.Exit(1)
  29  	}
  30  
  31  	stopDB := func(d *gorm.DB) {
  32  		if err := db.Stop(d); err != nil {
  33  			logger.Logger.WithError(err).Error("failed to close database")
  34  		}
  35  	}
  36  
  37  	logger.Logger.Info("opening source DB...")
  38  	fromDB, err := db.NewDB(fromDSN, false)
  39  	if err != nil {
  40  		logger.Logger.WithError(err).Error("failed to open source database")
  41  		os.Exit(1)
  42  	}
  43  	defer stopDB(fromDB)
  44  
  45  	logger.Logger.Info("opening destination DB...")
  46  	toDB, err := db.NewDB(toDSN, false)
  47  	if err != nil {
  48  		logger.Logger.WithError(err).Error("failed to open destination database")
  49  		os.Exit(1)
  50  	}
  51  	defer stopDB(toDB)
  52  
  53  	// When migrating to Postgres (e.g. a cloud deployment) the node data must
  54  	// be stored in VSS, since only the database is migrated by this tool.
  55  	if toDB.Dialector.Name() == "postgres" {
  56  		var vssConfig db.UserConfig
  57  		result := fromDB.Where("key = ?", "LdkVssEnabled").First(&vssConfig)
  58  		if result.Error != nil {
  59  			if result.Error == gorm.ErrRecordNotFound {
  60  				logger.Logger.Error("LdkVssEnabled config not found in source DB. Migration will not proceed.")
  61  			} else {
  62  				logger.Logger.WithError(result.Error).Error("failed to query LdkVssEnabled config from source DB")
  63  			}
  64  			os.Exit(1)
  65  		}
  66  
  67  		if vssConfig.Value != "true" {
  68  			logger.Logger.Error("VSS is not enabled in the source DB (LdkVssEnabled is not 'true'). Migration will not proceed.")
  69  			os.Exit(1)
  70  		}
  71  		logger.Logger.Info("LdkVssEnabled check passed.")
  72  	}
  73  
  74  	logger.Logger.Info("migrating...")
  75  	err = db.MigrateDB(fromDB, toDB)
  76  	if err != nil {
  77  		logger.Logger.WithError(err).Error("failed to migrate database")
  78  		os.Exit(1)
  79  	}
  80  
  81  	logger.Logger.Info("migration complete")
  82  }
  83