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,84 @@
1
+ # Metabase Analytics - Docker Compose Override
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.metabase.yml up -d
3
+ #
4
+ # Access:
5
+ # Local dev: http://metabase.localhost (subdomain routing)
6
+ # Production: /admin/metabase (path routing via docker-compose.prod.yml)
7
+ # Auth: Requires super_admin role via Traefik ForwardAuth
8
+ # Docs: https://www.metabase.com/docs/latest/
9
+
10
+ services:
11
+ # Extend db service to add metabase database initialization
12
+ db:
13
+ volumes:
14
+ - ./volumes/db/metabase-init.sh:/docker-entrypoint-initdb.d/zz-metabase-init.sh:Z
15
+
16
+ metabase:
17
+ image: metabase/metabase:latest
18
+ container_name: ${PROJECT_NAME:-vibecarbon}-metabase
19
+ restart: unless-stopped
20
+ environment:
21
+ # Database connection for Metabase app data
22
+ - MB_DB_TYPE=postgres
23
+ - MB_DB_DBNAME=metabase
24
+ - MB_DB_PORT=5432
25
+ - MB_DB_USER=metabase
26
+ - MB_DB_PASS=${POSTGRES_PASSWORD}
27
+ - MB_DB_HOST=db
28
+ # Site configuration
29
+ - MB_SITE_URL=${METABASE_SITE_URL:-http://metabase.localhost}
30
+ - MB_SITE_NAME=${PROJECT_NAME:-Vibecarbon} Analytics
31
+ # Embedding configuration for iframe access
32
+ - MB_EMBEDDING_APP_ORIGIN=${SITE_URL:-http://localhost:5173}
33
+ - MB_ENABLE_EMBEDDING=true
34
+ # Security settings
35
+ - MB_PASSWORD_COMPLEXITY=strong
36
+ - MB_SESSION_COOKIES=true
37
+ - MB_COOKIE_SAMESITE=lax
38
+ # Timezone
39
+ - MB_TIMEZONE=${TIMEZONE:-UTC}
40
+ - JAVA_TIMEZONE=${TIMEZONE:-UTC}
41
+ # Performance
42
+ - JAVA_OPTS=-Xmx2g
43
+ volumes:
44
+ - metabase_data:/metabase-data
45
+ networks:
46
+ - vibecarbon-network
47
+ labels:
48
+ # Traefik routing with ForwardAuth (super_admin only)
49
+ # Local dev uses subdomain: metabase.localhost
50
+ - "traefik.enable=true"
51
+ - "traefik.http.routers.metabase.rule=Host(`metabase.localhost`)"
52
+ - "traefik.http.routers.metabase.entrypoints=web"
53
+ - "traefik.http.routers.metabase.middlewares=super-admin-auth@file"
54
+ - "traefik.http.services.metabase.loadbalancer.server.port=3000"
55
+ depends_on:
56
+ db:
57
+ condition: service_healthy
58
+ healthcheck:
59
+ test: ["CMD-SHELL", "curl -f http://localhost:3000/api/health || exit 1"]
60
+ interval: 15s
61
+ timeout: 5s
62
+ retries: 8
63
+ start_period: 120s
64
+
65
+ metabase-setup:
66
+ image: alpine:latest
67
+ container_name: ${PROJECT_NAME:-vibecarbon}-metabase-setup
68
+ volumes:
69
+ - ./volumes/metabase/scripts:/scripts:ro
70
+ environment:
71
+ - METABASE_URL=http://metabase:3000
72
+ - METABASE_ADMIN_EMAIL=${METABASE_ADMIN_EMAIL:-${ADMIN_EMAIL}}
73
+ - METABASE_ADMIN_PASSWORD=${METABASE_ADMIN_PASSWORD:-${ADMIN_PASSWORD}}
74
+ - DB_PASSWORD=${DB_PASSWORD}
75
+ entrypoint: ["/bin/sh", "-c", "apk add --no-cache curl jq && sh /scripts/setup.sh"]
76
+ depends_on:
77
+ metabase:
78
+ condition: service_healthy
79
+ networks:
80
+ - vibecarbon-network
81
+ restart: "no"
82
+
83
+ volumes:
84
+ metabase_data:
@@ -0,0 +1,14 @@
1
+ # Development overrides for n8n
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.n8n.yml -f docker-compose.n8n.override.yml up -d
3
+
4
+ services:
5
+ n8n:
6
+ labels:
7
+ # Dev: No auth required (same as studio/traefik in local dev)
8
+ # Production uses ForwardAuth via docker-compose.n8n.yml labels
9
+ # Empty middlewares override removes ForwardAuth requirement
10
+ - "traefik.enable=true"
11
+ - "traefik.http.routers.n8n.rule=Host(`n8n.localhost`)"
12
+ - "traefik.http.routers.n8n.entrypoints=web"
13
+ - "traefik.http.routers.n8n.middlewares="
14
+ - "traefik.http.services.n8n.loadbalancer.server.port=5678"
@@ -0,0 +1,31 @@
1
+ # n8n Production Overrides
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.n8n.yml -f docker-compose.n8n.prod.yml up -d
3
+ #
4
+ # Adds:
5
+ # - SSL subdomain routing for n8n (n8n.yourdomain.com)
6
+ # - ForwardAuth (super_admin role required)
7
+ # - HTTP to HTTPS redirect
8
+
9
+ services:
10
+ n8n:
11
+ environment:
12
+ # Override URLs for production subdomain
13
+ - N8N_HOST=n8n.${DOMAIN}
14
+ - N8N_PROTOCOL=https
15
+ - WEBHOOK_URL=https://n8n.${DOMAIN}/
16
+ - N8N_EDITOR_BASE_URL=https://n8n.${DOMAIN}/
17
+ - N8N_SECURE_COOKIE=true
18
+ labels:
19
+ # Production Traefik routing with SSL
20
+ - "traefik.enable=true"
21
+ # HTTPS router with super_admin auth
22
+ - "traefik.http.routers.n8n.rule=Host(`n8n.${DOMAIN}`)"
23
+ - "traefik.http.routers.n8n.entrypoints=websecure"
24
+ - "traefik.http.routers.n8n.tls=true"
25
+ - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
26
+ - "traefik.http.routers.n8n.middlewares=super-admin-auth@file"
27
+ - "traefik.http.services.n8n.loadbalancer.server.port=5678"
28
+ # HTTP to HTTPS redirect
29
+ - "traefik.http.routers.n8n-http.rule=Host(`n8n.${DOMAIN}`)"
30
+ - "traefik.http.routers.n8n-http.entrypoints=web"
31
+ - "traefik.http.routers.n8n-http.middlewares=redirect-to-https"
@@ -0,0 +1,97 @@
1
+ # n8n Workflow Automation - Docker Compose Override
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.n8n.yml up -d
3
+ #
4
+ # Access:
5
+ # Local dev: http://n8n.localhost (subdomain routing)
6
+ # Production: /admin/n8n (path routing via docker-compose.prod.yml)
7
+ # Auth (dev): n8n's built-in auth (owner user created by setup.sh)
8
+ # Auth (prod): ForwardAuth SSO via Traefik + hooks.js (cookie sharing works across subdomains)
9
+ # Docs: https://docs.n8n.io/hosting/
10
+
11
+ services:
12
+ # Extend db service to add n8n database initialization
13
+ db:
14
+ volumes:
15
+ - ./volumes/db/n8n-init.sh:/docker-entrypoint-initdb.d/zz-n8n-init.sh:Z
16
+
17
+ n8n:
18
+ image: n8nio/n8n:latest
19
+ container_name: ${PROJECT_NAME:-vibecarbon}-n8n
20
+ restart: unless-stopped
21
+ environment:
22
+ # Database connection (uses project PostgreSQL)
23
+ - DB_TYPE=postgresdb
24
+ - DB_POSTGRESDB_HOST=db
25
+ - DB_POSTGRESDB_PORT=5432
26
+ - DB_POSTGRESDB_DATABASE=n8n
27
+ - DB_POSTGRESDB_USER=n8n
28
+ # Uses project POSTGRES_PASSWORD (same as n8n-init.sh sets for the n8n role)
29
+ - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
30
+ # Webhook and external URL configuration
31
+ - N8N_HOST=${N8N_HOST:-n8n.localhost}
32
+ - N8N_PORT=5678
33
+ - N8N_PROTOCOL=${N8N_PROTOCOL:-http}
34
+ - WEBHOOK_URL=${N8N_WEBHOOK_URL:-http://n8n.localhost/}
35
+ - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL:-http://n8n.localhost/}
36
+ # Security
37
+ # Dev default: n8n_dev_encryption_key (set N8N_ENCRYPTION_KEY in .env for production)
38
+ - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY:-n8n_dev_encryption_key}
39
+ - N8N_SECURE_COOKIE=false
40
+ # ForwardAuth SSO hook
41
+ - EXTERNAL_HOOK_FILES=/home/node/.n8n/hooks.js
42
+ # Execution settings
43
+ - EXECUTIONS_MODE=queue
44
+ - QUEUE_BULL_REDIS_HOST=redis
45
+ - QUEUE_BULL_REDIS_PORT=6379
46
+ - QUEUE_BULL_REDIS_PASSWORD=${REDIS_PASSWORD:-}
47
+ # Timezone
48
+ - GENERIC_TIMEZONE=${TIMEZONE:-UTC}
49
+ - TZ=${TIMEZONE:-UTC}
50
+ # Metrics for Prometheus (optional)
51
+ - N8N_METRICS=true
52
+ - N8N_METRICS_PREFIX=n8n_
53
+ volumes:
54
+ - n8n_data:/home/node/.n8n
55
+ - ./volumes/n8n/hooks.js:/home/node/.n8n/hooks.js:ro
56
+ networks:
57
+ - vibecarbon-network
58
+ labels:
59
+ # Traefik routing — subdomain: n8n.localhost
60
+ # No ForwardAuth in dev (cookies don't cross localhost → n8n.localhost).
61
+ # Production overlay adds super-admin-auth@file middleware.
62
+ - "traefik.enable=true"
63
+ - "traefik.http.routers.n8n.rule=Host(`n8n.localhost`)"
64
+ - "traefik.http.routers.n8n.entrypoints=web"
65
+ - "traefik.http.services.n8n.loadbalancer.server.port=5678"
66
+ depends_on:
67
+ db:
68
+ condition: service_healthy
69
+ healthcheck:
70
+ test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/healthz || exit 1"]
71
+ interval: 30s
72
+ timeout: 10s
73
+ retries: 3
74
+ start_period: 30s
75
+
76
+ n8n-setup:
77
+ image: alpine:latest
78
+ container_name: ${PROJECT_NAME:-vibecarbon}-n8n-setup
79
+ volumes:
80
+ - ./volumes/n8n/scripts:/scripts:ro
81
+ environment:
82
+ - N8N_ADMIN_EMAIL=${N8N_ADMIN_EMAIL:-${ADMIN_EMAIL}}
83
+ - N8N_DB_HOST=db
84
+ - N8N_DB_NAME=n8n
85
+ - N8N_DB_USER=n8n
86
+ # Uses project POSTGRES_PASSWORD (same as n8n-init.sh sets for the n8n role)
87
+ - N8N_DB_PASSWORD=${POSTGRES_PASSWORD}
88
+ entrypoint: ["/bin/sh", "-c", "apk add --no-cache postgresql16-client && sh /scripts/setup.sh"]
89
+ depends_on:
90
+ db:
91
+ condition: service_healthy
92
+ networks:
93
+ - vibecarbon-network
94
+ restart: "no"
95
+
96
+ volumes:
97
+ n8n_data:
@@ -0,0 +1,18 @@
1
+ # Development overrides for observability stack
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.observability.yml -f docker-compose.observability.override.yml up -d
3
+
4
+ services:
5
+ grafana:
6
+ volumes:
7
+ - ./volumes/grafana/provisioning/dashboards/dashboards.dev.yml:/etc/grafana/provisioning/dashboards/dashboards.yml:ro
8
+ - ./volumes/grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro
9
+ - ./volumes/grafana/dashboards.dev:/var/lib/grafana/dashboards:ro
10
+ - grafana_data:/var/lib/grafana
11
+ labels:
12
+ # Dev: No auth required (same as studio/traefik in local dev)
13
+ # Empty middlewares override removes ForwardAuth requirement
14
+ - "traefik.enable=true"
15
+ - "traefik.http.routers.grafana.rule=Host(`grafana.localhost`)"
16
+ - "traefik.http.routers.grafana.entrypoints=web"
17
+ - "traefik.http.routers.grafana.middlewares="
18
+ - "traefik.http.services.grafana.loadbalancer.server.port=3000"
@@ -0,0 +1,28 @@
1
+ # Observability Production Overrides
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.observability.yml -f docker-compose.observability.prod.yml up -d
3
+ #
4
+ # Adds:
5
+ # - SSL subdomain routing for Grafana (grafana.yourdomain.com)
6
+ # - Security headers
7
+ # - HTTP to HTTPS redirect
8
+
9
+ services:
10
+ grafana:
11
+ environment:
12
+ # Override ROOT_URL for production subdomain
13
+ - GF_SERVER_ROOT_URL=https://grafana.${DOMAIN}
14
+ ports: [] # Disable direct port exposure in production
15
+ labels:
16
+ # Production Traefik routing with SSL
17
+ - "traefik.enable=true"
18
+ # HTTPS router
19
+ - "traefik.http.routers.grafana.rule=Host(`grafana.${DOMAIN}`)"
20
+ - "traefik.http.routers.grafana.entrypoints=websecure"
21
+ - "traefik.http.routers.grafana.tls.certresolver=letsencrypt"
22
+ - "traefik.http.services.grafana.loadbalancer.server.port=3000"
23
+ # Security headers
24
+ - "traefik.http.routers.grafana.middlewares=super-admin-auth@file,security-headers@file"
25
+ # HTTP to HTTPS redirect
26
+ - "traefik.http.routers.grafana-http.rule=Host(`grafana.${DOMAIN}`)"
27
+ - "traefik.http.routers.grafana-http.entrypoints=web"
28
+ - "traefik.http.routers.grafana-http.middlewares=redirect-to-https"
@@ -0,0 +1,125 @@
1
+ # Observability Stack - Docker Compose Override
2
+ # Use with: docker compose -f docker-compose.yml -f docker-compose.observability.yml up -d
3
+ #
4
+ # Includes:
5
+ # - Prometheus: Metrics collection and storage
6
+ # - Grafana: Dashboards and visualization
7
+ # - Loki: Log aggregation
8
+ # - Promtail: Docker log shipper
9
+ # - postgres-exporter: PostgreSQL metrics
10
+
11
+ services:
12
+ prometheus:
13
+ image: prom/prometheus:latest
14
+ container_name: ${PROJECT_NAME:-vibecarbon}-prometheus
15
+ restart: unless-stopped
16
+ command:
17
+ - '--config.file=/etc/prometheus/prometheus.yml'
18
+ - '--storage.tsdb.path=/prometheus'
19
+ - '--storage.tsdb.retention.time=15d'
20
+ - '--web.enable-lifecycle'
21
+ volumes:
22
+ - ./volumes/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
23
+ - prometheus_data:/prometheus
24
+ ports:
25
+ # Default to 9190 to avoid conflict with Google's Antigravity IDE (uses 9090-9092)
26
+ - "${DEV_PROMETHEUS_PORT:-9190}:9090"
27
+ networks:
28
+ - vibecarbon-network
29
+ healthcheck:
30
+ test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:9090/-/healthy']
31
+ interval: 10s
32
+ timeout: 5s
33
+ retries: 3
34
+ start_period: 10s
35
+ depends_on:
36
+ db:
37
+ condition: service_healthy
38
+
39
+ grafana:
40
+ image: grafana/grafana:latest
41
+ container_name: ${PROJECT_NAME:-vibecarbon}-grafana
42
+ restart: unless-stopped
43
+ environment:
44
+ - GF_SECURITY_ADMIN_USER=${ADMIN_EMAIL}
45
+ - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}
46
+ - GF_USERS_ALLOW_SIGN_UP=false
47
+ - GF_SERVER_ROOT_URL=${GRAFANA_URL:-http://localhost:3002}
48
+ - GF_AUTH_ANONYMOUS_ENABLED=true
49
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
50
+ - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/overview.json
51
+ volumes:
52
+ - ./volumes/grafana/provisioning:/etc/grafana/provisioning:ro
53
+ - ./volumes/grafana/dashboards:/var/lib/grafana/dashboards:ro
54
+ - grafana_data:/var/lib/grafana
55
+ ports:
56
+ - "${DEV_GRAFANA_PORT:-3002}:3000"
57
+ networks:
58
+ - vibecarbon-network
59
+ healthcheck:
60
+ test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:3000/api/health']
61
+ interval: 10s
62
+ timeout: 5s
63
+ retries: 3
64
+ start_period: 30s
65
+ labels:
66
+ # Traefik routing with ForwardAuth (super_admin only)
67
+ # Anonymous auth is enabled so super_admins don't need a second Grafana login
68
+ - "traefik.enable=true"
69
+ - "traefik.http.routers.grafana.rule=Host(`grafana.localhost`)"
70
+ - "traefik.http.routers.grafana.entrypoints=web"
71
+ - "traefik.http.routers.grafana.middlewares=super-admin-auth@file"
72
+ - "traefik.http.services.grafana.loadbalancer.server.port=3000"
73
+ depends_on:
74
+ - prometheus
75
+ - loki
76
+
77
+ loki:
78
+ image: grafana/loki:3.3.0
79
+ container_name: ${PROJECT_NAME:-vibecarbon}-loki
80
+ restart: unless-stopped
81
+ command: -config.file=/etc/loki/loki-config.yml
82
+ volumes:
83
+ - ./volumes/loki/loki-config.yml:/etc/loki/loki-config.yml:ro
84
+ - loki_data:/loki
85
+ ports:
86
+ - "${DEV_LOKI_PORT:-3100}:3100"
87
+ networks:
88
+ - vibecarbon-network
89
+ healthcheck:
90
+ test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:3100/ready']
91
+ interval: 10s
92
+ timeout: 5s
93
+ retries: 5
94
+ start_period: 30s
95
+
96
+ promtail:
97
+ image: grafana/promtail:3.3.0
98
+ container_name: ${PROJECT_NAME:-vibecarbon}-promtail
99
+ restart: unless-stopped
100
+ command: -config.file=/etc/promtail/promtail-config.yml
101
+ volumes:
102
+ - ./volumes/promtail/promtail-config.yml:/etc/promtail/promtail-config.yml:ro
103
+ - /var/run/docker.sock:/var/run/docker.sock:ro
104
+ - /var/lib/docker/containers:/var/lib/docker/containers:ro
105
+ networks:
106
+ - vibecarbon-network
107
+ depends_on:
108
+ - loki
109
+
110
+ postgres-exporter:
111
+ image: prometheuscommunity/postgres-exporter:v0.19.1
112
+ container_name: ${PROJECT_NAME:-vibecarbon}-postgres-exporter
113
+ restart: unless-stopped
114
+ environment:
115
+ DATA_SOURCE_NAME: "postgresql://supabase_admin:${POSTGRES_PASSWORD}@db:5432/postgres?sslmode=disable"
116
+ networks:
117
+ - vibecarbon-network
118
+ depends_on:
119
+ db:
120
+ condition: service_healthy
121
+
122
+ volumes:
123
+ prometheus_data:
124
+ grafana_data:
125
+ loki_data:
@@ -0,0 +1,28 @@
1
+ # Development overrides - automatically loaded by docker compose
2
+ # Note: Admin services (studio, traefik) have no auth in local dev - auth added via prod overlay
3
+ #
4
+ # IMPORTANT: For ForwardAuth to work with admin services (n8n, metabase, etc.),
5
+ # access the app at http://app.localhost instead of http://localhost:5173.
6
+ # This ensures auth cookies are shared across all *.localhost subdomains.
7
+ #
8
+ # Secrets (DB passwords, JWTs) are read from env vars at runtime — no dev-specific
9
+ # SQL files needed for roles or service init. Only super-admin uses a dev override
10
+ # (for the admin email and password hash).
11
+
12
+ services:
13
+ db:
14
+ ports:
15
+ - "${DEV_DB_PORT:-5432}:5432"
16
+ volumes:
17
+ - ./volumes/db/super-admin.dev.sql:/tmp/super-admin.sql:Z
18
+
19
+ # Traefik dev config: add extra_hosts so it can reach the Vite dev server on the host
20
+ # Also mount dev middlewares that use host.docker.internal for ForwardAuth
21
+ traefik:
22
+ extra_hosts:
23
+ - "host.docker.internal:host-gateway"
24
+ volumes:
25
+ - /var/run/docker.sock:/var/run/docker.sock:ro
26
+ - ./volumes/traefik:/etc/traefik/dynamic:ro
27
+ # Override middlewares to use host.docker.internal for ForwardAuth in dev
28
+ - ./volumes/traefik/middlewares.dev.yml:/etc/traefik/dynamic/middlewares.yml:ro