Skip to content

Commit 2747942

Browse files
committed
Move away from using a docker registry
1 parent e88bff1 commit 2747942

File tree

7 files changed

+96
-75
lines changed

7 files changed

+96
-75
lines changed

README.md

-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@ sidekick init
6060
Then you need to enter the following:
6161
- IP Address of your VPS
6262
- An email address to use for setting up SSL certs
63-
- Docker registry to host your docker images - defaults to `docker.io`
64-
- Docker username in the said registry
65-
- Confirm you are currently logged in to that said registry with the username - This is needed to be able to push images on your behalf
6663

6764
After that Sidekick will setup many things on your VPS - Usually takes around 2 mins
6865

cmd/compose.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ to quickly create a Cobra application.`,
172172
dockerBuildSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
173173
cwd, _ := os.Getwd()
174174
dockerBuildCommd := exec.Command("sh", "-s", "-", appName, viper.Get("dockerUsername").(string), cwd)
175-
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerHandleScript)
175+
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerBuildAndSaveScript)
176176
// better handle of errors -> Push it to another writer aside from os.stderr and then flush it when it panics
177177
if dockerBuildErr := dockerBuildCommd.Run(); dockerBuildErr != nil {
178178
log.Fatalln("Failed to run docker")
@@ -237,7 +237,6 @@ to quickly create a Cobra application.`,
237237
}
238238

239239
func init() {
240-
rootCmd.AddCommand(composeCmd)
241240

242241
// Here you will define your flags and configuration settings.
243242

cmd/deploy.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package cmd
1717
import (
1818
"crypto/md5"
1919
"fmt"
20+
"log"
2021
"os"
2122
"os/exec"
2223
"strconv"
@@ -49,9 +50,11 @@ to quickly create a Cobra application.`,
4950
Run sidekick launch`)
5051
os.Exit(1)
5152
}
53+
pterm.Println()
54+
pterm.DefaultHeader.WithFullWidth().Println("Deploying a new version of your app 😏")
55+
pterm.Println()
5256

5357
multi := pterm.DefaultMultiPrinter
54-
setupProgressBar, _ := pterm.DefaultProgressbar.WithTotal(3).WithWriter(multi.NewWriter()).Start("🚀 Deploying your app")
5558
loginSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Logging into VPS")
5659
dockerBuildStageSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Building latest docker image of your app")
5760
deployStageSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Deploying a new version of your application")
@@ -65,7 +68,6 @@ Run sidekick launch`)
6568
replacer := strings.NewReplacer(
6669
"$service_name", appConfig.Name,
6770
"$app_port", fmt.Sprint(appConfig.Port),
68-
"$docker_username", viper.Get("dockerUsername").(string),
6971
)
7072

7173
loginSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
@@ -75,7 +77,6 @@ Run sidekick launch`)
7577
panic(err)
7678
}
7779
loginSpinner.Success("Logged in successfully!")
78-
setupProgressBar.Increment()
7980

8081
dockerBuildStageSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
8182
envFileChanged := false
@@ -102,14 +103,25 @@ Run sidekick launch`)
102103
defer os.Remove("encrypted.env")
103104

104105
cwd, _ := os.Getwd()
105-
dockerBuildCommd := exec.Command("sh", "-s", "-", appConfig.Name, viper.Get("dockerUsername").(string), cwd, "latest")
106-
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerHandleScript)
106+
dockerBuildCommd := exec.Command("sh", "-s", "-", appConfig.Name, cwd)
107+
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerBuildAndSaveScript)
107108
if dockerBuildErr := dockerBuildCommd.Run(); dockerBuildErr != nil {
108109
panic(dockerBuildErr)
109110
}
110111
dockerBuildStageSpinner.Success("Latest docker image built")
111112

112113
deployStageSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
114+
imgMoveCmd := exec.Command("sh", "-s", "-", appConfig.Name, "sidekick", viper.GetString("serverAddress"))
115+
imgMoveCmd.Stdin = strings.NewReader(utils.ImageMoveScript)
116+
_, imgMoveErr := imgMoveCmd.Output()
117+
if imgMoveErr != nil {
118+
log.Fatalf("Issue occured with moving image to your VPS: %s", imgMoveErr)
119+
os.Exit(1)
120+
}
121+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && docker load -i %s-latest.tar", appConfig.Name, appConfig.Name)); sessionErr != nil {
122+
log.Fatal("Issue happened loading docker image")
123+
}
124+
113125
if appConfig.Env.File != "" {
114126
deployScript := replacer.Replace(utils.DeployAppWithEnvScript)
115127
_, sessionErr := utils.RunCommand(sshClient, deployScript)
@@ -123,6 +135,9 @@ Run sidekick launch`)
123135
panic(sessionErr)
124136
}
125137
}
138+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && rm %s", appConfig.Name, fmt.Sprintf("%s-latest.tar", appConfig.Name))); sessionErr != nil {
139+
log.Fatal("Issue happened cleaning up the image file")
140+
}
126141

