{"id":47089897,"url":"https://github.com/the-graft-project/graft","last_synced_at":"2026-04-22T09:01:30.205Z","repository":{"id":330448646,"uuid":"1120010014","full_name":"The-Graft-Project/Graft","owner":"The-Graft-Project","description":"CLI tool, agentless deployment engine that extends the Docker Compose workflow to cloud infrastructure via SSH.  With features like Deployment Environments, DNS Configurations, Rollbacks, CI/CD Workflow","archived":false,"fork":false,"pushed_at":"2026-03-12T09:08:31.000Z","size":31932,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-12T13:13:53.094Z","etag":null,"topics":["aws-ec2","cli-remote-commands","cli-tool","deployment","docker-compose","documented","easy-deployment","google-cloud","reverse-proxy","server-manager","ssh","vps-server"],"latest_commit_sha":null,"homepage":"https://graftdocs.vercel.app","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/The-Graft-Project.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":"2025-12-20T09:46:37.000Z","updated_at":"2026-03-12T09:08:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/The-Graft-Project/Graft","commit_stats":null,"previous_names":["skssmd/graft","the-graft-project/graft"],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/The-Graft-Project/Graft","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Graft-Project%2FGraft","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Graft-Project%2FGraft/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Graft-Project%2FGraft/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Graft-Project%2FGraft/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/The-Graft-Project","download_url":"https://codeload.github.com/The-Graft-Project/Graft/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Graft-Project%2FGraft/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32128704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T08:34:57.708Z","status":"ssl_error","status_checked_at":"2026-04-22T08:34:55.583Z","response_time":58,"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":["aws-ec2","cli-remote-commands","cli-tool","deployment","docker-compose","documented","easy-deployment","google-cloud","reverse-proxy","server-manager","ssh","vps-server"],"created_at":"2026-03-12T09:29:44.792Z","updated_at":"2026-04-22T09:01:30.196Z","avatar_url":"https://github.com/The-Graft-Project.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"```text\r\n ██████  ██████   █████  ███████ ████████ \r\n██       ██   ██ ██   ██ ██         ██    \r\n██   ███ ██████  ███████ █████      ██    \r\n██    ██ ██   ██ ██   ██ ██         ██    \r\n ██████  ██   ██ ██   ██ ██         ██    \r\n```\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003cstrong\u003eIf it works with Docker Compose, Graft can ship it in minutes\u003c/strong\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://graftdocs.vercel.app\"\u003e\u003cstrong\u003eDocumentation\u003c/strong\u003e\u003c/a\u003e |\r\n  \u003ca href=\"https://github.com/skssmd/Graft/issues\"\u003e\u003cstrong\u003eSupport\u003c/strong\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n---\r\n\r\n## Your Docker Compose commands. Your production server. Zero bloat.\r\n\r\n**Got a working `docker-compose.yml`? You're 3 commands away from production.**\r\n\r\n```bash\r\n# This works locally\r\ndocker compose up -d\r\n\r\n# This works in production (same exact commands)\r\ngraft up -d\r\n```\r\n\r\n**Same commands. Same workflow. Different server.** If your app runs locally with Docker Compose, Graft can deploy it in under 5 minutes.\r\n\r\nNo agents running on your server. No web UIs eating RAM. No control panels you never asked for. Just SSH, your existing compose file, and automatic infrastructure setup.\r\n\r\n**Graft is completely agentless.** The only thing it leaves on your server is a tiny webhook for CI/CD (1.7MB RAM idle, ~10-15MB during deployments). Everything else runs from your machine.\r\n\r\n---\r\n\r\n## Why Graft exists\r\n\r\n**You've already done the hard work.** Your app runs perfectly locally with Docker Compose. \r\n\r\nNow you just need it live. But somehow \"just deploy it\" turns into:\r\n- **Dokploy/Coolify/CapRover** → Install a 500MB+ web UI on your server, click through dashboards\r\n- **Managed platforms** → Rewrite configs for their format, watch costs scale with success\r\n- **Manual SSH deployment** → Spend hours configuring Traefik, Let's Encrypt, networking, security...\r\n\r\n**Graft takes your working compose file and ships it.** That's it.\r\n\r\n```bash\r\ngraft init     # Point at your server (once)\r\ngraft sync     # Deploy everything\r\ngraft logs -f  # Verify it's running\r\n```\r\n\r\nFrom working locally to live with SSL in under 5 minutes. Your server's resources stay focused on your app, not management tools.\r\n\r\n---\r\n\r\n## What makes Graft different\r\n\r\n### 🪶 Completely agentless\r\n\r\nGraft runs from **your machine**, not your server. The only footprint on your server:\r\n\r\n```\r\nCONTAINER ID   NAME                   CPU %     MEM USAGE / LIMIT    MEM %     PIDS\r\n0deea9bcd77e   webhook-graft-hook-1   0.00%     1.73MiB / 916.8MiB   0.19%     3\r\n```\r\n\r\n**1.7MB of RAM at idle. ~10-15MB during deployments.** That's the webhook for CI/CD triggers. Everything else is your actual application.\r\n\r\nCompare to server management UIs that consume 500MB-1GB+ just sitting there with a web interface you barely use.\r\n\r\n### 🎯 Docker Compose, but remote\r\n\r\nEvery command you know works on production:\r\n\r\n```bash\r\ngraft ps                          # What's running?\r\ngraft logs backend -f             # Follow logs in real-time\r\ngraft exec backend cat config.yml # Read files\r\ngraft restart frontend            # Bounce a service\r\ngraft pull \u0026\u0026 graft up -d         # Deploy updates\r\n```\r\n\r\nNo new syntax. No proprietary config files. If you know Docker Compose, you know Graft.\r\n\r\n### ⚡ Zero-config infrastructure\r\n\r\nPoint Graft at a clean Ubuntu/Debian server and it:\r\n- Installs Docker automatically\r\n- Configures Traefik reverse proxy\r\n- Sets up SSL certificates via Let's Encrypt\r\n- Creates isolated Docker networks\r\n- Handles all the boring infrastructure work\r\n\r\nAll done over SSH. Nothing installed server-side except what you actually need.\r\n\r\n### 🚀 Flexible deployment modes\r\n\r\n**Just ship it:** Direct sync mode\r\n```bash\r\ngraft sync  # Rsync code → server builds → done\r\n```\r\n\r\n**Proper CI/CD:** GitHub Actions + GHCR\r\n```bash\r\ngraft init  # Choose git-images mode\r\ngraft sync  # Auto-generates workflow, sets up webhooks, done\r\n```\r\n\r\nGraft writes production-ready GitHub Actions workflows with zero configuration. The webhook receiver on your server? That tiny 1.7MB container above.\r\n\r\n### 🏢 Built for managing multiple projects\r\n\r\nManaging 10 clients across 5 servers?\r\n\r\n```bash\r\ngraft -p client1 logs api          # Project 1\r\ngraft -p client2 restart backend   # Project 2\r\ngraft -p client3 ps                # Project 3\r\n```\r\n\r\nGraft remembers which project lives where. You don't juggle SSH configs or server IPs.\r\n\r\n**Bonus:** `graft dns map` updates Cloudflare DNS automatically. Perfect for rotating between cloud free tiers.\r\n\r\n### 🔄 Bulletproof rollbacks\r\n\r\n```bash\r\ngraft rollback  # See deployment history, choose which to restore\r\n```\r\n\r\nEvery deployment is versioned. Broke production? Roll back in 10 seconds.\r\n\r\n---\r\n\r\n## Quick start\r\n\r\n**Already have a working `docker-compose.yml`? You're ready.**\r\n\r\n```bash\r\n# Install (Linux/macOS)\r\nbrew tap skssmd/tap \u0026\u0026 brew install graft\r\n\r\n# Initialize (point at your server)\r\ngraft init\r\n\r\n# Deploy (that's it)\r\ngraft sync\r\n\r\n# Manage like localhost\r\ngraft ps                # Status check\r\ngraft logs backend -f   # Live logs\r\ngraft map               # Update DNS\r\ngraft rollback          # Undo deployment\r\n```\r\n\r\n**Production-ready in under 5 minutes.** SSL, reverse proxy, and CI/CD all configured automatically.\r\n\r\n---\r\n\r\n## Installation\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eLinux/macOS (Homebrew)\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```bash\r\nbrew tap skssmd/tap\r\nbrew install graft\r\n```\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eDebian/Ubuntu\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```bash\r\necho \"deb [trusted=yes] https://apt.fury.io/skssmd/ /\" | sudo tee /etc/apt/sources.list.d/graft.list\r\nsudo apt update \u0026\u0026 sudo apt install graft\r\n```\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eFedora/RHEL/Amazon Linux\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```bash\r\necho \"[graft]\r\nname=Graft Repository\r\nbaseurl=https://yum.fury.io/skssmd/\r\nenabled=1\r\ngpgcheck=0\" | sudo tee /etc/yum.repos.d/graft.repo\r\nsudo yum install graft\r\n```\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eArch Linux (AUR)\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```bash\r\nyay -S graft-bin\r\n```\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eWindows\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```powershell\r\npowershell -ExecutionPolicy ByPass -Command \"iwr -useb https://raw.githubusercontent.com/skssmd/Graft/main/bin/install.ps1 | iex\"\r\n```\r\n\r\nOr via WinGet:\r\n```bash\r\nwinget install graft\r\n```\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cstrong\u003eFrom source\u003c/strong\u003e\u003c/summary\u003e\r\n\r\n```bash\r\ngit clone https://github.com/skssmd/Graft\r\ncd Graft\r\ngo build -o graft cmd/graft/main.go\r\n```\r\n\r\nRequires Go 1.24+\r\n\u003c/details\u003e\r\n\r\n---\r\n\r\n## Who is this for?\r\n\r\n**Graft is for small teams that don't need multi-server scalability** but want simple, reliable deployment without bloat.\r\n\r\n| You are... | Graft helps you... |\r\n|------------|-------------------|\r\n| 🚀 **Solo developer** | Ship projects without platform bills or resource-hogging UIs |\r\n| 👥 **Small team (2-10 people)** | Simple production setup everyone can use via CLI |\r\n| 🏢 **Agency/Freelancer** | Manage 20+ client projects without server bloat |\r\n| ☁️ **VPS optimizer** | Maximize server resources for apps, not management tools |\r\n| 🧪 **Rapid prototyper** | VPS to live SSL URL in under 5 minutes |\r\n\r\n### ❌ Not for you if...\r\n\r\n- You need multi-region, multi-server orchestration (that's Kubernetes territory)\r\n- You prefer clicking through web UIs over terminal commands\r\n- You're already running enterprise-scale infrastructure\r\n\r\n---\r\n\r\n## Graft vs. the alternatives\r\n\r\n| What | Server footprint | How you interact | Best for |\r\n|------|-----------------|------------------|----------|\r\n| **Graft** | ~2MB idle, ~15MB deploying | CLI from your machine | Developers who know Docker Compose |\r\n| **Dokploy/Coolify** | 500MB-1GB+ (UI + agent) | Web interface on server | Teams that want UI-based management |\r\n| **CapRover** | 300MB+ (UI + agent) | Web interface on server | Single-server apps with UI preference |\r\n| **Railway/Render** | Nothing (fully managed) | Web dashboard | Teams with budget, want zero ops |\r\n| **Manual setup** | Just your apps | SSH directly | Masochists with free time |\r\n\r\n**The Graft difference:** Server resources go to **your applications**, not to management software you barely use.\r\n\r\n---\r\n\r\n## Documentation\r\n\r\n**Full docs:** [graftdocs.vercel.app](https://graftdocs.vercel.app)\r\n\r\n**Common commands:**\r\n\r\n```bash\r\n# Deployment\r\ngraft init                    # One-time setup\r\ngraft sync                    # Deploy/update\r\ngraft mode                    # Change deployment mode\r\n\r\n# Management\r\ngraft ps                      # Container status\r\ngraft logs service -f         # Live logs\r\ngraft restart service         # Restart\r\ngraft exec service command    # Run commands\r\n\r\n# Multi-project\r\ngraft -p project1 logs api    # Project-specific\r\ngraft -p project2 restart     # Switch contexts\r\n\r\n# DNS \u0026 Servers\r\ngraft dns map                 # Update Cloudflare DNS\r\ngraft registry ls             # List servers\r\ngraft -sh                     # Direct SSH access\r\n\r\n# Rollback\r\ngraft rollback               # Restore previous deployment\r\ngraft rollback config        # Configure retention\r\n```\r\n\r\n---\r\n\r\n## Roadmap\r\n\r\n\r\n- [ ] Slack/Discord deployment notifications\r\n- [ ] Graft-Hook configurations\r\n\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nGraft is open source and contributions are welcome.\r\n\r\n**Before submitting features:** Open an issue to discuss. Graft intentionally stays simple and lightweight—we evaluate new features against \"does this solve a common problem without adding bloat?\"\r\n\r\nBug reports, documentation improvements, and bug fixes are always appreciated.\r\n\r\n---\r\n\r\n## License\r\n\r\nApache 2.0 License - see [LICENSE](LICENSE) file.\r\n\r\n---\r\n\r\n## Support\r\n\r\n- **Issues:** Bug reports and feature requests\r\n- **Discussions:** Questions and community chat\r\n- **Star the repo** if you find it useful 🌟\r\n\r\n---\r\n\r\n**Built by developers tired of installing 500MB web UIs just to deploy a Docker Compose app.**\r\n\r\nIf you know Docker Compose and have a server with SSH, you can use Graft. That's the whole requirement. Your server's CPU and RAM stay focused on your actual applications, not on management software.\r\n\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-graft-project%2Fgraft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthe-graft-project%2Fgraft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-graft-project%2Fgraft/lists"}