vibecarbon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +188 -0
  3. package/carbon/.claude/hooks/task-completed-gate.sh +19 -0
  4. package/carbon/.claude/hooks/teammate-idle-gate.sh +29 -0
  5. package/carbon/.claude/settings.json +29 -0
  6. package/carbon/.cursor/rules/vibecarbon.mdc +6 -0
  7. package/carbon/.dockerignore +57 -0
  8. package/carbon/.env.example +219 -0
  9. package/carbon/.github/copilot-instructions.md +3 -0
  10. package/carbon/.github/workflows/deploy.yml +346 -0
  11. package/carbon/.github/workflows/vibecarbon-build.yml +81 -0
  12. package/carbon/.windsurfrules +74 -0
  13. package/carbon/AGENTS.md +422 -0
  14. package/carbon/CLAUDE.md +3 -0
  15. package/carbon/DEVELOPMENT.md +187 -0
  16. package/carbon/Dockerfile +98 -0
  17. package/carbon/LICENSE +21 -0
  18. package/carbon/PRODUCTION.md +364 -0
  19. package/carbon/README.md +193 -0
  20. package/carbon/TESTING.md +138 -0
  21. package/carbon/backup/Dockerfile +75 -0
  22. package/carbon/backup/backup.sh +95 -0
  23. package/carbon/backup/compose-backup.sh +140 -0
  24. package/carbon/biome.json +83 -0
  25. package/carbon/cloud-init/docker-ce-setup.yaml +55 -0
  26. package/carbon/cloud-init/k3s/master-init.sh +215 -0
  27. package/carbon/cloud-init/k3s/supabase-init.sh +167 -0
  28. package/carbon/cloud-init/k3s/worker-init.sh +147 -0
  29. package/carbon/components.json +24 -0
  30. package/carbon/content/blog/authentication-guide.mdx +34 -0
  31. package/carbon/content/blog/getting-started.mdx +41 -0
  32. package/carbon/content/changelog/v0-1-0.mdx +40 -0
  33. package/carbon/content/docs/analytics.mdx +90 -0
  34. package/carbon/content/docs/authentication.mdx +231 -0
  35. package/carbon/content/docs/background-jobs.mdx +116 -0
  36. package/carbon/content/docs/cli.mdx +630 -0
  37. package/carbon/content/docs/database.mdx +236 -0
  38. package/carbon/content/docs/deployment.mdx +227 -0
  39. package/carbon/content/docs/development.mdx +238 -0
  40. package/carbon/content/docs/environments.mdx +84 -0
  41. package/carbon/content/docs/getting-started.mdx +112 -0
  42. package/carbon/content/docs/legal/privacy-policy.mdx +89 -0
  43. package/carbon/content/docs/legal/terms-of-service.mdx +99 -0
  44. package/carbon/content/docs/optional-services.mdx +160 -0
  45. package/carbon/db/Dockerfile +23 -0
  46. package/carbon/docker-compose.dev-init.yml +5 -0
  47. package/carbon/docker-compose.metabase.override.yml +14 -0
  48. package/carbon/docker-compose.metabase.prod.yml +28 -0
  49. package/carbon/docker-compose.metabase.yml +84 -0
  50. package/carbon/docker-compose.n8n.override.yml +14 -0
  51. package/carbon/docker-compose.n8n.prod.yml +31 -0
  52. package/carbon/docker-compose.n8n.yml +97 -0
  53. package/carbon/docker-compose.observability.override.yml +18 -0
  54. package/carbon/docker-compose.observability.prod.yml +28 -0
  55. package/carbon/docker-compose.observability.yml +125 -0
  56. package/carbon/docker-compose.override.yml +28 -0
  57. package/carbon/docker-compose.prod.yml +294 -0
  58. package/carbon/docker-compose.yml +508 -0
  59. package/carbon/docker-entrypoint.sh +12 -0
  60. package/carbon/ha/activate-standby.sh +52 -0
  61. package/carbon/ha/primary-init.sql +36 -0
  62. package/carbon/ha/standby-init.sh +74 -0
  63. package/carbon/k8s/LICENSE +99 -0
  64. package/carbon/k8s/README.md +272 -0
  65. package/carbon/k8s/base/app/deployment.yaml +130 -0
  66. package/carbon/k8s/base/app/hpa.yaml +44 -0
  67. package/carbon/k8s/base/app/kustomization.yaml +10 -0
  68. package/carbon/k8s/base/app/network-policy.yaml +124 -0
  69. package/carbon/k8s/base/app/pdb.yaml +14 -0
  70. package/carbon/k8s/base/app/rbac.yaml +36 -0
  71. package/carbon/k8s/base/app/service.yaml +16 -0
  72. package/carbon/k8s/base/backup/cronjob.yaml +120 -0
  73. package/carbon/k8s/base/backup/kustomization.yaml +7 -0
  74. package/carbon/k8s/base/backup/network-policy.yaml +31 -0
  75. package/carbon/k8s/base/backup/rbac.yaml +7 -0
  76. package/carbon/k8s/base/cluster-autoscaler/deployment.yaml +103 -0
  77. package/carbon/k8s/base/cluster-autoscaler/kustomization.yaml +17 -0
  78. package/carbon/k8s/base/cluster-autoscaler/rbac.yaml +109 -0
  79. package/carbon/k8s/base/config/configmap.yaml +48 -0
  80. package/carbon/k8s/base/config/kustomization.yaml +8 -0
  81. package/carbon/k8s/base/hetzner-ccm/kustomization.yaml +9 -0
  82. package/carbon/k8s/base/hetzner-csi/kustomization.yaml +9 -0
  83. package/carbon/k8s/base/kustomization.yaml +43 -0
  84. package/carbon/k8s/base/namespace.yaml +7 -0
  85. package/carbon/k8s/base/network-policies.yaml +95 -0
  86. package/carbon/k8s/base/registry/kustomization.yaml +5 -0
  87. package/carbon/k8s/base/registry/local-registry.yaml +193 -0
  88. package/carbon/k8s/base/traefik/certificate.yaml +21 -0
  89. package/carbon/k8s/base/traefik/configmap.yaml +13 -0
  90. package/carbon/k8s/base/traefik/deployment.yaml +165 -0
  91. package/carbon/k8s/base/traefik/ingressroute.yaml +141 -0
  92. package/carbon/k8s/base/traefik/kustomization.yaml +11 -0
  93. package/carbon/k8s/base/traefik/middleware.yaml +109 -0
  94. package/carbon/k8s/base/traefik/network-policy.yaml +92 -0
  95. package/carbon/k8s/base/traefik/service.yaml +38 -0
  96. package/carbon/k8s/flux/README.md +49 -0
  97. package/carbon/k8s/flux/clusters/primary/vibecarbon.yaml +128 -0
  98. package/carbon/k8s/flux/clusters/standby/vibecarbon.yaml +83 -0
  99. package/carbon/k8s/gitops/cert-manager-webhook-hetzner/helm-release.yaml +38 -0
  100. package/carbon/k8s/gitops/cert-manager-webhook-hetzner/helm-repository.yaml +16 -0
  101. package/carbon/k8s/gitops/cert-manager-webhook-hetzner/kustomization.yaml +10 -0
  102. package/carbon/k8s/gitops/supabase/helm-release.yaml +66 -0
  103. package/carbon/k8s/gitops/supabase/helm-repository.yaml +18 -0
  104. package/carbon/k8s/gitops/supabase/kustomization.yaml +33 -0
  105. package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-cloudflare.yaml +51 -0
  106. package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-hetzner.yaml +59 -0
  107. package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-manual.yaml +43 -0
  108. package/carbon/k8s/infra/cert-manager-resources/kustomization.yaml +15 -0
  109. package/carbon/k8s/infra/kustomization.yaml +21 -0
  110. package/carbon/k8s/infra/traefik-crds/kustomization.yaml +10 -0
  111. package/carbon/k8s/overlays/local/configmap.yaml +23 -0
  112. package/carbon/k8s/overlays/local/ingressroute-studio.yaml +104 -0
  113. package/carbon/k8s/overlays/local/kustomization.yaml +215 -0
  114. package/carbon/k8s/overlays/local/namespace.yaml +8 -0
  115. package/carbon/k8s/overlays/local/secrets.yaml +32 -0
  116. package/carbon/k8s/overlays/production/kustomization.yaml +34 -0
  117. package/carbon/k8s/test-local.sh +318 -0
  118. package/carbon/k8s/values/supabase.values.yaml +133 -0
  119. package/carbon/package.json +154 -0
  120. package/carbon/runtime.Dockerfile +17 -0
  121. package/carbon/scripts/_dev-jwt.mjs +45 -0
  122. package/carbon/scripts/check-rls.ts +53 -0
  123. package/carbon/scripts/dev-init.js +191 -0
  124. package/carbon/scripts/dev.js +191 -0
  125. package/carbon/scripts/docker-down.js +63 -0
  126. package/carbon/scripts/docker-logs.js +59 -0
  127. package/carbon/scripts/docker-up.js +222 -0
  128. package/carbon/scripts/generate-dev-configs.sh +131 -0
  129. package/carbon/scripts/generate-rss.ts +116 -0
  130. package/carbon/scripts/generate-sitemap.ts +102 -0
  131. package/carbon/scripts/k8s-apply.js +71 -0
  132. package/carbon/scripts/k8s-delete.js +75 -0
  133. package/carbon/scripts/lib/manifest.js +176 -0
  134. package/carbon/scripts/secret-scan.mjs +278 -0
  135. package/carbon/scripts/validate-dev-configs.sh +101 -0
  136. package/carbon/src/client/App.tsx +202 -0
  137. package/carbon/src/client/assets/hyperformant-dark.svg +29 -0
  138. package/carbon/src/client/assets/hyperformant-light.svg +29 -0
  139. package/carbon/src/client/assets/logos/aider.svg +1 -0
  140. package/carbon/src/client/assets/logos/antigravity.svg +1 -0
  141. package/carbon/src/client/assets/logos/bolt.svg +1 -0
  142. package/carbon/src/client/assets/logos/claude-code.svg +1 -0
  143. package/carbon/src/client/assets/logos/copilot.svg +1 -0
  144. package/carbon/src/client/assets/logos/cursor.svg +1 -0
  145. package/carbon/src/client/assets/logos/gemini-cli.svg +1 -0
  146. package/carbon/src/client/assets/logos/lovable.svg +1 -0
  147. package/carbon/src/client/assets/logos/openai-codex.svg +1 -0
  148. package/carbon/src/client/assets/logos/v0.svg +1 -0
  149. package/carbon/src/client/assets/logos/windsurf.svg +1 -0
  150. package/carbon/src/client/assets/vibecarbon-icon.svg +19 -0
  151. package/carbon/src/client/assets/vibecarbon-logo-dark.svg +29 -0
  152. package/carbon/src/client/assets/vibecarbon-logo-light.svg +29 -0
  153. package/carbon/src/client/components/AIIntegrationSection.tsx +120 -0
  154. package/carbon/src/client/components/AppSidebar.tsx +760 -0
  155. package/carbon/src/client/components/ArchitectureSection.tsx +46 -0
  156. package/carbon/src/client/components/CTAFooter.tsx +59 -0
  157. package/carbon/src/client/components/ComparisonSection.tsx +132 -0
  158. package/carbon/src/client/components/ContentPanel.tsx +66 -0
  159. package/carbon/src/client/components/ContentSkeleton.tsx +21 -0
  160. package/carbon/src/client/components/ErrorBoundary.tsx +46 -0
  161. package/carbon/src/client/components/FAQSection.tsx +76 -0
  162. package/carbon/src/client/components/FileUpload.tsx +210 -0
  163. package/carbon/src/client/components/HeaderActions.tsx +17 -0
  164. package/carbon/src/client/components/Hero.tsx +608 -0
  165. package/carbon/src/client/components/ImpersonationBanner.tsx +31 -0
  166. package/carbon/src/client/components/LanguageSwitcher.tsx +67 -0
  167. package/carbon/src/client/components/Logo.tsx +87 -0
  168. package/carbon/src/client/components/LogoStrip.tsx +76 -0
  169. package/carbon/src/client/components/MetricsStrip.tsx +48 -0
  170. package/carbon/src/client/components/Nav.tsx +195 -0
  171. package/carbon/src/client/components/NewsletterSignup.tsx +147 -0
  172. package/carbon/src/client/components/NotificationDrawer.tsx +171 -0
  173. package/carbon/src/client/components/PageHeader.tsx +24 -0
  174. package/carbon/src/client/components/PlanGate.tsx +36 -0
  175. package/carbon/src/client/components/PricingSection.tsx +371 -0
  176. package/carbon/src/client/components/SEO.tsx +34 -0
  177. package/carbon/src/client/components/SmoothScroll.tsx +45 -0
  178. package/carbon/src/client/components/TechStackSection.tsx +165 -0
  179. package/carbon/src/client/components/WorkflowSection.tsx +604 -0
  180. package/carbon/src/client/components/admin/DockerLogs.tsx +276 -0
  181. package/carbon/src/client/components/admin/PerformanceMetrics.tsx +230 -0
  182. package/carbon/src/client/components/admin/ServiceCard.tsx +45 -0
  183. package/carbon/src/client/components/admin/ServicesStatus.tsx +296 -0
  184. package/carbon/src/client/components/architecture/ArchitectureDiagram.tsx +413 -0
  185. package/carbon/src/client/components/auth/AuthProvider.tsx +466 -0
  186. package/carbon/src/client/components/effects/FilmGrainOverlay.tsx +35 -0
  187. package/carbon/src/client/components/effects/FresnelEdge.tsx +49 -0
  188. package/carbon/src/client/components/effects/GlowTracker.tsx +46 -0
  189. package/carbon/src/client/components/effects/SparkBurst.tsx +145 -0
  190. package/carbon/src/client/components/effects/VGlowEffect.tsx +83 -0
  191. package/carbon/src/client/components/effects/index.ts +2 -0
  192. package/carbon/src/client/components/layouts/SidebarLayout.tsx +20 -0
  193. package/carbon/src/client/components/scroll/ScrollSection.tsx +76 -0
  194. package/carbon/src/client/components/scroll/ScrollytellingProvider.tsx +81 -0
  195. package/carbon/src/client/components/scroll/index.ts +2 -0
  196. package/carbon/src/client/components/ui/accordion.tsx +71 -0
  197. package/carbon/src/client/components/ui/alert-dialog.tsx +162 -0
  198. package/carbon/src/client/components/ui/alert.tsx +73 -0
  199. package/carbon/src/client/components/ui/aspect-ratio.tsx +22 -0
  200. package/carbon/src/client/components/ui/avatar.tsx +91 -0
  201. package/carbon/src/client/components/ui/badge.tsx +50 -0
  202. package/carbon/src/client/components/ui/breadcrumb.tsx +100 -0
  203. package/carbon/src/client/components/ui/button-group.tsx +78 -0
  204. package/carbon/src/client/components/ui/button.tsx +120 -0
  205. package/carbon/src/client/components/ui/calendar.tsx +182 -0
  206. package/carbon/src/client/components/ui/card.tsx +85 -0
  207. package/carbon/src/client/components/ui/carousel.tsx +227 -0
  208. package/carbon/src/client/components/ui/chart.tsx +357 -0
  209. package/carbon/src/client/components/ui/checkbox.tsx +27 -0
  210. package/carbon/src/client/components/ui/collapsible.tsx +15 -0
  211. package/carbon/src/client/components/ui/command.tsx +178 -0
  212. package/carbon/src/client/components/ui/context-menu.tsx +233 -0
  213. package/carbon/src/client/components/ui/dialog.tsx +132 -0
  214. package/carbon/src/client/components/ui/drawer.tsx +118 -0
  215. package/carbon/src/client/components/ui/dropdown-menu.tsx +242 -0
  216. package/carbon/src/client/components/ui/empty.tsx +94 -0
  217. package/carbon/src/client/components/ui/field.tsx +226 -0
  218. package/carbon/src/client/components/ui/hover-card.tsx +44 -0
  219. package/carbon/src/client/components/ui/input-group.tsx +146 -0
  220. package/carbon/src/client/components/ui/input-otp.tsx +83 -0
  221. package/carbon/src/client/components/ui/input.tsx +20 -0
  222. package/carbon/src/client/components/ui/item.tsx +188 -0
  223. package/carbon/src/client/components/ui/kbd.tsx +26 -0
  224. package/carbon/src/client/components/ui/label.tsx +21 -0
  225. package/carbon/src/client/components/ui/menubar.tsx +250 -0
  226. package/carbon/src/client/components/ui/navigation-menu.tsx +155 -0
  227. package/carbon/src/client/components/ui/pagination.tsx +102 -0
  228. package/carbon/src/client/components/ui/popover.tsx +75 -0
  229. package/carbon/src/client/components/ui/progress.tsx +66 -0
  230. package/carbon/src/client/components/ui/radio-group.tsx +36 -0
  231. package/carbon/src/client/components/ui/resizable.tsx +46 -0
  232. package/carbon/src/client/components/ui/scroll-area.tsx +48 -0
  233. package/carbon/src/client/components/ui/select.tsx +186 -0
  234. package/carbon/src/client/components/ui/separator.tsx +21 -0
  235. package/carbon/src/client/components/ui/sheet.tsx +124 -0
  236. package/carbon/src/client/components/ui/sidebar.tsx +702 -0
  237. package/carbon/src/client/components/ui/skeleton.tsx +13 -0
  238. package/carbon/src/client/components/ui/slider.tsx +57 -0
  239. package/carbon/src/client/components/ui/sonner.tsx +45 -0
  240. package/carbon/src/client/components/ui/spinner.tsx +15 -0
  241. package/carbon/src/client/components/ui/switch.tsx +30 -0
  242. package/carbon/src/client/components/ui/table.tsx +89 -0
  243. package/carbon/src/client/components/ui/tabs.tsx +73 -0
  244. package/carbon/src/client/components/ui/textarea.tsx +18 -0
  245. package/carbon/src/client/components/ui/toggle-group.tsx +87 -0
  246. package/carbon/src/client/components/ui/toggle.tsx +44 -0
  247. package/carbon/src/client/components/ui/tooltip.tsx +56 -0
  248. package/carbon/src/client/hooks/api/index.ts +14 -0
  249. package/carbon/src/client/hooks/api/useAuthSettings.ts +80 -0
  250. package/carbon/src/client/hooks/api/useSubscription.ts +87 -0
  251. package/carbon/src/client/hooks/use-mobile.ts +21 -0
  252. package/carbon/src/client/hooks/useMousePosition.ts +91 -0
  253. package/carbon/src/client/hooks/useNotifications.tsx +124 -0
  254. package/carbon/src/client/hooks/useOrganizationMembers.ts +127 -0
  255. package/carbon/src/client/hooks/useOrganizations.tsx +230 -0
  256. package/carbon/src/client/hooks/usePackageManager.ts +69 -0
  257. package/carbon/src/client/hooks/useReducedMotion.ts +20 -0
  258. package/carbon/src/client/hooks/useRunningServices.ts +114 -0
  259. package/carbon/src/client/hooks/useScrollProgress.ts +56 -0
  260. package/carbon/src/client/index.css +467 -0
  261. package/carbon/src/client/index.html +56 -0
  262. package/carbon/src/client/lib/admin-services.ts +151 -0
  263. package/carbon/src/client/lib/api.ts +32 -0
  264. package/carbon/src/client/lib/blog.ts +35 -0
  265. package/carbon/src/client/lib/changelog.ts +33 -0
  266. package/carbon/src/client/lib/docs-search.ts +101 -0
  267. package/carbon/src/client/lib/docs.ts +37 -0
  268. package/carbon/src/client/lib/i18n.ts +32 -0
  269. package/carbon/src/client/lib/supabase.ts +72 -0
  270. package/carbon/src/client/lib/tailwind-colors.ts +357 -0
  271. package/carbon/src/client/lib/theme.ts +117 -0
  272. package/carbon/src/client/lib/utils.ts +22 -0
  273. package/carbon/src/client/locales/de.json +529 -0
  274. package/carbon/src/client/locales/en.json +461 -0
  275. package/carbon/src/client/locales/es.json +529 -0
  276. package/carbon/src/client/locales/fr.json +529 -0
  277. package/carbon/src/client/locales/pt.json +529 -0
  278. package/carbon/src/client/main.tsx +56 -0
  279. package/carbon/src/client/mdx.d.ts +13 -0
  280. package/carbon/src/client/pages/ApiDocs.tsx +76 -0
  281. package/carbon/src/client/pages/AuthCallback.tsx +34 -0
  282. package/carbon/src/client/pages/Blog.tsx +167 -0
  283. package/carbon/src/client/pages/Changelog.tsx +171 -0
  284. package/carbon/src/client/pages/Charts.tsx +388 -0
  285. package/carbon/src/client/pages/Checkout.tsx +227 -0
  286. package/carbon/src/client/pages/Contact.tsx +174 -0
  287. package/carbon/src/client/pages/Dashboard.tsx +368 -0
  288. package/carbon/src/client/pages/Docs.tsx +372 -0
  289. package/carbon/src/client/pages/ForgotPassword.tsx +111 -0
  290. package/carbon/src/client/pages/Home.tsx +187 -0
  291. package/carbon/src/client/pages/Legal.tsx +100 -0
  292. package/carbon/src/client/pages/Login.tsx +408 -0
  293. package/carbon/src/client/pages/MFAVerify.tsx +156 -0
  294. package/carbon/src/client/pages/NotFound.tsx +21 -0
  295. package/carbon/src/client/pages/Onboarding.tsx +246 -0
  296. package/carbon/src/client/pages/ResetPassword.tsx +200 -0
  297. package/carbon/src/client/pages/UIComponents.tsx +390 -0
  298. package/carbon/src/client/pages/admin/ContactSubmissions.tsx +220 -0
  299. package/carbon/src/client/pages/admin/Dashboard.tsx +24 -0
  300. package/carbon/src/client/pages/admin/Infrastructure.tsx +257 -0
  301. package/carbon/src/client/pages/admin/Jobs.tsx +225 -0
  302. package/carbon/src/client/pages/admin/Logs.tsx +18 -0
  303. package/carbon/src/client/pages/admin/Newsletter.tsx +300 -0
  304. package/carbon/src/client/pages/admin/Notifications.tsx +603 -0
  305. package/carbon/src/client/pages/admin/Organizations.tsx +306 -0
  306. package/carbon/src/client/pages/admin/Settings.tsx +314 -0
  307. package/carbon/src/client/pages/admin/Theme.tsx +465 -0
  308. package/carbon/src/client/pages/admin/Users.tsx +365 -0
  309. package/carbon/src/client/pages/api-docs.css +156 -0
  310. package/carbon/src/client/pages/organizations/Details.tsx +200 -0
  311. package/carbon/src/client/pages/organizations/Members.tsx +402 -0
  312. package/carbon/src/client/pages/settings/Billing.tsx +473 -0
  313. package/carbon/src/client/pages/settings/Profile.tsx +160 -0
  314. package/carbon/src/client/pages/settings/Security.tsx +341 -0
  315. package/carbon/src/client/public/favicon.svg +19 -0
  316. package/carbon/src/client/public/robots.txt +8 -0
  317. package/carbon/src/server/billing/index.ts +104 -0
  318. package/carbon/src/server/billing/provider.ts +81 -0
  319. package/carbon/src/server/billing/providers/paddle.ts +314 -0
  320. package/carbon/src/server/billing/providers/polar.ts +325 -0
  321. package/carbon/src/server/billing/providers/stripe.ts +233 -0
  322. package/carbon/src/server/emails/templates.ts +116 -0
  323. package/carbon/src/server/index.ts +554 -0
  324. package/carbon/src/server/lib/auth.ts +6 -0
  325. package/carbon/src/server/lib/email.ts +64 -0
  326. package/carbon/src/server/lib/env.ts +112 -0
  327. package/carbon/src/server/lib/errors.ts +21 -0
  328. package/carbon/src/server/lib/logger.ts +17 -0
  329. package/carbon/src/server/lib/rate-limiter.ts +288 -0
  330. package/carbon/src/server/lib/request.ts +34 -0
  331. package/carbon/src/server/lib/stripe.ts +42 -0
  332. package/carbon/src/server/lib/supabase.ts +65 -0
  333. package/carbon/src/server/middleware/requirePlan.ts +80 -0
  334. package/carbon/src/server/routes/_internal/services-status.ts +958 -0
  335. package/carbon/src/server/routes/_internal/verify-role.ts +185 -0
  336. package/carbon/src/server/routes/health.ts +48 -0
  337. package/carbon/src/server/routes/v1/admin/contact.ts +128 -0
  338. package/carbon/src/server/routes/v1/admin/jobs.ts +171 -0
  339. package/carbon/src/server/routes/v1/admin/newsletter.ts +237 -0
  340. package/carbon/src/server/routes/v1/auth.ts +390 -0
  341. package/carbon/src/server/routes/v1/billing.ts +718 -0
  342. package/carbon/src/server/routes/v1/contact.ts +93 -0
  343. package/carbon/src/server/routes/v1/index.ts +1333 -0
  344. package/carbon/src/server/routes/v1/newsletter.ts +181 -0
  345. package/carbon/src/server/routes/v1/performance.ts +157 -0
  346. package/carbon/src/server/routes/v1/stats.ts +170 -0
  347. package/carbon/src/server/routes/v1/theme.ts +106 -0
  348. package/carbon/src/server/routes/webhooks/billing.ts +376 -0
  349. package/carbon/src/server/routes/webhooks/stripe.ts +276 -0
  350. package/carbon/src/server/types.ts +11 -0
  351. package/carbon/src/shared/pricing.ts +155 -0
  352. package/carbon/src/shared/types.ts +338 -0
  353. package/carbon/supabase/migrations/00001_init.sql +717 -0
  354. package/carbon/supabase/migrations/00002_theme_settings.sql +13 -0
  355. package/carbon/supabase/migrations/00003_pg_cron.sql +121 -0
  356. package/carbon/supabase/migrations/00004_contact_newsletter.sql +81 -0
  357. package/carbon/supabase/migrations/00005_localization_languages.sql +22 -0
  358. package/carbon/supabase/seed.sql +16 -0
  359. package/carbon/tests/_helpers/app.ts +45 -0
  360. package/carbon/tests/_helpers/env.ts +37 -0
  361. package/carbon/tests/_helpers/factories.ts +69 -0
  362. package/carbon/tests/_helpers/jwt.ts +23 -0
  363. package/carbon/tests/_helpers/setup-integration.ts +20 -0
  364. package/carbon/tests/_helpers/setup-rtl.ts +12 -0
  365. package/carbon/tests/component/ErrorBoundary.test.tsx +53 -0
  366. package/carbon/tests/component/use-auth-settings.test.tsx +119 -0
  367. package/carbon/tests/integration/server/routes/contact.test.ts +162 -0
  368. package/carbon/tests/integration/server/routes/health.test.ts +61 -0
  369. package/carbon/tests/structural/i18n-parity.test.ts +42 -0
  370. package/carbon/tests/unit/client/utils.test.ts +49 -0
  371. package/carbon/tests/unit/shared/pricing.test.ts +93 -0
  372. package/carbon/tsconfig.json +27 -0
  373. package/carbon/tsconfig.server.json +27 -0
  374. package/carbon/tsconfig.test.json +9 -0
  375. package/carbon/vite.config.ts +110 -0
  376. package/carbon/vitest.config.ts +74 -0
  377. package/carbon/volumes/db/jwt.sql +57 -0
  378. package/carbon/volumes/db/metabase-init.sh +29 -0
  379. package/carbon/volumes/db/n8n-init.sh +25 -0
  380. package/carbon/volumes/db/realtime.sql +33 -0
  381. package/carbon/volumes/db/roles.sql +93 -0
  382. package/carbon/volumes/db/set-passwords.sh +12 -0
  383. package/carbon/volumes/db/super-admin.dev.sql +113 -0
  384. package/carbon/volumes/db/super-admin.generated.sql +113 -0
  385. package/carbon/volumes/db/super-admin.sql +114 -0
  386. package/carbon/volumes/grafana/dashboards/logs.json +179 -0
  387. package/carbon/volumes/grafana/dashboards/overview.json +523 -0
  388. package/carbon/volumes/grafana/dashboards/postgresql.json +337 -0
  389. package/carbon/volumes/grafana/dashboards.dev/logs.json +179 -0
  390. package/carbon/volumes/grafana/dashboards.dev/overview.json +156 -0
  391. package/carbon/volumes/grafana/dashboards.dev/postgresql.json +337 -0
  392. package/carbon/volumes/grafana/provisioning/dashboards/dashboards.dev.yml +16 -0
  393. package/carbon/volumes/grafana/provisioning/dashboards/dashboards.yml +16 -0
  394. package/carbon/volumes/grafana/provisioning/datasources/datasources.yml +43 -0
  395. package/carbon/volumes/kong/docker-entrypoint.sh +9 -0
  396. package/carbon/volumes/kong/kong.yml +208 -0
  397. package/carbon/volumes/loki/loki-config.yml +58 -0
  398. package/carbon/volumes/n8n/hooks.js +131 -0
  399. package/carbon/volumes/n8n/scripts/setup.sh +66 -0
  400. package/carbon/volumes/prometheus/prometheus.yml +43 -0
  401. package/carbon/volumes/promtail/promtail-config.yml +64 -0
  402. package/carbon/volumes/traefik/middlewares.dev.yml +83 -0
  403. package/carbon/volumes/traefik/middlewares.yml +95 -0
  404. package/carbon/volumes/traefik/vite-dev.yml +20 -0
  405. package/package.json +95 -0
  406. package/src/access.js +354 -0
  407. package/src/activate.js +187 -0
  408. package/src/add.js +718 -0
  409. package/src/backup.js +786 -0
  410. package/src/cli.js +350 -0
  411. package/src/configure.js +967 -0
  412. package/src/console.js +155 -0
  413. package/src/create.js +1499 -0
  414. package/src/deploy.js +311 -0
  415. package/src/destroy.js +2033 -0
  416. package/src/diagnose.js +735 -0
  417. package/src/down.js +80 -0
  418. package/src/failover.js +1032 -0
  419. package/src/lib/backup-s3.js +179 -0
  420. package/src/lib/build.js +33 -0
  421. package/src/lib/checksum.js +28 -0
  422. package/src/lib/ci-setup.js +666 -0
  423. package/src/lib/cli/help.js +129 -0
  424. package/src/lib/cli/parse-flags.js +160 -0
  425. package/src/lib/cli/select-action.js +65 -0
  426. package/src/lib/cli/select-environment.js +108 -0
  427. package/src/lib/cli/tty-guard.js +75 -0
  428. package/src/lib/cloudflare.js +447 -0
  429. package/src/lib/colors.js +52 -0
  430. package/src/lib/command.js +361 -0
  431. package/src/lib/config.js +359 -0
  432. package/src/lib/cost.js +103 -0
  433. package/src/lib/deploy/bundle.js +231 -0
  434. package/src/lib/deploy/compose/acme-verify.js +121 -0
  435. package/src/lib/deploy/compose/build-args.js +78 -0
  436. package/src/lib/deploy/compose/ha.js +1874 -0
  437. package/src/lib/deploy/compose/index.js +1294 -0
  438. package/src/lib/deploy/compose/reconcile.js +74 -0
  439. package/src/lib/deploy/github.js +382 -0
  440. package/src/lib/deploy/image.js +191 -0
  441. package/src/lib/deploy/index.js +119 -0
  442. package/src/lib/deploy/k8s/LICENSE +99 -0
  443. package/src/lib/deploy/k8s/gitops-deploy.js +298 -0
  444. package/src/lib/deploy/k8s/ha/index.js +1000 -0
  445. package/src/lib/deploy/k8s/index.js +62 -0
  446. package/src/lib/deploy/k8s/k3s.js +2515 -0
  447. package/src/lib/deploy/orchestrator.js +1401 -0
  448. package/src/lib/deploy/prompts.js +545 -0
  449. package/src/lib/deploy/remote-build.js +130 -0
  450. package/src/lib/deploy/state.js +120 -0
  451. package/src/lib/deploy/utils.js +328 -0
  452. package/src/lib/deploy-logger.js +93 -0
  453. package/src/lib/dns-propagation.js +48 -0
  454. package/src/lib/environment.js +58 -0
  455. package/src/lib/fetch-retry.js +103 -0
  456. package/src/lib/github-environments.js +335 -0
  457. package/src/lib/hetzner-dns.js +377 -0
  458. package/src/lib/hetzner-guided-setup.js +275 -0
  459. package/src/lib/host-keys.js +37 -0
  460. package/src/lib/iac/cloud-init.js +52 -0
  461. package/src/lib/iac/index.js +325 -0
  462. package/src/lib/iac/programs/hetzner-compose.js +130 -0
  463. package/src/lib/iac/programs/hetzner-k8s.js +320 -0
  464. package/src/lib/kubectl.js +81 -0
  465. package/src/lib/licensing/index.js +259 -0
  466. package/src/lib/licensing/tiers.js +181 -0
  467. package/src/lib/licensing/validator.js +171 -0
  468. package/src/lib/merge-package-json.js +90 -0
  469. package/src/lib/operator-ip.js +381 -0
  470. package/src/lib/package-manager.js +111 -0
  471. package/src/lib/perf.js +71 -0
  472. package/src/lib/project-guard.js +39 -0
  473. package/src/lib/project.js +334 -0
  474. package/src/lib/providers/base.js +276 -0
  475. package/src/lib/providers/hetzner-s3.js +656 -0
  476. package/src/lib/providers/hetzner.js +755 -0
  477. package/src/lib/providers/index.js +164 -0
  478. package/src/lib/s3.js +510 -0
  479. package/src/lib/secret-scan.js +583 -0
  480. package/src/lib/secrets.js +63 -0
  481. package/src/lib/server-types.js +195 -0
  482. package/src/lib/shell.js +91 -0
  483. package/src/lib/ssh.js +241 -0
  484. package/src/lib/tracker.js +242 -0
  485. package/src/lib/upgrade-policy.js +170 -0
  486. package/src/lib/validators.js +105 -0
  487. package/src/lib/version.js +5 -0
  488. package/src/remove.js +292 -0
  489. package/src/reset.js +97 -0
  490. package/src/restore.js +871 -0
  491. package/src/scale.js +1734 -0
  492. package/src/shell.js +222 -0
  493. package/src/status.js +981 -0
  494. package/src/up.js +264 -0
  495. package/src/upgrade.js +721 -0
