From 702cb02831be836eeda91cd58504aeca45b1a260 Mon Sep 17 00:00:00 2001 From: bndw Date: Sat, 14 Feb 2026 08:16:41 -0800 Subject: Add backwards compatibility for existing binary deployments Check if .ship files exist before reading them. If they don't exist, generate them even on updates. This provides automatic migration for deployments created before the .ship/ directory change. --- cmd/ship/deploy.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'cmd/ship/deploy.go') diff --git a/cmd/ship/deploy.go b/cmd/ship/deploy.go index 6894e21..90dc846 100644 --- a/cmd/ship/deploy.go +++ b/cmd/ship/deploy.go @@ -337,8 +337,9 @@ func deployApp(st *state.State, opts DeployOptions) error { return fmt.Errorf("error setting env file ownership: %w", err) } - // Create local .ship directory for deployment configs - if !opts.IsUpdate { + // Create local .ship directory for deployment configs if they don't exist + // (handles both initial deployment and migration of existing deployments) + if _, err := os.Stat(".ship/service"); os.IsNotExist(err) { fmt.Println("-> Creating local .ship directory...") if err := os.MkdirAll(".ship", 0755); err != nil { return fmt.Errorf("error creating .ship directory: %w", err) @@ -362,7 +363,9 @@ func deployApp(st *state.State, opts DeployOptions) error { if err := os.WriteFile(".ship/service", []byte(serviceContent), 0644); err != nil { return fmt.Errorf("error writing .ship/service: %w", err) } + } + if _, err := os.Stat(".ship/Caddyfile"); os.IsNotExist(err) { fmt.Println("-> Generating Caddyfile...") caddyContent, err := templates.AppCaddy(map[string]string{ "Domain": opts.Domain, @@ -380,7 +383,7 @@ func deployApp(st *state.State, opts DeployOptions) error { fmt.Println("-> Installing systemd service...") serviceContent, err := os.ReadFile(".ship/service") if err != nil { - return fmt.Errorf("error reading .ship/service: %w (run initial deployment first)", err) + return fmt.Errorf("error reading .ship/service: %w", err) } servicePath := fmt.Sprintf("/etc/systemd/system/%s.service", opts.Name) if err := client.WriteSudoFile(servicePath, string(serviceContent)); err != nil { @@ -391,7 +394,7 @@ func deployApp(st *state.State, opts DeployOptions) error { fmt.Println("-> Installing Caddy config...") caddyContent, err := os.ReadFile(".ship/Caddyfile") if err != nil { - return fmt.Errorf("error reading .ship/Caddyfile: %w (run initial deployment first)", err) + return fmt.Errorf("error reading .ship/Caddyfile: %w", err) } caddyPath := fmt.Sprintf("/etc/caddy/sites-enabled/%s.caddy", opts.Name) if err := client.WriteSudoFile(caddyPath, string(caddyContent)); err != nil { @@ -581,8 +584,9 @@ func deployStatic(st *state.State, opts DeployOptions) error { return fmt.Errorf("error setting file permissions: %w", err) } - // Create local .ship directory and Caddyfile for static sites - if !opts.IsUpdate { + // Create local .ship directory and Caddyfile for static sites if it doesn't exist + // (handles both initial deployment and migration of existing deployments) + if _, err := os.Stat(".ship/Caddyfile"); os.IsNotExist(err) { fmt.Println("-> Creating local .ship directory...") if err := os.MkdirAll(".ship", 0755); err != nil { return fmt.Errorf("error creating .ship directory: %w", err) @@ -605,7 +609,7 @@ func deployStatic(st *state.State, opts DeployOptions) error { fmt.Println("-> Installing Caddy config...") caddyContent, err := os.ReadFile(".ship/Caddyfile") if err != nil { - return fmt.Errorf("error reading .ship/Caddyfile: %w (run initial deployment first)", err) + return fmt.Errorf("error reading .ship/Caddyfile: %w", err) } caddyPath := fmt.Sprintf("/etc/caddy/sites-enabled/%s.caddy", opts.Name) if err := client.WriteSudoFile(caddyPath, string(caddyContent)); err != nil { -- cgit v1.2.3