127142
latestVersion := strings.Split(appConfig.Version, "")[1]
128143
latestVersionInt, _ := strconv.ParseInt(latestVersion, 0, 64)

cmd/init.go

+4-34
Original file line numberDiff line numberDiff line change
@@ -58,31 +58,6 @@ var initCmd = &cobra.Command{
5858
os.Exit(0)
5959
}
6060

61-
dockerRegistery := ""
62-
dockerRegisteryTextInput := pterm.DefaultInteractiveTextInput.WithDefaultValue("docker.io")
63-
dockerRegisteryTextInput.DefaultText = "Please enter your docker registery"
64-
dockerRegistery, _ = dockerRegisteryTextInput.Show()
65-
66-
dockerUsername := ""
67-
dokerUsernameTextInput := pterm.DefaultInteractiveTextInput
68-
dokerUsernameTextInput.DefaultText = "Please enter your docker username for the registery"
69-
dockerUsername, _ = dokerUsernameTextInput.Show()
70-
if dockerUsername == "" {
71-
pterm.Error.Println("You have to enter your docker username")
72-
os.Exit(0)
73-
}
74-
75-
prompt := pterm.DefaultInteractiveContinue
76-
prompt.DefaultText = "Are you logged in to the docker registery?"
77-
prompt.Options = []string{"yes", "no"}
78-
if result, _ := prompt.Show(); result != "yes" {
79-
pterm.Println()
80-
pterm.Error.Printfln("You need to login to your docker registery %s", dockerRegistery)
81-
pterm.Info.Printfln("You can do so by running `docker login %s`", dockerRegistery)
82-
pterm.Println()
83-
os.Exit(0)
84-
}
85-
8661
// init the sidekick system config && add public key to known_hosts
8762
preludeCmd := exec.Command("sh", "-s", "-")
8863
preludeCmd.Stdin = strings.NewReader(utils.PreludeScript)
@@ -95,8 +70,6 @@ var initCmd = &cobra.Command{
9570
viper.SetConfigType("yaml")
9671
viper.AddConfigPath("$HOME/.config/sidekick/")
9772
viper.Set("serverAddress", server)
98-
viper.Set("dockerRegistery", dockerRegistery)
99-
viper.Set("dockerUsername", dockerUsername)
10073
viper.Set("certEmail", certEmail)
10174

10275
pterm.Println()
@@ -111,7 +84,6 @@ var initCmd = &cobra.Command{
11184
}
11285

11386
multi := pterm.DefaultMultiPrinter
114-
setupProgressBar, _ := pterm.DefaultProgressbar.WithTotal(6).WithWriter(multi.NewWriter()).Start("Sidekick Booting up (2m estimated) ")
11587
rootLoginSpinner, _ := pterm.DefaultSpinner.Start("Logging in with root")
11688
stage0Spinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Adding user Sidekick")
11789
sidekickLoginSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Logging into with sidekick user")
@@ -122,15 +94,13 @@ var initCmd = &cobra.Command{
12294
multi.Start()
12395

12496
rootLoginSpinner.Success("Logged in successfully!")
125-
setupProgressBar.Increment()
12697

12798
stage0Spinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
12899
if err := utils.RunStage(rootSshClient, utils.UsersetupStage); err != nil {
129100
stage0Spinner.Fail(utils.UsersetupStage.SpinnerFailMessage)
130101
panic(err)
131102
}
132103
stage0Spinner.Success(utils.UsersetupStage.SpinnerSuccessMessage)
133-
setupProgressBar.Increment()
134104

135105
sidekickLoginSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
136106
sidekickSshClient, err := utils.Login(server, "sidekick")
@@ -139,7 +109,6 @@ var initCmd = &cobra.Command{
139109
panic(err)
140110
}
141111
sidekickLoginSpinner.Success("Logged in successfully with new user!")
142-
setupProgressBar.Increment()
143112

144113
stage1Spinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
145114
if err := utils.RunStage(sidekickSshClient, utils.SetupStage); err != nil {
@@ -160,15 +129,13 @@ var initCmd = &cobra.Command{
160129
}
161130
}
162131
stage1Spinner.Success(utils.SetupStage.SpinnerSuccessMessage)
163-
setupProgressBar.Increment()
164132

165133
stage2Spinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
166134
if err := utils.RunStage(sidekickSshClient, utils.DockerStage); err != nil {
167135
stage2Spinner.Fail(utils.DockerStage.SpinnerFailMessage)
168136
panic(err)
169137
}
170138
stage2Spinner.Success(utils.DockerStage.SpinnerSuccessMessage)
171-
setupProgressBar.Increment()
172139

173140
stage3Spinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
174141
traefikStage := utils.GetTraefikStage(certEmail)
@@ -177,13 +144,16 @@ var initCmd = &cobra.Command{
177144
panic(err)
178145
}
179146
stage3Spinner.Success(traefikStage.SpinnerSuccessMessage)
180-
setupProgressBar.Increment()
181147

182148
if err := viper.WriteConfig(); err != nil {
183149
panic(err)
184150
}
185151

186152
multi.Stop()
153+
154+
pterm.Println()
155+
pterm.Info.Println("Your VPS is ready! You can now run Sidekick launch in your app folder")
156+
pterm.Println()
187157
},
188158
}
189159