@@ -0,0 +1,59 @@
1
+ # Let's Encrypt ClusterIssuers for the `hetzner` DNS provider strategy.
2
+ #
3
+ # Uses cert-manager's webhook solver pointed at the OFFICIAL
4
+ # `cert-manager-webhook-hetzner` chart from charts.hetzner.cloud. The
5
+ # webhook calls the Hetzner Cloud DNS API (api.hetzner.cloud/v1/zones)
6
+ # to write the `_acme-challenge.<domain>` TXT record.
7
+ #
8
+ # Hetzner retired the separate DNS Console (dns.hetzner.com) in
9
+ # May 2026 and folded zone management into the main Cloud Console.
10
+ # As a result the same Cloud API token used elsewhere in vibecarbon
11
+ # now covers DNS — there is NO separate "DNS API token" anymore.
12
+ #
13
+ # Requires:
14
+ # 1. The cert-manager-webhook-hetzner Deployment to be Available in
15
+ # the cert-manager namespace (installed by applyK3sManifests via
16
+ # `helm upgrade --install` from charts.hetzner.cloud).
17
+ # 2. Secret `hetzner` with key `token` in the cert-manager namespace,
18
+ # holding the Hetzner Cloud API token. `applyK3sManifests` lands
19
+ # both before applying these issuers.
20
+ apiVersion: cert-manager.io/v1
21
+ kind: ClusterIssuer
22
+ metadata:
23
+ name: letsencrypt-prod-hetzner
24
+ spec:
25
+ acme:
26
+ server: https://acme-v02.api.letsencrypt.org/directory
27
+ email: "{{ADMIN_EMAIL}}"
28
+ privateKeySecretRef:
29
+ name: letsencrypt-prod-hetzner-account-key
30
+ solvers:
31
+ - dns01:
32
+ webhook:
33
+ groupName: acme.hetzner.com
34
+ solverName: hetzner
35
+ config:
36
+ tokenSecretKeyRef:
37
+ name: hetzner
38
+ key: token
39
+ ---
40
+ apiVersion: cert-manager.io/v1
41
+ kind: ClusterIssuer
42
+ metadata:
43
+ name: letsencrypt-staging-hetzner
44
+ spec:
45
+ acme:
46
+ # Staging has higher rate limits but issues untrusted certs.
47
+ server: https://acme-staging-v02.api.letsencrypt.org/directory
48
+ email: "{{ADMIN_EMAIL}}"
49
+ privateKeySecretRef:
50
+ name: letsencrypt-staging-hetzner-account-key
51
+ solvers:
52
+ - dns01:
53
+ webhook:
54
+ groupName: acme.hetzner.com
55
+ solverName: hetzner
56
+ config:
57
+ tokenSecretKeyRef:
58
+ name: hetzner
59
+ key: token
@@ -0,0 +1,43 @@
1
+ # Let's Encrypt ClusterIssuers for the `manual` DNS provider strategy.
2
+ #
3
+ # Uses HTTP-01 ACME validation: cert-manager temporarily exposes a
4
+ # challenge token at http://<domain>/.well-known/acme-challenge/<token>
5
+ # and Let's Encrypt fetches it to prove control. This works only when
6
+ # port 80 is reachable from the public internet straight to traefik —
7
+ # i.e., NOT behind a reverse proxy that terminates TLS at the edge
8
+ # (Cloudflare orange-cloud, Fastly, etc.). For those, use the matching
9
+ # `*-cloudflare` or `*-hetzner` DNS-01 issuer instead.
10
+ #
11
+ # The `letsencrypt-{prod,staging}-manual` issuer is selected by
12
+ # applyK3sManifests in src/lib/deploy/k8s/k3s.js when
13
+ # dnsProvider === 'manual' (or unknown).
14
+ apiVersion: cert-manager.io/v1
15
+ kind: ClusterIssuer
16
+ metadata:
17
+ name: letsencrypt-prod-manual
18
+ spec:
19
+ acme:
20
+ server: https://acme-v02.api.letsencrypt.org/directory
21
+ email: "{{ADMIN_EMAIL}}"
22
+ privateKeySecretRef:
23
+ name: letsencrypt-prod-manual-account-key
24
+ solvers:
25
+ - http01:
26
+ ingress:
27
+ class: traefik
28
+ ---
29
+ apiVersion: cert-manager.io/v1
30
+ kind: ClusterIssuer
31
+ metadata:
32
+ name: letsencrypt-staging-manual
33
+ spec:
34
+ acme:
35
+ # Staging has higher rate limits but issues untrusted certs.
36
+ server: https://acme-staging-v02.api.letsencrypt.org/directory
37
+ email: "{{ADMIN_EMAIL}}"
38
+ privateKeySecretRef:
39
+ name: letsencrypt-staging-manual-account-key
40
+ solvers:
41
+ - http01:
42
+ ingress:
43
+ class: traefik
@@ -0,0 +1,15 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ # cert-manager custom resources (per-DNS-provider ClusterIssuers).
5
+ # IMPORTANT: Apply this AFTER cert-manager CRDs are installed and ready.
6
+ # Usage: kubectl apply -k k8s/infra/cert-manager-resources/
7
+ #
8
+ # All issuer sets ship together; cert-manager only acts on the one
9
+ # referenced by the Certificate (issuerRef.name is patched per
10
+ # deployment in src/lib/deploy/k8s/k3s.js → applyK3sManifests).
11
+
12
+ resources:
13
+ - cluster-issuers-manual.yaml
14
+ - cluster-issuers-cloudflare.yaml
15
+ - cluster-issuers-hetzner.yaml
@@ -0,0 +1,21 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ # cert-manager installation — applied directly by the deploy script, NOT via kustomize.
5
+ #
6
+ # kustomize v5 (bundled with kubectl 1.27+) no longer supports raw HTTP remote resources
7
+ # in the `resources:` field. Only git-style kustomize bases are supported. cert-manager
8
+ # distributes a monolithic YAML file (not a kustomize base), so it must be applied with
9
+ # kubectl apply -f directly.
10
+ #
11
+ # cert-manager version: v1.20.2
12
+ # cert-manager URL: https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml
13
+ #
14
+ # To upgrade cert-manager: update CERT_MANAGER_VERSION in src/lib/deploy/k8s/k3s.js
15
+ # (and bump cert-manager-webhook-hetzner in lockstep — see HETZNER_WEBHOOK_CHART_VERSION).
16
+ #
17
+ # IMPORTANT: ClusterIssuers are applied separately AFTER cert-manager is ready
18
+ # See: k8s/infra/cert-manager-resources/ for ClusterIssuers
19
+
20
+ # No resources here — cert-manager is applied directly by the deploy script.
21
+ # hetzner-ccm and hetzner-csi are installed via cloud-init (see master-init.sh)
@@ -0,0 +1,10 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ # Traefik CRDs for IngressRoute, Middleware, etc.
5
+ # Apply this BEFORE base manifests that use Traefik CRs
6
+ # Usage: kubectl apply -k k8s/infra/traefik-crds/
7
+
8
+ resources:
9
+ # Traefik v3 CRDs from official repository
10
+ - https://raw.githubusercontent.com/traefik/traefik/v3.3.6/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
@@ -0,0 +1,23 @@
1
+ # Local development configuration
2
+ apiVersion: v1
3
+ kind: ConfigMap
4
+ metadata:
5
+ name: vibecarbon-config
6
+ data:
7
+ # Site Configuration (local URLs)
8
+ SITE_URL: "http://localhost:8080"
9
+ PROJECT_NAME: "vibecarbon-local"
10
+
11
+ # Database
12
+ DB_HOST: "postgres"
13
+ DB_PORT: "5432"
14
+ DB_NAME: "postgres"
15
+
16
+ # Internal Service URLs
17
+ KONG_URL: "http://kong:8000"
18
+ AUTH_URL: "http://auth:9999"
19
+ REST_URL: "http://rest:3000"
20
+ REALTIME_URL: "http://realtime:4000"
21
+ STORAGE_URL: "http://storage:5000"
22
+ META_URL: "http://meta:8080"
23
+ IMGPROXY_URL: "http://imgproxy:5001"
@@ -0,0 +1,104 @@
1
+ # ============================================================================
2
+ # LOCAL DEVELOPMENT ROUTES
3
+ # ============================================================================
4
+ # For local development, we use host-based routing for simplicity.
5
+ # Production uses path-based /admin/* routes with ForwardAuth protection.
6
+ #
7
+ # Local URLs (no auth required):
8
+ # http://studio.localhost:8080 - Supabase Studio
9
+ # http://n8n.localhost:8080 - n8n Workflows
10
+ # http://traefik.localhost:8080 - Traefik Dashboard
11
+ #
12
+ # Production-like URLs (requires admin role):
13
+ # http://localhost:8080/admin/studio
14
+ # http://localhost:8080/admin/n8n
15
+ # ============================================================================
16
+
17
+ # Studio - direct access for local development
18
+ apiVersion: traefik.io/v1alpha1
19
+ kind: IngressRoute
20
+ metadata:
21
+ name: studio-local
22
+ labels:
23
+ app: vibecarbon-studio
24
+ spec:
25
+ entryPoints:
26
+ - web
27
+ routes:
28
+ - match: Host(`studio.localhost`)
29
+ kind: Rule
30
+ services:
31
+ - name: studio
32
+ port: 3000
33
+ ---
34
+ # n8n - direct access for local development
35
+ apiVersion: traefik.io/v1alpha1
36
+ kind: IngressRoute
37
+ metadata:
38
+ name: n8n-local
39
+ labels:
40
+ app: vibecarbon-n8n
41
+ spec:
42
+ entryPoints:
43
+ - web
44
+ routes:
45
+ - match: Host(`n8n.localhost`)
46
+ kind: Rule
47
+ services:
48
+ - name: n8n
49
+ port: 5678
50
+ ---
51
+ # Traefik dashboard - direct access for local development
52
+ apiVersion: traefik.io/v1alpha1
53
+ kind: IngressRoute
54
+ metadata:
55
+ name: traefik-dashboard-local
56
+ labels:
57
+ app: vibecarbon-traefik
58
+ spec:
59
+ entryPoints:
60
+ - web
61
+ routes:
62
+ - match: Host(`traefik.localhost`)
63
+ kind: Rule
64
+ services:
65
+ - name: traefik-dashboard
66
+ port: 8080
67
+ ---
68
+ # ============================================================================
69
+ # PRODUCTION-LIKE ROUTES (for testing ForwardAuth locally)
70
+ # ============================================================================
71
+ # These routes mirror production but are only enabled when testing the full
72
+ # auth flow locally. Requires the app to be running with verify-role endpoint.
73
+
74
+ # Admin routes with ForwardAuth (production-like)
75
+ apiVersion: traefik.io/v1alpha1
76
+ kind: IngressRoute
77
+ metadata:
78
+ name: admin-routes-local
79
+ labels:
80
+ app: vibecarbon-admin
81
+ spec:
82
+ entryPoints:
83
+ - web
84
+ routes:
85
+ # /admin/studio with ForwardAuth
86
+ - match: PathPrefix(`/admin/studio`)
87
+ kind: Rule
88
+ priority: 20
89
+ services:
90
+ - name: studio
91
+ port: 3000
92
+ middlewares:
93
+ - name: admin-auth
94
+ - name: strip-admin-studio-prefix
95
+ # /admin/n8n with ForwardAuth
96
+ - match: PathPrefix(`/admin/n8n`)
97
+ kind: Rule
98
+ priority: 20
99
+ services:
100
+ - name: n8n
101
+ port: 5678
102
+ middlewares:
103
+ - name: admin-auth
104
+ - name: strip-admin-n8n-prefix
@@ -0,0 +1,215 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namespace: vibecarbon
5
+
6
+ # Local overlay - only includes components needed for local testing
7
+ # Excludes: hetzner-ccm, hetzner-csi, cert-manager
8
+ resources:
9
+ - namespace.yaml
10
+ - ../../base/app/
11
+ - ../../base/supabase/postgres/
12
+ - ../../base/supabase/kong/
13
+ - ../../base/supabase/auth/
14
+ - ../../base/supabase/rest/
15
+ - ../../base/supabase/realtime/
16
+ - ../../base/supabase/storage/
17
+ - ../../base/supabase/imgproxy/
18
+ - ../../base/supabase/meta/
19
+ - ../../base/supabase/studio/
20
+ - ../../base/traefik/
21
+ - secrets.yaml
22
+ - configmap.yaml
23
+ - ingressroute-studio.yaml
24
+
25
+ labels:
26
+ - pairs:
27
+ app.kubernetes.io/part-of: vibecarbon
28
+ environment: local
29
+ includeSelectors: false
30
+
31
+ patches:
32
+ # Use emptyDir instead of PVC for local ephemeral storage
33
+ # Override postStart to use hardcoded local dev password
34
+ - target:
35
+ kind: StatefulSet
36
+ name: postgres
37
+ patch: |-
38
+ - op: remove
39
+ path: /spec/volumeClaimTemplates
40
+ - op: add
41
+ path: /spec/template/spec/volumes
42
+ value:
43
+ - name: postgres-data
44
+ emptyDir: {}
45
+ - op: replace
46
+ path: /spec/template/spec/containers/0/lifecycle/postStart/exec/command
47
+ value:
48
+ - /bin/sh
49
+ - -c
50
+ - |
51
+ sleep 15
52
+ until pg_isready -U supabase_admin -h /var/run/postgresql; do sleep 2; done
53
+ sleep 5
54
+ psql -U supabase_admin -h /var/run/postgresql -c "
55
+ ALTER ROLE authenticator WITH PASSWORD 'local-dev-password-12345';
56
+ ALTER ROLE supabase_auth_admin WITH PASSWORD 'local-dev-password-12345';
57
+ ALTER ROLE supabase_storage_admin WITH PASSWORD 'local-dev-password-12345';
58
+ ALTER ROLE supabase_admin WITH PASSWORD 'local-dev-password-12345';
59
+ CREATE SCHEMA IF NOT EXISTS _realtime;
60
+ GRANT ALL ON SCHEMA _realtime TO postgres, authenticator;
61
+ -- n8n database and user
62
+ DO \$\$ BEGIN
63
+ IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'n8n') THEN
64
+ CREATE ROLE n8n WITH LOGIN PASSWORD 'local-dev-password-12345';
65
+ END IF;
66
+ END \$\$;
67
+ CREATE DATABASE n8n WITH OWNER n8n ENCODING 'UTF8' TEMPLATE template0;
68
+ GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
69
+ " || true
70
+
71
+ # Use local-path for storage PVC
72
+ - target:
73
+ kind: PersistentVolumeClaim
74
+ name: storage-data
75
+ patch: |-
76
+ - op: replace
77
+ path: /spec/storageClassName
78
+ value: local-path
79
+ - op: replace
80
+ path: /spec/resources/requests/storage
81
+ value: 1Gi
82
+
83
+ # Use local-path for n8n PVC
84
+ - target:
85
+ kind: PersistentVolumeClaim
86
+ name: n8n-data
87
+ patch: |-
88
+ - op: replace
89
+ path: /spec/storageClassName
90
+ value: local-path
91
+ - op: replace
92
+ path: /spec/resources/requests/storage
93
+ value: 1Gi
94
+
95
+ # Use pause container for app (local dev builds app separately, this is just a placeholder)
96
+ - target:
97
+ kind: Deployment
98
+ name: app
99
+ patch: |-
100
+ - op: replace
101
+ path: /spec/template/spec/containers/0/image
102
+ value: registry.k8s.io/pause:3.9
103
+ - op: replace
104
+ path: /spec/template/spec/containers/0/ports/0/containerPort
105
+ value: 80
106
+ - op: remove
107
+ path: /spec/template/spec/containers/0/env
108
+ - op: remove
109
+ path: /spec/template/spec/containers/0/livenessProbe
110
+ - op: remove
111
+ path: /spec/template/spec/containers/0/readinessProbe
112
+
113
+ # Reduce replicas for local testing (base now has correct memory limits)
114
+ - target:
115
+ kind: Deployment
116
+ name: kong
117
+ patch: |-
118
+ - op: replace
119
+ path: /spec/replicas
120
+ value: 1
121
+
122
+ - target:
123
+ kind: Deployment
124
+ name: auth
125
+ patch: |-
126
+ - op: replace
127
+ path: /spec/replicas
128
+ value: 1
129
+
130
+ - target:
131
+ kind: Deployment
132
+ name: rest
133
+ patch: |-
134
+ - op: replace
135
+ path: /spec/replicas
136
+ value: 1
137
+
138
+ - target:
139
+ kind: Deployment
140
+ name: realtime
141
+ patch: |-
142
+ - op: replace
143
+ path: /spec/replicas
144
+ value: 1
145
+
146
+ - target:
147
+ kind: Deployment
148
+ name: traefik
149
+ patch: |-
150
+ - op: replace
151
+ path: /spec/replicas
152
+ value: 1
153
+ # Remove HTTPS redirect args for local HTTP testing
154
+ - op: replace
155
+ path: /spec/template/spec/containers/0/args
156
+ value:
157
+ - "--api.dashboard=true"
158
+ - "--api.insecure=true"
159
+ - "--providers.kubernetescrd"
160
+ - "--providers.kubernetesingress"
161
+ - "--entrypoints.web.address=:80"
162
+ - "--entrypoints.websecure.address=:443"
163
+ - "--entrypoints.traefik.address=:8080"
164
+ - "--ping=true"
165
+ - "--log.level=INFO"
166
+ - "--accesslog=true"
167
+
168
+ # Change IngressRoute to use HTTP (web) for local testing
169
+ # Remove admin routes (using host-based routing locally: studio.localhost, n8n.localhost)
170
+ - target:
171
+ kind: IngressRoute
172
+ name: vibecarbon-app
173
+ patch: |-
174
+ - op: replace
175
+ path: /spec/entryPoints
176
+ value:
177
+ - web
178
+ - op: remove
179
+ path: /spec/tls
180
+ - op: remove
181
+ path: /spec/routes/3
182
+ - op: remove
183
+ path: /spec/routes/2
184
+
185
+ # Remove HTTP redirect route (not needed for local)
186
+ - target:
187
+ kind: IngressRoute
188
+ name: vibecarbon-http-redirect
189
+ patch: |-
190
+ $patch: delete
191
+ apiVersion: traefik.io/v1alpha1
192
+ kind: IngressRoute
193
+ metadata:
194
+ name: vibecarbon-http-redirect
195
+
196
+ # Disable HPA for local testing
197
+ - target:
198
+ kind: HorizontalPodAutoscaler
199
+ patch: |-
200
+ $patch: delete
201
+ apiVersion: autoscaling/v2
202
+ kind: HorizontalPodAutoscaler
203
+ metadata:
204
+ name: placeholder
205
+
206
+ # Disable cert-manager Certificate for local testing (since cert-manager isn't deployed locally)
207
+ - target:
208
+ kind: Certificate
209
+ name: vibecarbon-tls
210
+ patch: |-
211
+ $patch: delete
212
+ apiVersion: cert-manager.io/v1
213
+ kind: Certificate
214
+ metadata:
215
+ name: vibecarbon-tls
@@ -0,0 +1,8 @@
1
+ apiVersion: v1
2
+ kind: Namespace
3
+ metadata:
4
+ name: vibecarbon
5
+ labels:
6
+ app.kubernetes.io/name: vibecarbon
7
+ app.kubernetes.io/managed-by: kustomize
8
+ environment: local
@@ -0,0 +1,32 @@
1
+ # Local development secrets — applied by carbon/k8s/test-local.sh to a k3d
2
+ # cluster. These values exist only so the kustomize Secret resource has the
3
+ # expected keys; they are NOT valid JWTs (the previous JWT-shaped strings
4
+ # tripped GitHub's secret-scanning bot when committed-into-throwaway-e2e
5
+ # repos pushed by the test runner — every push generated a "Supabase Service
6
+ # Key detected" email even though the signatures were never actually valid).
7
+ #
8
+ # To run a working local Supabase auth flow you must replace ANON_KEY +
9
+ # SERVICE_ROLE_KEY with real JWTs signed against JWT_SECRET. The Supabase
10
+ # CLI (`supabase status`) prints a working pair you can paste in.
11
+ #
12
+ # DO NOT use these values in production!
13
+ apiVersion: v1
14
+ kind: Secret
15
+ metadata:
16
+ name: vibecarbon-secrets
17
+ type: Opaque
18
+ stringData:
19
+ DB_PASSWORD: "local-dev-password-12345"
20
+ JWT_SECRET: "local-jwt-secret-for-development-only-must-be-at-least-32-chars"
21
+ ANON_KEY: "REPLACE-WITH-LOCAL-ANON-JWT-FROM-supabase-status"
22
+ SERVICE_ROLE_KEY: "REPLACE-WITH-LOCAL-SERVICE-ROLE-JWT-FROM-supabase-status"
23
+ REALTIME_SECRET: "local-realtime-secret-for-development-must-be-at-least-64-bytes-long-for-cookie-store"
24
+ VAULT_ENC_KEY: "local-vault-encryption-key"
25
+ PG_META_CRYPTO_KEY: "local-pg-meta-crypto-key"
26
+ LOGFLARE_API_KEY: "local-logflare-api-key"
27
+ N8N_PASSWORD: "local-n8n-password"
28
+ S3_ACCESS_KEY: "local-s3-access-key"
29
+ S3_SECRET_KEY: "local-s3-secret-key"
30
+ S3_REGION: "us-east-1"
31
+ S3_BUCKET: "vibecarbon-local-bucket"
32
+ S3_ENDPOINT: "http://localhost:9000"
@@ -0,0 +1,34 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namespace: vibecarbon
5
+
6
+ resources:
7
+ - ../../base
8
+
9
+ labels:
10
+ - pairs:
11
+ environment: production
12
+
13
+ configMapGenerator:
14
+ - name: vibecarbon-config
15
+ behavior: merge
16
+ literals:
17
+ - SITE_URL={{DOMAIN}}
18
+ - PROJECT_NAME=vibecarbon
19
+ # Service names follow the Supabase community Helm chart convention
20
+ # (release name `supabase` + chart name `supabase` → `supabase-supabase-*`).
21
+ - DB_HOST=supabase-supabase-db
22
+ - DB_PORT=5432
23
+ - DB_NAME=postgres
24
+ - KONG_URL=http://supabase-supabase-kong:8000
25
+ - AUTH_URL=http://supabase-supabase-auth:9999
26
+ - REST_URL=http://supabase-supabase-rest:3000
27
+ - REALTIME_URL=http://supabase-supabase-realtime:4000
28
+ - STORAGE_URL=http://supabase-supabase-storage:5000
29
+ - META_URL=http://supabase-supabase-meta:8080
30
+ - IMGPROXY_URL=http://supabase-supabase-imgproxy:5001
31
+
32
+ images:
33
+ - name: ghcr.io/{{GITHUB_OWNER}}/{{PROJECT_NAME}}
34
+ newTag: main