{"id":49211024,"url":"https://github.com/deploykithq/deploykit","last_synced_at":"2026-05-02T19:31:11.346Z","repository":{"id":348860867,"uuid":"1198686984","full_name":"deploykithq/deploykit","owner":"deploykithq","description":"Self-hosted PaaS for deploying apps and databases on your own infrastructure.","archived":false,"fork":false,"pushed_at":"2026-04-20T13:27:23.000Z","size":282,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-23T21:38:19.992Z","etag":null,"topics":["backend","backups","databases","deployment","devops","docker","frontend","mariadb","mongodb","mysql","postgresql","self-hosted","vps"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/deploykithq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-04-01T16:57:20.000Z","updated_at":"2026-04-20T13:27:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deploykithq/deploykit","commit_stats":null,"previous_names":["deploykithq/deploykit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/deploykithq/deploykit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deploykithq%2Fdeploykit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deploykithq%2Fdeploykit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deploykithq%2Fdeploykit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deploykithq%2Fdeploykit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deploykithq","download_url":"https://codeload.github.com/deploykithq/deploykit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deploykithq%2Fdeploykit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32547644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T19:18:06.202Z","status":"ssl_error","status_checked_at":"2026-05-02T19:16:21.335Z","response_time":132,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["backend","backups","databases","deployment","devops","docker","frontend","mariadb","mongodb","mysql","postgresql","self-hosted","vps"],"created_at":"2026-04-23T21:31:13.716Z","updated_at":"2026-05-02T19:31:11.340Z","avatar_url":"https://github.com/deploykithq.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eDeployKit\u003c/h1\u003e\n  \u003cp align=\"center\"\u003eSelf-hosted PaaS for deploying apps and databases on your own infrastructure.\u003cbr\u003eOpen-source alternative to Vercel and Heroku.\u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#tech-stack\"\u003eTech Stack\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Installation\n\nOne command on any VPS (Ubuntu/Debian/RHEL):\n\n```bash\ncurl -fsSL https://get.deploykit.es | sh\n```\n\nWith options:\n\n```bash\ncurl -fsSL https://get.deploykit.es | sh -s -- \\\n  --domain deploy.example.com \\\n  --email you@example.com \\\n  --admin-email admin@example.com \\\n  --admin-password yourpassword\n```\n\nThe installer will:\n1. Install Docker and Docker Compose (if not present)\n2. Clone DeployKit to `/opt/deploykit`\n3. Generate all secrets (JWT, encryption keys)\n4. Start all services behind Traefik with auto-SSL\n5. Create your admin account\n\n**Requirements:** Linux VPS with 1 vCPU, 1 GB RAM, 10 GB disk, and ports 80/443 open.\n\n### Update\n\n```bash\ncd /opt/deploykit \u0026\u0026 ./update.sh\n```\n\n### Uninstall\n\n```bash\ncd /opt/deploykit \u0026\u0026 ./uninstall.sh\n```\n\nUser-deployed containers are not affected by uninstall.\n\n---\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **App Deployments** | Deploy from GitHub, GitLab, any Git repo, or Docker images |\n| **Auto-Build** | Nixpacks (auto-detect), Dockerfile, or Cloud Native Buildpacks |\n| **Databases** | One-click PostgreSQL, MongoDB, Redis, MySQL, MariaDB |\n| **Auto-Deploy** | GitHub/GitLab webhooks trigger deploys on push |\n| **Preview Deployments** | Automatic PR/MR preview environments with subdomain routing |\n| **Environment Variables** | Managed in the UI, encrypted at rest with AES-256-GCM |\n| **Custom Domains** | Automatic SSL certificates via Let's Encrypt + Traefik |\n| **Real-Time Logs** | Build, deploy, and container logs streamed via Socket.IO |\n| **Monitoring** | CPU, memory, and network stats per container |\n| **Automated Backups** | Database backups with configurable retention and restore |\n| **Multi-Project** | Organize services into logical projects |\n| **Role-Based Access** | Admin, Operator, and Viewer roles with project-level overrides |\n| **Remote Servers** | Deploy to remote servers via SSH |\n| **Rollbacks** | One-click rollback to any previous deployment |\n| **Audit Logs** | Full action history with automatic retention cleanup |\n| **Notifications** | Discord, Slack, Telegram, Email, and Webhook channels |\n\n---\n\n## Development\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) \u003e= 20\n- [pnpm](https://pnpm.io/) \u003e= 9\n- [Docker](https://www.docker.com/)\n\n### Setup\n\n```bash\ngit clone https://github.com/shakarr/deploykit.git\ncd deploykit\npnpm install\n```\n\n```bash\ncp .env.example .env\n# Edit .env — generate secrets with: openssl rand -hex 32\n```\n\n```bash\ndocker compose up -d          # Start PostgreSQL, Redis, Traefik\npnpm db:generate              # Generate migration files\npnpm db:migrate               # Run migrations\npnpm dev                      # Start API + Web dev servers\n```\n\n| Service   | URL                     |\n|-----------|-------------------------|\n| Dashboard | http://localhost:5173   |\n| API       | http://localhost:3001   |\n| Traefik   | http://localhost:8080   |\n\n### Available Scripts\n\n| Command | Description |\n|---------|-------------|\n| `pnpm dev` | Start all services in development mode |\n| `pnpm dev:api` | Start only the API server |\n| `pnpm dev:web` | Start only the web dashboard |\n| `pnpm build` | Build all packages for production |\n| `pnpm db:generate` | Generate Drizzle ORM migration files |\n| `pnpm db:migrate` | Run pending database migrations |\n| `pnpm db:studio` | Open Drizzle Studio (database GUI) |\n| `pnpm lint` | Run type checking across all packages |\n\n### Manual Production Deploy\n\n```bash\ncp .env.production .env\n# Edit .env with your domain and secrets\ndocker compose -f docker-compose.prod.yml up -d --build\n```\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Frontend | React 19, Vite, Tailwind CSS v4, TanStack Router, Zustand |\n| API | Fastify, tRPC, Socket.IO |\n| Database | PostgreSQL 16, Drizzle ORM |\n| Queue | BullMQ, Redis 7 |\n| Containers | Docker (Dockerode), Traefik v3 |\n| Build | Nixpacks, Dockerfile, Cloud Native Buildpacks |\n| Auth | JWT with refresh token rotation, bcrypt |\n| Encryption | AES-256-GCM for secrets at rest |\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `DATABASE_URL` | PostgreSQL connection string | — |\n| `REDIS_URL` | Redis connection string | — |\n| `JWT_SECRET` | Secret for signing access tokens | — |\n| `JWT_REFRESH_SECRET` | Secret for signing refresh tokens | — |\n| `ENCRYPTION_KEY` | 64-char hex key for AES-256-GCM (`openssl rand -hex 32`) | — |\n| `API_PORT` | API server port | `3001` |\n| `WEB_PORT` | Dashboard port | `5173` |\n| `WEBHOOK_SECRET` | HMAC secret for GitHub/GitLab webhooks | — |\n| `AUDIT_RETENTION_DAYS` | Days to keep audit logs before cleanup | `90` |\n| `GITHUB_CLIENT_ID` | GitHub OAuth app ID (optional) | — |\n| `GITHUB_CLIENT_SECRET` | GitHub OAuth secret (optional) | — |\n\n---\n\n## How It Works\n\n```\nPush to GitHub/GitLab\n        │\n        ▼\n  Webhook received ──▶ Verify signature ──▶ Match app by repo + branch\n        │\n        ▼\n  Queue deploy job (BullMQ/Redis)\n        │\n        ▼\n  Deploy Worker\n   ├── git clone --depth 1\n   ├── Detect build strategy (Nixpacks / Dockerfile / Buildpacks)\n   ├── docker build ──▶ tag as deploykit/{name}:{commit}\n   ├── Stop previous container\n   ├── Start new container with env vars + Traefik labels\n   ├── Run health check (HTTP/TCP)\n   └── Update status ──▶ Socket.IO ──▶ Dashboard refreshes\n        │\n        ▼\n  App live at https://your-domain.com (auto-SSL)\n```\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeploykithq%2Fdeploykit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeploykithq%2Fdeploykit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeploykithq%2Fdeploykit/lists"}