cmd/launch.go

+28-11
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,11 @@ var launchCmd = &cobra.Command{
9898
} else {
9999
pterm.Info.Println("No env file detected - Skipping env parsing")
100100
}
101+
fmt.Println("Env is:")
102+
fmt.Println(dockerEnvProperty)
103+
101104
// make a docker service
102-
imageName := fmt.Sprintf("%s/%s", viper.Get("dockerUsername").(string), appName)
105+
imageName := appName
103106
newService := utils.DockerService{
104107
Image: imageName,
105108
Labels: []string{
@@ -137,8 +140,11 @@ var launchCmd = &cobra.Command{
137140
}
138141
defer os.Remove("docker-compose.yaml")
139142

143+
pterm.Println()
144+
pterm.DefaultHeader.WithFullWidth().Println("Let's launch your app! 🚀")
145+
pterm.Println()
146+
140147
multi := pterm.DefaultMultiPrinter
141-
launchPb, _ := pterm.DefaultProgressbar.WithTotal(3).WithWriter(multi.NewWriter()).Start("Booting up app on VPS")
142148
loginSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Logging into VPS")
143149
dockerBuildSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Preparing docker image")
144150
setupSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Setting up application")
@@ -152,25 +158,35 @@ var launchCmd = &cobra.Command{
152158
panic(err)
153159
}
154160
loginSpinner.Success("Logged in successfully!")
155-
launchPb.Increment()
156161

157162
dockerBuildSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
158163
cwd, _ := os.Getwd()
159-
dockerBuildCommd := exec.Command("sh", "-s", "-", appName, viper.Get("dockerUsername").(string), cwd)
160-
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerHandleScript)
164+
dockerBuildCommd := exec.Command("sh", "-s", "-", appName, cwd)
165+
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerBuildAndSaveScript)
161166
// better handle of errors -> Push it to another writer aside from os.stderr and then flush it when it panics
162167
if dockerBuildErr := dockerBuildCommd.Run(); dockerBuildErr != nil {
163168
log.Fatalln("Failed to run docker")
164169
os.Exit(1)
165170
}
166-
dockerBuildSpinner.Success("Successfully built and pushed docker image")
167-
launchPb.Increment()
168-
169-
setupSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
170171
_, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("mkdir %s", appName))
171172
if sessionErr != nil {
172173
panic(sessionErr)
173174
}
175+
176+
imgMoveCmd := exec.Command("sh", "-s", "-", appName, "sidekick", viper.GetString("serverAddress"))
177+
imgMoveCmd.Stdin = strings.NewReader(utils.ImageMoveScript)
178+
_, imgMoveErr := imgMoveCmd.Output()
179+
if imgMoveErr != nil {
180+
log.Fatalf("Issue occured with moving image to your VPS: %s", imgMoveErr)
181+
os.Exit(1)
182+
}
183+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && docker load -i %s-latest.tar", appName, appName)); sessionErr != nil {
184+
log.Fatal("Issue happened loading docker image")
185+
}
186+
187+
dockerBuildSpinner.Success("Successfully built and moved docker image to your VPS")
188+
189+
setupSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
174190
rsync := exec.Command("rsync", "docker-compose.yaml", fmt.Sprintf("%s@%s:%s", "sidekick", viper.Get("serverAddress").(string), fmt.Sprintf("./%s", appName)))
175191
rsync.Run()
176192
if hasEnvFile {
@@ -187,6 +203,9 @@ var launchCmd = &cobra.Command{
187203
panic(sessionErr1)
188204
}
189205
}
206+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && rm %s", appName, fmt.Sprintf("%s-latest.tar", appName))); sessionErr != nil {
207+
log.Fatal("Issue happened cleaning up the image file")
208+
}
190209

