From af109c04a3edd4dcd4e7b16242052442fb4a3b24 Mon Sep 17 00:00:00 2001 From: bndw Date: Sun, 25 Jan 2026 10:16:23 -0800 Subject: Move deploy implementation to deploy.go Restructure CLI files to follow idiomatic cobra layout: - main.go: minimal entry point - root.go: command definition, flags, and subcommand wiring - deploy.go: all deploy implementation --- cmd/ship/main.go | 92 -------------------------------------------------------- 1 file changed, 92 deletions(-) (limited to 'cmd/ship/main.go') diff --git a/cmd/ship/main.go b/cmd/ship/main.go index cd2b0c1..f7d95c1 100644 --- a/cmd/ship/main.go +++ b/cmd/ship/main.go @@ -3,100 +3,8 @@ package main import ( "fmt" "os" - - "github.com/bdw/ship/cmd/ship/env" - "github.com/bdw/ship/cmd/ship/host" - "github.com/spf13/cobra" ) -var ( - // Persistent flags - hostFlag string - - // Version info (set via ldflags) - version = "dev" - commit = "none" - date = "unknown" -) - -const banner = ` - ~ - ___|___ - | _ | - _|__|_|__|_ - | SHIP | Ship apps to your VPS - \_________/ with automatic HTTPS - ~~~~~~~~~ -` - -var rootCmd = &cobra.Command{ - Use: "ship", - Short: "Ship apps and static sites to a VPS with automatic HTTPS", - Long: banner + ` -A CLI tool for deploying applications and static sites to a VPS. - -How it works: - Ship uses only SSH to deploy - no agents, containers, or external services. - It uploads your binary or static website, creates a systemd service, and configures Caddy - for automatic HTTPS. Ports are assigned automatically. Your app runs directly on the VPS - with minimal overhead. - -Requirements: - • A VPS with SSH access (use 'ship host init' to set up a new server) - • An SSH config entry or user@host for your server - • A domain pointing to your VPS - -Examples: - # Deploy a Go binary - ship --binary ./myapp --domain api.example.com - - # Deploy with auto-generated subdomain (requires base domain) - ship --binary ./myapp --name myapp - - # Deploy a static site - ship --static --dir ./dist --domain example.com - - # Update config without redeploying binary - ship --name myapp --memory 512M --cpu 50% - ship --name myapp --env DEBUG=true - - # Set up a new VPS with base domain - ship host init --host user@vps --base-domain apps.example.com`, - RunE: runDeploy, - SilenceUsage: true, - SilenceErrors: true, -} - -func init() { - // Persistent flags available to all subcommands - rootCmd.PersistentFlags().StringVar(&hostFlag, "host", "", "VPS host (SSH config alias or user@host)") - - // Root command (deploy) flags - rootCmd.Flags().String("binary", "", "Path to Go binary (for app deployment)") - rootCmd.Flags().Bool("static", false, "Deploy as static site") - rootCmd.Flags().String("dir", ".", "Directory to deploy (for static sites)") - rootCmd.Flags().String("domain", "", "Custom domain (optional if base domain configured)") - rootCmd.Flags().String("name", "", "App name (default: inferred from binary or directory)") - rootCmd.Flags().Int("port", 0, "Port override (default: auto-allocate)") - rootCmd.Flags().StringArray("env", nil, "Environment variable (KEY=VALUE, can be specified multiple times)") - rootCmd.Flags().String("env-file", "", "Path to .env file") - rootCmd.Flags().String("args", "", "Arguments to pass to binary") - rootCmd.Flags().StringArray("file", nil, "Config file to upload to working directory (can be specified multiple times)") - rootCmd.Flags().String("memory", "", "Memory limit (e.g., 512M, 1G)") - rootCmd.Flags().String("cpu", "", "CPU limit (e.g., 50%, 200% for 2 cores)") - - // Add subcommands - rootCmd.AddCommand(listCmd) - rootCmd.AddCommand(logsCmd) - rootCmd.AddCommand(statusCmd) - rootCmd.AddCommand(restartCmd) - rootCmd.AddCommand(removeCmd) - rootCmd.AddCommand(env.Cmd) - rootCmd.AddCommand(host.Cmd) - rootCmd.AddCommand(uiCmd) - rootCmd.AddCommand(versionCmd) -} - func main() { if err := rootCmd.Execute(); err != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", err) -- cgit v1.2.3