server.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package cmd
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "path/filepath"
  7. "github.com/fatih/color"
  8. "github.com/porter-dev/porter/cli/cmd/docker"
  9. "github.com/spf13/cobra"
  10. )
  11. type startOps struct {
  12. imageTag string `form:"required"`
  13. db string `form:"oneof=sqlite postgres"`
  14. driver string `form:"required"`
  15. port *int `form:"required"`
  16. }
  17. var opts = &startOps{}
  18. var serverCmd = &cobra.Command{
  19. Use: "server",
  20. Short: "Commands to control a local Porter server",
  21. }
  22. var testCmd = &cobra.Command{
  23. Use: "test",
  24. Short: "Testing",
  25. Run: func(cmd *cobra.Command, args []string) {
  26. setDriver("local")
  27. // TODO -- DOWNLOAD THE LATEST RELEASE, IF NOT EXIST
  28. // porterDir := filepath.Join(home, ".porter")
  29. // err := github.DownloadLatestServerRelease(porterDir)
  30. // if err != nil {
  31. // color.New(color.FgRed).Println("Failed:", err.Error())
  32. // os.Exit(1)
  33. // }
  34. cmdPath := filepath.Join(home, ".porter", "portersvr")
  35. sqlLitePath := filepath.Join(home, ".porter", "porter.db")
  36. staticFilePath := filepath.Join(home, ".porter", "static")
  37. cmdPorter := exec.Command(cmdPath)
  38. cmdPorter.Env = os.Environ()
  39. cmdPorter.Env = append(cmdPorter.Env, []string{
  40. "IS_LOCAL=true",
  41. "SQL_LITE=true",
  42. "SQL_LITE_PATH=" + sqlLitePath,
  43. "STATIC_FILE_PATH=" + staticFilePath,
  44. }...)
  45. cmdPorter.Stdout = os.Stdout
  46. cmdPorter.Stderr = os.Stderr
  47. err := cmdPorter.Run()
  48. if err != nil {
  49. color.New(color.FgRed).Println("Failed:", err.Error())
  50. os.Exit(1)
  51. }
  52. },
  53. }
  54. // startCmd represents the start command
  55. var startCmd = &cobra.Command{
  56. Use: "start",
  57. Short: "Starts a Porter instance using the Docker engine",
  58. Run: func(cmd *cobra.Command, args []string) {
  59. if getDriver() == "docker" {
  60. err := startDocker(
  61. opts.imageTag,
  62. opts.db,
  63. *opts.port,
  64. )
  65. if err != nil {
  66. red := color.New(color.FgRed)
  67. red.Println("Error running start:", err.Error())
  68. red.Println("Shutting down...")
  69. err = stopDocker()
  70. if err != nil {
  71. red.Println("Shutdown unsuccessful:", err.Error())
  72. }
  73. os.Exit(1)
  74. }
  75. }
  76. },
  77. }
  78. var stopCmd = &cobra.Command{
  79. Use: "stop",
  80. Short: "Stops a Porter instance running on the Docker engine",
  81. Run: func(cmd *cobra.Command, args []string) {
  82. if getDriver() == "docker" {
  83. if err := stopDocker(); err != nil {
  84. color.New(color.FgRed).Println("Shutdown unsuccessful:", err.Error())
  85. os.Exit(1)
  86. }
  87. }
  88. },
  89. }
  90. func init() {
  91. rootCmd.AddCommand(testCmd)
  92. rootCmd.AddCommand(serverCmd)
  93. serverCmd.AddCommand(startCmd)
  94. serverCmd.AddCommand(stopCmd)
  95. startCmd.PersistentFlags().StringVar(
  96. &opts.db,
  97. "db",
  98. "sqlite",
  99. "the db to use, one of sqlite or postgres",
  100. )
  101. startCmd.PersistentFlags().StringVar(
  102. &opts.driver,
  103. "driver",
  104. "local",
  105. "the db to use, one of local or docker",
  106. )
  107. startCmd.PersistentFlags().StringVar(
  108. &opts.imageTag,
  109. "image-tag",
  110. "latest",
  111. "the Porter image tag to use",
  112. )
  113. opts.port = startCmd.PersistentFlags().IntP(
  114. "port",
  115. "p",
  116. 8080,
  117. "the host port to run the server on",
  118. )
  119. }
  120. func startDocker(
  121. imageTag string,
  122. db string,
  123. port int,
  124. ) error {
  125. env := []string{
  126. "NODE_ENV=production",
  127. "FULLSTORY_ORG_ID=VXNSS",
  128. }
  129. var porterDB docker.PorterDB
  130. switch db {
  131. case "postgres":
  132. porterDB = docker.Postgres
  133. case "sqlite":
  134. porterDB = docker.SQLite
  135. }
  136. startOpts := &docker.PorterStartOpts{
  137. ProcessID: "main",
  138. ServerImageTag: imageTag,
  139. ServerPort: port,
  140. DB: porterDB,
  141. Env: env,
  142. }
  143. _, _, err := docker.StartPorter(startOpts)
  144. if err != nil {
  145. return err
  146. }
  147. green := color.New(color.FgGreen)
  148. green.Printf("Server ready: listening on localhost:%d\n", port)
  149. return setHost(fmt.Sprintf("http://localhost:%d", port))
  150. }
  151. func stopDocker() error {
  152. agent, err := docker.NewAgentFromEnv()
  153. if err != nil {
  154. return err
  155. }
  156. err = agent.StopPorterContainersWithProcessID("main", false)
  157. if err != nil {
  158. return err
  159. }
  160. green := color.New(color.FgGreen)
  161. green.Println("Successfully stopped the Porter server.")
  162. return nil
  163. }