191210
portNumber, err := strconv.ParseUint(appPort, 0, 64)
192211
if err != nil {
@@ -201,15 +220,13 @@ var launchCmd = &cobra.Command{
201220
sidekickAppConfig := utils.SidekickAppConfig{
202221
Name: appName,
203222
Version: "V1",
204-
Image: fmt.Sprintf("%s/%s", viper.Get("dockerUsername"), appName),
205223
Port: portNumber,
206224
Url: appDomain,
207225
CreatedAt: time.Now().Format(time.UnixDate),
208226
Env: envConfig,
209227
}
210228
ymlData, err := yaml.Marshal(&sidekickAppConfig)
211229
os.WriteFile("./sidekick.yml", ymlData, 0644)
212-
launchPb.Increment()
213230

214231
setupSpinner.Success("🙌 App setup successfully 🙌")
215232
multi.Stop()

cmd/preview.go

+22-5
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ to quickly create a Cobra application.`,
6868
deployHash := string(hashOutput)
6969
deployHash = strings.TrimSuffix(deployHash, "\n")
7070

71+
pterm.Println()
72+
pterm.DefaultHeader.WithFullWidth().Println("Deploying a preview env of your app 😎")
73+
pterm.Println()
74+
7175
multi := pterm.DefaultMultiPrinter
72-
setupProgressBar, _ := pterm.DefaultProgressbar.WithTotal(3).WithWriter(multi.NewWriter()).Start("Deploying your preview env")
7376
loginSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Logging into VPS")
7477
dockerBuildStageSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Building latest docker image of your app")
7578
deployStageSpinner, _ := utils.GetSpinner().WithWriter(multi.NewWriter()).Start("Deploying a preview env of your application")
@@ -83,7 +86,6 @@ to quickly create a Cobra application.`,
8386
panic(err)
8487
}
8588
loginSpinner.Success("Logged in successfully!")
86-
setupProgressBar.Increment()
8789

8890
dockerBuildStageSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}
8991

@@ -98,7 +100,7 @@ to quickly create a Cobra application.`,
98100
}
99101
defer os.Remove("encrypted.env")
100102

101-
imageName := fmt.Sprintf("%s/%s:%s", viper.Get("dockerUsername").(string), appConfig.Name, deployHash)
103+
imageName := fmt.Sprintf("%s:%s", appConfig.Name, deployHash)
102104
serviceName := fmt.Sprintf("%s-%s", appConfig.Name, deployHash)
103105
previewURL := fmt.Sprintf("%s.%s", deployHash, appConfig.Url)
104106
newService := utils.DockerService{
@@ -139,13 +141,28 @@ to quickly create a Cobra application.`,
139141
defer os.Remove("docker-compose.yaml")
140142

141143
cwd, _ := os.Getwd()
142-
dockerBuildCommd := exec.Command("sh", "-s", "-", appConfig.Name, viper.Get("dockerUsername").(string), cwd, deployHash)
143-
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerHandleScript)
144+
dockerBuildCommd := exec.Command("sh", "-s", "-", appConfig.Name, cwd, deployHash)
145+
dockerBuildCommd.Stdin = strings.NewReader(utils.DockerBuildAndSaveScript)
144146
// better handle of errors -> Push it to another writer aside from os.stderr and then flush it when it panics
145147
if dockerBuildErr := dockerBuildCommd.Run(); dockerBuildErr != nil {
146148
log.Fatalln("Failed to run docker")
147149
os.Exit(1)
148150
}
151+
152+
imgMoveCmd := exec.Command("sh", "-s", "-", appConfig.Name, "sidekick", viper.GetString("serverAddress"), deployHash)
153+
imgMoveCmd.Stdin = strings.NewReader(utils.ImageMoveScript)
154+
_, imgMoveErr := imgMoveCmd.Output()
155+
if imgMoveErr != nil {
156+
log.Fatalf("Issue occured with moving image to your VPS: %s", imgMoveErr)
157+
os.Exit(1)
158+
}
159+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && docker load -i %s-%s.tar", appConfig.Name, appConfig.Name, deployHash)); sessionErr != nil {
160+
log.Fatal("Issue happened loading docker image")
161+
}
162+
if _, sessionErr := utils.RunCommand(sshClient, fmt.Sprintf("cd %s && rm %s", appConfig.Name, fmt.Sprintf("%s-%s.tar", appConfig.Name, deployHash))); sessionErr != nil {
163+
log.Fatal("Issue happened cleaning up the image file")
164+
}
165+
149166
dockerBuildStageSpinner.Success("Successfully built and pushed docker image")
150167

151168
deployStageSpinner.Sequence = []string{"▀ ", " ▀", " ▄", "▄ "}

0 commit comments

Comments
 (0)