{"id":50102086,"url":"https://github.com/webcane/docker-deploy","last_synced_at":"2026-05-23T08:02:56.426Z","repository":{"id":358415449,"uuid":"1241248361","full_name":"webcane/docker-deploy","owner":"webcane","description":"A Docker CLI plugin for deploying Docker Compose projects to remote machines over SSH. Built for developers who need to ship fast.","archived":false,"fork":false,"pushed_at":"2026-05-17T08:34:27.000Z","size":1603,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-17T10:40:09.800Z","etag":null,"topics":["deploy","docker","docker-cli-plugin","docker-compose","go"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webcane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T06:24:01.000Z","updated_at":"2026-05-17T08:34:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/webcane/docker-deploy","commit_stats":null,"previous_names":["webcane/docker-deploy"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/webcane/docker-deploy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcane%2Fdocker-deploy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcane%2Fdocker-deploy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcane%2Fdocker-deploy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcane%2Fdocker-deploy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webcane","download_url":"https://codeload.github.com/webcane/docker-deploy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcane%2Fdocker-deploy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33387657,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deploy","docker","docker-cli-plugin","docker-compose","go"],"created_at":"2026-05-23T08:02:54.289Z","updated_at":"2026-05-23T08:02:56.408Z","avatar_url":"https://github.com/webcane.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# docker-deploy\n\n[![CI](https://github.com/webcane/docker-deploy/actions/workflows/ci.yml/badge.svg)](https://github.com/webcane/docker-deploy/actions/workflows/ci.yml) [![Latest Release](https://img.shields.io/github/v/release/webcane/docker-deploy)](https://github.com/webcane/docker-deploy/releases) [![Go Report Card](https://goreportcard.com/badge/github.com/webcane/docker-deploy)](https://goreportcard.com/report/github.com/webcane/docker-deploy) [![License](https://img.shields.io/github/license/webcane/docker-deploy)](LICENSE) [![Open Issues](https://img.shields.io/github/issues/webcane/docker-deploy)](https://github.com/webcane/docker-deploy/issues) [![Codecov](https://codecov.io/gh/webcane/docker-deploy/branch/main/graph/badge.svg)](https://codecov.io/gh/webcane/docker-deploy)\n\nDeploy your docker-compose project to any SSH-accessible VPS with a single command — no git required on the remote.\n\n## What is docker-deploy?\n\ndocker-deploy is a Docker CLI plugin (`docker deploy`) that solves the problem of deploying a local docker-compose project to a remote VPS without needing git, a container registry, or a CI/CD pipeline on the server. It copies your project files (compose.yaml, .env, Makefile, and more) to the target directory on the remote host via SFTP, runs `docker compose up -d`, and reports deployment health — all without exposing the Docker daemon socket. It is built for developers who want the simplicity of `scp + compose up` without the operational overhead of Kamal, Ansible, or a full CI/CD system.\n\n## Installation\n\n### Option 1: Homebrew (macOS / Linux)\n\n```bash\nbrew tap webcane/docker-deploy\nbrew install docker-deploy\n```\n\nHomebrew installs the binary to the Homebrew prefix. Add a symlink to the Docker CLI plugin directory so Docker discovers it:\n\n```bash\nmkdir -p ~/.docker/cli-plugins\nln -sf $(brew --prefix)/bin/docker-deploy ~/.docker/cli-plugins/docker-deploy\n```\n\n### Option 2: Install script (macOS / Linux)\n\n```bash\ncurl https://raw.githubusercontent.com/webcane/docker-deploy/master/install.sh | sh\n```\n\nInstalls the latest release. To pin a specific version:\n\n```bash\ncurl https://raw.githubusercontent.com/webcane/docker-deploy/master/install.sh | INSTALL_VERSION=v1.0.0 sh\n```\n\n### Option 3: Manual binary (GitHub Releases)\n\n1. Go to the [releases page](https://github.com/webcane/docker-deploy/releases) and download the archive for your OS and architecture (e.g. `docker-deploy_linux_amd64.tar.gz`).\n2. Extract the archive, move the binary to `~/.docker/cli-plugins/`, and make it executable:\n\n```bash\ntar -xzf docker-deploy_linux_amd64.tar.gz\nmkdir -p ~/.docker/cli-plugins\nmv docker-deploy ~/.docker/cli-plugins/docker-deploy\nchmod +x ~/.docker/cli-plugins/docker-deploy\n```\n\nReplace `linux_amd64` with your OS and architecture (e.g. `darwin_arm64` for Apple Silicon).\n\n### Option 4: go install\n\n```bash\nGOBIN=~/.docker/cli-plugins go install github.com/webcane/docker-deploy/cmd/docker-deploy@latest\n```\n\n`GOBIN` must be set to `~/.docker/cli-plugins` — Docker CLI plugins must live in that directory, not in the standard `$GOPATH/bin`. Without `GOBIN`, `docker deploy` will not be discoverable by the Docker CLI.\n\n## Usage\n\n### Quick Start\n\n```bash\ndocker deploy --host ssh://sshuser@vps.example.com\n```\n\nThis copies your project files to `/opt/\u003cproject-dir-name\u003e` on the remote host, runs `docker compose up -d`, and reports the deployment health status.\n\n### Scenario 1: Recommended setup — non-root SSH user (sshuser)\n\nDeploying as a non-root user is the recommended approach. Root deploys trigger a warning and violate least-privilege principles. Create a dedicated SSH user on your VPS (`sshuser`) with Docker group membership, then deploy:\n\n```bash\ndocker deploy --host ssh://sshuser@vps.example.com\n```\n\nAdd a `deploy.yaml` to your project directory to avoid typing the host on every run:\n\n```yaml\nversion: 1\ntarget:\n  host: ssh://sshuser@vps.example.com\n  path: /opt/myapp          # defaults to /opt/\u003cproject-dir-name\u003e\n```\n\nOnce `deploy.yaml` is present, just run:\n\n```bash\ndocker deploy\n```\n\nSee [PREREQUISITES.md](PREREQUISITES.md) for SSH key setup and passwordless sudo configuration.\n\n### Scenario 2: Flags-only (no deploy.yaml)\n\nUse flags for one-off deploys, CI environments, or when testing a new host without committing a config file:\n\n```bash\ndocker deploy \\\n  --host ssh://sshuser@vps.example.com \\\n  --path /opt/myapp \\\n  --force \\\n  --compose-file docker-compose.prod.yml\n```\n\n`--force` skips the \"target exists, replace?\" confirmation prompt on repeat deploys. All flags take precedence over `deploy.yaml` values when both are present.\n\n### Scenario 3: Config-driven deploy (deploy.yaml)\n\nUse `deploy.yaml` for repeat deploys from the same directory. This example shows all supported fields:\n\n```yaml\nversion: 1\ntarget:\n  host: ssh://sshuser@vps.example.com\n  path: /opt/myapp\n  compose_file: docker-compose.prod.yml\n  force: true\n  skip_env: false           # set true to preserve remote .env unchanged\n  health_timeout: 90        # seconds to wait for healthy status (default: 60)\n  health_interval: 10       # seconds between health polls (default: 5)\n  exclude:\n    - \"tests/\"\n    - \"*.md\"\n```\n\nThen deploy:\n\n```bash\ndocker deploy\n```\n\nUse `--verbose` to see each file transferred and each SSH command executed during the deploy.\n\nSee [DEPLOY_CONFIG.md](DEPLOY_CONFIG.md) for the full configuration reference.\n\n## Learn More\n\n- [PREREQUISITES.md](PREREQUISITES.md) — SSH key setup, passwordless sudo for sshuser\n- [DEPLOY_CONFIG.md](DEPLOY_CONFIG.md) — Full deploy.yaml field reference\n- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) — Common failures and fixes\n- [COMPARISON.md](COMPARISON.md) — How docker-deploy compares to Kamal, Ansible, and other tools\n\n## Feedback\n\nBug reports and feature requests are welcome. Open an issue at [github.com/webcane/docker-deploy/issues](https://github.com/webcane/docker-deploy/issues) — every report helps improve the tool.\n\n[![TON](https://img.shields.io/badge/Donate-TON-blue)](https://tonviewer.com/UQCB7Y1q3cMl2wxfE1DDHr-VzJ-EeaJIUykx_CUkUdMrbtLG)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcane%2Fdocker-deploy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebcane%2Fdocker-deploy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcane%2Fdocker-deploy/lists"}