{"id":45742768,"url":"https://github.com/radhakishan404/sshipit","last_synced_at":"2026-02-25T15:30:25.042Z","repository":{"id":339144206,"uuid":"1160638471","full_name":"radhakishan404/sshipit","owner":"radhakishan404","description":"CD over SSH for Node.js, Next.js, and React apps","archived":false,"fork":false,"pushed_at":"2026-02-18T12:21:35.000Z","size":3915,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-18T12:35:59.946Z","etag":null,"topics":["cicd","deployment","devops","nextjs","nodejs","react","self-hosted","ssh"],"latest_commit_sha":null,"homepage":"https://sshipit.vercel.app/","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/radhakishan404.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","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-02-18T07:28:24.000Z","updated_at":"2026-02-18T12:12:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/radhakishan404/sshipit","commit_stats":null,"previous_names":["radhakishan404/sshipit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/radhakishan404/sshipit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radhakishan404%2Fsshipit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radhakishan404%2Fsshipit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radhakishan404%2Fsshipit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radhakishan404%2Fsshipit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/radhakishan404","download_url":"https://codeload.github.com/radhakishan404/sshipit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radhakishan404%2Fsshipit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29827693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T14:53:59.163Z","status":"ssl_error","status_checked_at":"2026-02-25T14:53:23.002Z","response_time":61,"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":["cicd","deployment","devops","nextjs","nodejs","react","self-hosted","ssh"],"created_at":"2026-02-25T15:30:23.227Z","updated_at":"2026-02-25T15:30:25.036Z","avatar_url":"https://github.com/radhakishan404.png","language":"JavaScript","readme":"\u003ch1 align=\"center\"\u003e🚀 SSHipIt\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eSelf-hosted CI/CD over SSH for Node.js, Next.js, and React apps.\u003c/b\u003e\u003cbr/\u003e\n  Built for developers by developer who want production control without sharing server access.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/radhakishan404/sshipit/stargazers\"\u003e\u003cimg alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/radhakishan404/sshipit?style=for-the-badge\u0026logo=github\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/radhakishan404/sshipit/network/members\"\u003e\u003cimg alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/radhakishan404/sshipit?style=for-the-badge\u0026logo=github\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/radhakishan404/sshipit/issues\"\u003e\u003cimg alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues/radhakishan404/sshipit?style=for-the-badge\u0026logo=github\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/radhakishan404/sshipit/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/radhakishan404/sshipit/ci.yml?style=for-the-badge\u0026label=CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/radhakishan404/sshipit/blob/main/LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/radhakishan404/sshipit?style=for-the-badge\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Latest release\" src=\"https://img.shields.io/github/v/release/radhakishan404/sshipit?style=flat-square\"\u003e\n  \u003cimg alt=\"Last commit\" src=\"https://img.shields.io/github/last-commit/radhakishan404/sshipit?style=flat-square\"\u003e\n  \u003cimg alt=\"Repo size\" src=\"https://img.shields.io/github/repo-size/radhakishan404/sshipit?style=flat-square\"\u003e\n  \u003cimg alt=\"Node.js\" src=\"https://img.shields.io/badge/Node.js-18%2B-339933?style=flat-square\u0026logo=node.js\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Self-hosted\" src=\"https://img.shields.io/badge/Self--Hosted-Yes-0ea5e9?style=flat-square\"\u003e\n  \u003cimg alt=\"SSH Powered\" src=\"https://img.shields.io/badge/SSH-Powered-10b981?style=flat-square\"\u003e\n  \u003cimg alt=\"PRs welcome\" src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\"\u003e\n\u003c/p\u003e\n\n---\n\n## 😅 Why I Built This\n\nI was doing deployments like this:\n\n`ssh -\u003e git pull -\u003e npm install -\u003e build -\u003e migrate -\u003e pm2 restart -\u003e repeat`\n\nAcross multiple servers. Every day.\n\nSo I built **SSHipIt**:\n- No GitHub Actions dependency\n- No sharing production server with third-party CI\n- No one-env-key-at-a-time UI pain\n- Just clean, local-first, SSH-native deployments\n\nIf this saves your time, star it and share it.\n\n## ✨ What It Does\n\n- 📦 Project management for Node.js, Next.js, React\n- 🖥️ Reusable SSH servers across projects\n- 🔐 Encrypted server credentials (AES-256-GCM at rest)\n- ⚙️ Smart stack defaults (install/build/start/restart)\n- 🌱 Bulk `.env` editing for production\n- 🚚 Manual deploy + one-click redeploy\n- 📜 Live log streaming over WebSocket\n- 🧭 Deployment history with filtering + cancel/delete\n- 🧱 Release folders + `current` symlink strategy\n- 🧪 Migration support (Prisma / Sequelize / Knex / TypeORM)\n\n## 🧠 Architecture\n\n```mermaid\nflowchart LR\n    UI[\"SSHipIt UI (Browser)\"] --\u003e API[\"Node.js API + WebSocket\"]\n    API --\u003e DB[\"SQLite (projects, env, servers, deployments)\"]\n    API --\u003e RUNNER[\"Deploy Runner\"]\n    RUNNER --\u003e LOCAL[\"Local workspace deploy\"]\n    RUNNER --\u003e SSH[\"Remote deploy over SSH\"]\n    SSH --\u003e TARGET[\"Server (repo, releases, current, pm2)\"]\n```\n\n## ⚡ Quick Start (60 seconds)\n\n```bash\ngit clone https://github.com/radhakishan404/sshipit.git\ncd sshipit\nnpm install\ncp .env.example .env\nnpm start\n```\n\nOpen: `http://localhost:3000`\n\nRequired `.env` keys:\n- `PORT`\n- `DATABASE_PATH`\n- `WORKSPACE_ROOT`\n- `KEEP_RELEASES`\n- `ENCRYPTION_KEY` (set a long random value in production)\n\n## 🛠️ First Deployment\n\n1. Create a project\n2. Select framework and click smart defaults\n3. Paste production env in bulk\n4. Add or attach an SSH server\n5. Test connection\n6. Select target server\n7. Click `Deploy Now`\n8. Follow live logs\n\n## 🧩 Default Stack Behavior\n\n| Stack | Install | Build | Restart |\n|---|---|---|---|\n| Node.js | `npm ci \\|\\| npm install` | optional | PM2 restart/start fallback |\n| Next.js | `npm ci \\|\\| npm install` | `npm run build` | PM2 restart/start fallback |\n| React | `npm ci \\|\\| npm install` | `npm run build` | usually nginx reload |\n\nYou can override all commands per project.\n\n## 🔌 API + WebSocket\n\nCore APIs:\n- `GET /api/projects`\n- `POST /api/projects`\n- `PUT /api/projects/:id`\n- `DELETE /api/projects/:id`\n- `GET /api/projects/:id/env`\n- `POST /api/projects/:id/env/bulk`\n- `GET /api/projects/:id/servers`\n- `POST /api/projects/:id/deploy`\n- `GET /api/projects/:id/deployments`\n- `POST /api/deployments/:id/redeploy`\n- `POST /api/deployments/:id/cancel`\n- `DELETE /api/deployments/:id`\n\nWebSocket:\n- `ws://localhost:3000/ws`\n\n## 📚 Dependency Map\n\n| Dependency | Use |\n|---|---|\n| `express` | HTTP API |\n| `ws` | Live logs/events over WebSocket |\n| `better-sqlite3` | Local metadata DB |\n| `ssh2` | SSH execution and remote deploy |\n| `dotenv` | Runtime env loading |\n| `zod` | Request validation |\n| `uuid` | IDs |\n| `cors`, `morgan` | API support + logs |\n\n## 🗺️ Roadmap (PRs Welcome)\n\n- Git webhook auto-deploy (GitHub/GitLab/Bitbucket)\n- Build/test quality gates\n- Health-check gate before success\n- One-click rollback\n- Blue/green and canary rollout options\n- Secret backends (Vault, SSM)\n- Slack/Discord/email notifications\n- Multi-user auth + RBAC\n- Docker/Compose mode\n- Kubernetes target adapter\n- Deployment analytics dashboard\n\nIf you want to build one, open a PR.\n\n## 📣 Want Users? Read This\n\nA practical growth plan is here:\n- [`DISCOVERABILITY_PLAN.md`](./DISCOVERABILITY_PLAN.md)\n\nIt includes:\n- launch-week checklist\n- where to post\n- post templates (X/LinkedIn/Reddit/dev.to)\n- repeatable content strategy for stars + users\n\n## 🤝 Contributing\n\n- Read [`CONTRIBUTING.md`](./CONTRIBUTING.md)\n- Use issue templates in `.github/ISSUE_TEMPLATE`\n- Keep PRs focused and include logs/screenshots for deploy/UI changes\n\n## 🔐 Security\n\nPlease read [`SECURITY.md`](./SECURITY.md) for responsible disclosure.\n\n## 📄 License\n\nMIT - see [`LICENSE`](./LICENSE).\n\n## 🧭 Maintainer Setup (GitHub UI)\n\nTo complete project hygiene, set these in the repo settings:\n\n- Description:\n  - `Self-hosted CI/CD over SSH for Node.js, Next.js, and React apps`\n- Website:\n  - `https://github.com/radhakishan404/sshipit#readme`\n- Topics:\n  - `cicd`, `self-hosted`, `ssh`, `deployment`, `nodejs`, `nextjs`, `react`, `devops`\n- Enable:\n  - Discussions\n  - Issues\n  - Wikis (optional)\n  - Security advisories\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradhakishan404%2Fsshipit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradhakishan404%2Fsshipit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradhakishan404%2Fsshipit/lists"}