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.
- package/LICENSE +663 -0
- package/README.md +188 -0
- package/carbon/.claude/hooks/task-completed-gate.sh +19 -0
- package/carbon/.claude/hooks/teammate-idle-gate.sh +29 -0
- package/carbon/.claude/settings.json +29 -0
- package/carbon/.cursor/rules/vibecarbon.mdc +6 -0
- package/carbon/.dockerignore +57 -0
- package/carbon/.env.example +219 -0
- package/carbon/.github/copilot-instructions.md +3 -0
- package/carbon/.github/workflows/deploy.yml +346 -0
- package/carbon/.github/workflows/vibecarbon-build.yml +81 -0
- package/carbon/.windsurfrules +74 -0
- package/carbon/AGENTS.md +422 -0
- package/carbon/CLAUDE.md +3 -0
- package/carbon/DEVELOPMENT.md +187 -0
- package/carbon/Dockerfile +98 -0
- package/carbon/LICENSE +21 -0
- package/carbon/PRODUCTION.md +364 -0
- package/carbon/README.md +193 -0
- package/carbon/TESTING.md +138 -0
- package/carbon/backup/Dockerfile +75 -0
- package/carbon/backup/backup.sh +95 -0
- package/carbon/backup/compose-backup.sh +140 -0
- package/carbon/biome.json +83 -0
- package/carbon/cloud-init/docker-ce-setup.yaml +55 -0
- package/carbon/cloud-init/k3s/master-init.sh +215 -0
- package/carbon/cloud-init/k3s/supabase-init.sh +167 -0
- package/carbon/cloud-init/k3s/worker-init.sh +147 -0
- package/carbon/components.json +24 -0
- package/carbon/content/blog/authentication-guide.mdx +34 -0
- package/carbon/content/blog/getting-started.mdx +41 -0
- package/carbon/content/changelog/v0-1-0.mdx +40 -0
- package/carbon/content/docs/analytics.mdx +90 -0
- package/carbon/content/docs/authentication.mdx +231 -0
- package/carbon/content/docs/background-jobs.mdx +116 -0
- package/carbon/content/docs/cli.mdx +630 -0
- package/carbon/content/docs/database.mdx +236 -0
- package/carbon/content/docs/deployment.mdx +227 -0
- package/carbon/content/docs/development.mdx +238 -0
- package/carbon/content/docs/environments.mdx +84 -0
- package/carbon/content/docs/getting-started.mdx +112 -0
- package/carbon/content/docs/legal/privacy-policy.mdx +89 -0
- package/carbon/content/docs/legal/terms-of-service.mdx +99 -0
- package/carbon/content/docs/optional-services.mdx +160 -0
- package/carbon/db/Dockerfile +23 -0
- package/carbon/docker-compose.dev-init.yml +5 -0
- package/carbon/docker-compose.metabase.override.yml +14 -0
- package/carbon/docker-compose.metabase.prod.yml +28 -0
- package/carbon/docker-compose.metabase.yml +84 -0
- package/carbon/docker-compose.n8n.override.yml +14 -0
- package/carbon/docker-compose.n8n.prod.yml +31 -0
- package/carbon/docker-compose.n8n.yml +97 -0
- package/carbon/docker-compose.observability.override.yml +18 -0
- package/carbon/docker-compose.observability.prod.yml +28 -0
- package/carbon/docker-compose.observability.yml +125 -0
- package/carbon/docker-compose.override.yml +28 -0
- package/carbon/docker-compose.prod.yml +294 -0
- package/carbon/docker-compose.yml +508 -0
- package/carbon/docker-entrypoint.sh +12 -0
- package/carbon/ha/activate-standby.sh +52 -0
- package/carbon/ha/primary-init.sql +36 -0
- package/carbon/ha/standby-init.sh +74 -0
- package/carbon/k8s/LICENSE +99 -0
- package/carbon/k8s/README.md +272 -0
- package/carbon/k8s/base/app/deployment.yaml +130 -0
- package/carbon/k8s/base/app/hpa.yaml +44 -0
- package/carbon/k8s/base/app/kustomization.yaml +10 -0
- package/carbon/k8s/base/app/network-policy.yaml +124 -0
- package/carbon/k8s/base/app/pdb.yaml +14 -0
- package/carbon/k8s/base/app/rbac.yaml +36 -0
- package/carbon/k8s/base/app/service.yaml +16 -0
- package/carbon/k8s/base/backup/cronjob.yaml +120 -0
- package/carbon/k8s/base/backup/kustomization.yaml +7 -0
- package/carbon/k8s/base/backup/network-policy.yaml +31 -0
- package/carbon/k8s/base/backup/rbac.yaml +7 -0
- package/carbon/k8s/base/cluster-autoscaler/deployment.yaml +103 -0
- package/carbon/k8s/base/cluster-autoscaler/kustomization.yaml +17 -0
- package/carbon/k8s/base/cluster-autoscaler/rbac.yaml +109 -0
- package/carbon/k8s/base/config/configmap.yaml +48 -0
- package/carbon/k8s/base/config/kustomization.yaml +8 -0
- package/carbon/k8s/base/hetzner-ccm/kustomization.yaml +9 -0
- package/carbon/k8s/base/hetzner-csi/kustomization.yaml +9 -0
- package/carbon/k8s/base/kustomization.yaml +43 -0
- package/carbon/k8s/base/namespace.yaml +7 -0
- package/carbon/k8s/base/network-policies.yaml +95 -0
- package/carbon/k8s/base/registry/kustomization.yaml +5 -0
- package/carbon/k8s/base/registry/local-registry.yaml +193 -0
- package/carbon/k8s/base/traefik/certificate.yaml +21 -0
- package/carbon/k8s/base/traefik/configmap.yaml +13 -0
- package/carbon/k8s/base/traefik/deployment.yaml +165 -0
- package/carbon/k8s/base/traefik/ingressroute.yaml +141 -0
- package/carbon/k8s/base/traefik/kustomization.yaml +11 -0
- package/carbon/k8s/base/traefik/middleware.yaml +109 -0
- package/carbon/k8s/base/traefik/network-policy.yaml +92 -0
- package/carbon/k8s/base/traefik/service.yaml +38 -0
- package/carbon/k8s/flux/README.md +49 -0
- package/carbon/k8s/flux/clusters/primary/vibecarbon.yaml +128 -0
- package/carbon/k8s/flux/clusters/standby/vibecarbon.yaml +83 -0
- package/carbon/k8s/gitops/cert-manager-webhook-hetzner/helm-release.yaml +38 -0
- package/carbon/k8s/gitops/cert-manager-webhook-hetzner/helm-repository.yaml +16 -0
- package/carbon/k8s/gitops/cert-manager-webhook-hetzner/kustomization.yaml +10 -0
- package/carbon/k8s/gitops/supabase/helm-release.yaml +66 -0
- package/carbon/k8s/gitops/supabase/helm-repository.yaml +18 -0
- package/carbon/k8s/gitops/supabase/kustomization.yaml +33 -0
- package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-cloudflare.yaml +51 -0
- package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-hetzner.yaml +59 -0
- package/carbon/k8s/infra/cert-manager-resources/cluster-issuers-manual.yaml +43 -0
- package/carbon/k8s/infra/cert-manager-resources/kustomization.yaml +15 -0
- package/carbon/k8s/infra/kustomization.yaml +21 -0
- package/carbon/k8s/infra/traefik-crds/kustomization.yaml +10 -0
- package/carbon/k8s/overlays/local/configmap.yaml +23 -0
- package/carbon/k8s/overlays/local/ingressroute-studio.yaml +104 -0
- package/carbon/k8s/overlays/local/kustomization.yaml +215 -0
- package/carbon/k8s/overlays/local/namespace.yaml +8 -0
- package/carbon/k8s/overlays/local/secrets.yaml +32 -0
- package/carbon/k8s/overlays/production/kustomization.yaml +34 -0
- package/carbon/k8s/test-local.sh +318 -0
- package/carbon/k8s/values/supabase.values.yaml +133 -0
- package/carbon/package.json +154 -0
- package/carbon/runtime.Dockerfile +17 -0
- package/carbon/scripts/_dev-jwt.mjs +45 -0
- package/carbon/scripts/check-rls.ts +53 -0
- package/carbon/scripts/dev-init.js +191 -0
- package/carbon/scripts/dev.js +191 -0
- package/carbon/scripts/docker-down.js +63 -0
- package/carbon/scripts/docker-logs.js +59 -0
- package/carbon/scripts/docker-up.js +222 -0
- package/carbon/scripts/generate-dev-configs.sh +131 -0
- package/carbon/scripts/generate-rss.ts +116 -0
- package/carbon/scripts/generate-sitemap.ts +102 -0
- package/carbon/scripts/k8s-apply.js +71 -0
- package/carbon/scripts/k8s-delete.js +75 -0
- package/carbon/scripts/lib/manifest.js +176 -0
- package/carbon/scripts/secret-scan.mjs +278 -0
- package/carbon/scripts/validate-dev-configs.sh +101 -0
- package/carbon/src/client/App.tsx +202 -0
- package/carbon/src/client/assets/hyperformant-dark.svg +29 -0
- package/carbon/src/client/assets/hyperformant-light.svg +29 -0
- package/carbon/src/client/assets/logos/aider.svg +1 -0
- package/carbon/src/client/assets/logos/antigravity.svg +1 -0
- package/carbon/src/client/assets/logos/bolt.svg +1 -0
- package/carbon/src/client/assets/logos/claude-code.svg +1 -0
- package/carbon/src/client/assets/logos/copilot.svg +1 -0
- package/carbon/src/client/assets/logos/cursor.svg +1 -0
- package/carbon/src/client/assets/logos/gemini-cli.svg +1 -0
- package/carbon/src/client/assets/logos/lovable.svg +1 -0
- package/carbon/src/client/assets/logos/openai-codex.svg +1 -0
- package/carbon/src/client/assets/logos/v0.svg +1 -0
- package/carbon/src/client/assets/logos/windsurf.svg +1 -0
- package/carbon/src/client/assets/vibecarbon-icon.svg +19 -0
- package/carbon/src/client/assets/vibecarbon-logo-dark.svg +29 -0
- package/carbon/src/client/assets/vibecarbon-logo-light.svg +29 -0
- package/carbon/src/client/components/AIIntegrationSection.tsx +120 -0
- package/carbon/src/client/components/AppSidebar.tsx +760 -0
- package/carbon/src/client/components/ArchitectureSection.tsx +46 -0
- package/carbon/src/client/components/CTAFooter.tsx +59 -0
- package/carbon/src/client/components/ComparisonSection.tsx +132 -0
- package/carbon/src/client/components/ContentPanel.tsx +66 -0
- package/carbon/src/client/components/ContentSkeleton.tsx +21 -0
- package/carbon/src/client/components/ErrorBoundary.tsx +46 -0
- package/carbon/src/client/components/FAQSection.tsx +76 -0
- package/carbon/src/client/components/FileUpload.tsx +210 -0
- package/carbon/src/client/components/HeaderActions.tsx +17 -0
- package/carbon/src/client/components/Hero.tsx +608 -0
- package/carbon/src/client/components/ImpersonationBanner.tsx +31 -0
- package/carbon/src/client/components/LanguageSwitcher.tsx +67 -0
- package/carbon/src/client/components/Logo.tsx +87 -0
- package/carbon/src/client/components/LogoStrip.tsx +76 -0
- package/carbon/src/client/components/MetricsStrip.tsx +48 -0
- package/carbon/src/client/components/Nav.tsx +195 -0
- package/carbon/src/client/components/NewsletterSignup.tsx +147 -0
- package/carbon/src/client/components/NotificationDrawer.tsx +171 -0
- package/carbon/src/client/components/PageHeader.tsx +24 -0
- package/carbon/src/client/components/PlanGate.tsx +36 -0
- package/carbon/src/client/components/PricingSection.tsx +371 -0
- package/carbon/src/client/components/SEO.tsx +34 -0
- package/carbon/src/client/components/SmoothScroll.tsx +45 -0
- package/carbon/src/client/components/TechStackSection.tsx +165 -0
- package/carbon/src/client/components/WorkflowSection.tsx +604 -0
- package/carbon/src/client/components/admin/DockerLogs.tsx +276 -0
- package/carbon/src/client/components/admin/PerformanceMetrics.tsx +230 -0
- package/carbon/src/client/components/admin/ServiceCard.tsx +45 -0
- package/carbon/src/client/components/admin/ServicesStatus.tsx +296 -0
- package/carbon/src/client/components/architecture/ArchitectureDiagram.tsx +413 -0
- package/carbon/src/client/components/auth/AuthProvider.tsx +466 -0
- package/carbon/src/client/components/effects/FilmGrainOverlay.tsx +35 -0
- package/carbon/src/client/components/effects/FresnelEdge.tsx +49 -0
- package/carbon/src/client/components/effects/GlowTracker.tsx +46 -0
- package/carbon/src/client/components/effects/SparkBurst.tsx +145 -0
- package/carbon/src/client/components/effects/VGlowEffect.tsx +83 -0
- package/carbon/src/client/components/effects/index.ts +2 -0
- package/carbon/src/client/components/layouts/SidebarLayout.tsx +20 -0
- package/carbon/src/client/components/scroll/ScrollSection.tsx +76 -0
- package/carbon/src/client/components/scroll/ScrollytellingProvider.tsx +81 -0
- package/carbon/src/client/components/scroll/index.ts +2 -0
- package/carbon/src/client/components/ui/accordion.tsx +71 -0
- package/carbon/src/client/components/ui/alert-dialog.tsx +162 -0
- package/carbon/src/client/components/ui/alert.tsx +73 -0
- package/carbon/src/client/components/ui/aspect-ratio.tsx +22 -0
- package/carbon/src/client/components/ui/avatar.tsx +91 -0
- package/carbon/src/client/components/ui/badge.tsx +50 -0
- package/carbon/src/client/components/ui/breadcrumb.tsx +100 -0
- package/carbon/src/client/components/ui/button-group.tsx +78 -0
- package/carbon/src/client/components/ui/button.tsx +120 -0
- package/carbon/src/client/components/ui/calendar.tsx +182 -0
- package/carbon/src/client/components/ui/card.tsx +85 -0
- package/carbon/src/client/components/ui/carousel.tsx +227 -0
- package/carbon/src/client/components/ui/chart.tsx +357 -0
- package/carbon/src/client/components/ui/checkbox.tsx +27 -0
- package/carbon/src/client/components/ui/collapsible.tsx +15 -0
- package/carbon/src/client/components/ui/command.tsx +178 -0
- package/carbon/src/client/components/ui/context-menu.tsx +233 -0
- package/carbon/src/client/components/ui/dialog.tsx +132 -0
- package/carbon/src/client/components/ui/drawer.tsx +118 -0
- package/carbon/src/client/components/ui/dropdown-menu.tsx +242 -0
- package/carbon/src/client/components/ui/empty.tsx +94 -0
- package/carbon/src/client/components/ui/field.tsx +226 -0
- package/carbon/src/client/components/ui/hover-card.tsx +44 -0
- package/carbon/src/client/components/ui/input-group.tsx +146 -0
- package/carbon/src/client/components/ui/input-otp.tsx +83 -0
- package/carbon/src/client/components/ui/input.tsx +20 -0
- package/carbon/src/client/components/ui/item.tsx +188 -0
- package/carbon/src/client/components/ui/kbd.tsx +26 -0
- package/carbon/src/client/components/ui/label.tsx +21 -0
- package/carbon/src/client/components/ui/menubar.tsx +250 -0
- package/carbon/src/client/components/ui/navigation-menu.tsx +155 -0
- package/carbon/src/client/components/ui/pagination.tsx +102 -0
- package/carbon/src/client/components/ui/popover.tsx +75 -0
- package/carbon/src/client/components/ui/progress.tsx +66 -0
- package/carbon/src/client/components/ui/radio-group.tsx +36 -0
- package/carbon/src/client/components/ui/resizable.tsx +46 -0
- package/carbon/src/client/components/ui/scroll-area.tsx +48 -0
- package/carbon/src/client/components/ui/select.tsx +186 -0
- package/carbon/src/client/components/ui/separator.tsx +21 -0
- package/carbon/src/client/components/ui/sheet.tsx +124 -0
- package/carbon/src/client/components/ui/sidebar.tsx +702 -0
- package/carbon/src/client/components/ui/skeleton.tsx +13 -0
- package/carbon/src/client/components/ui/slider.tsx +57 -0
- package/carbon/src/client/components/ui/sonner.tsx +45 -0
- package/carbon/src/client/components/ui/spinner.tsx +15 -0
- package/carbon/src/client/components/ui/switch.tsx +30 -0
- package/carbon/src/client/components/ui/table.tsx +89 -0
- package/carbon/src/client/components/ui/tabs.tsx +73 -0
- package/carbon/src/client/components/ui/textarea.tsx +18 -0
- package/carbon/src/client/components/ui/toggle-group.tsx +87 -0
- package/carbon/src/client/components/ui/toggle.tsx +44 -0
- package/carbon/src/client/components/ui/tooltip.tsx +56 -0
- package/carbon/src/client/hooks/api/index.ts +14 -0
- package/carbon/src/client/hooks/api/useAuthSettings.ts +80 -0
- package/carbon/src/client/hooks/api/useSubscription.ts +87 -0
- package/carbon/src/client/hooks/use-mobile.ts +21 -0
- package/carbon/src/client/hooks/useMousePosition.ts +91 -0
- package/carbon/src/client/hooks/useNotifications.tsx +124 -0
- package/carbon/src/client/hooks/useOrganizationMembers.ts +127 -0
- package/carbon/src/client/hooks/useOrganizations.tsx +230 -0
- package/carbon/src/client/hooks/usePackageManager.ts +69 -0
- package/carbon/src/client/hooks/useReducedMotion.ts +20 -0
- package/carbon/src/client/hooks/useRunningServices.ts +114 -0
- package/carbon/src/client/hooks/useScrollProgress.ts +56 -0
- package/carbon/src/client/index.css +467 -0
- package/carbon/src/client/index.html +56 -0
- package/carbon/src/client/lib/admin-services.ts +151 -0
- package/carbon/src/client/lib/api.ts +32 -0
- package/carbon/src/client/lib/blog.ts +35 -0
- package/carbon/src/client/lib/changelog.ts +33 -0
- package/carbon/src/client/lib/docs-search.ts +101 -0
- package/carbon/src/client/lib/docs.ts +37 -0
- package/carbon/src/client/lib/i18n.ts +32 -0
- package/carbon/src/client/lib/supabase.ts +72 -0
- package/carbon/src/client/lib/tailwind-colors.ts +357 -0
- package/carbon/src/client/lib/theme.ts +117 -0
- package/carbon/src/client/lib/utils.ts +22 -0
- package/carbon/src/client/locales/de.json +529 -0
- package/carbon/src/client/locales/en.json +461 -0
- package/carbon/src/client/locales/es.json +529 -0
- package/carbon/src/client/locales/fr.json +529 -0
- package/carbon/src/client/locales/pt.json +529 -0
- package/carbon/src/client/main.tsx +56 -0
- package/carbon/src/client/mdx.d.ts +13 -0
- package/carbon/src/client/pages/ApiDocs.tsx +76 -0
- package/carbon/src/client/pages/AuthCallback.tsx +34 -0
- package/carbon/src/client/pages/Blog.tsx +167 -0
- package/carbon/src/client/pages/Changelog.tsx +171 -0
- package/carbon/src/client/pages/Charts.tsx +388 -0
- package/carbon/src/client/pages/Checkout.tsx +227 -0
- package/carbon/src/client/pages/Contact.tsx +174 -0
- package/carbon/src/client/pages/Dashboard.tsx +368 -0
- package/carbon/src/client/pages/Docs.tsx +372 -0
- package/carbon/src/client/pages/ForgotPassword.tsx +111 -0
- package/carbon/src/client/pages/Home.tsx +187 -0
- package/carbon/src/client/pages/Legal.tsx +100 -0
- package/carbon/src/client/pages/Login.tsx +408 -0
- package/carbon/src/client/pages/MFAVerify.tsx +156 -0
- package/carbon/src/client/pages/NotFound.tsx +21 -0
- package/carbon/src/client/pages/Onboarding.tsx +246 -0
- package/carbon/src/client/pages/ResetPassword.tsx +200 -0
- package/carbon/src/client/pages/UIComponents.tsx +390 -0
- package/carbon/src/client/pages/admin/ContactSubmissions.tsx +220 -0
- package/carbon/src/client/pages/admin/Dashboard.tsx +24 -0
- package/carbon/src/client/pages/admin/Infrastructure.tsx +257 -0
- package/carbon/src/client/pages/admin/Jobs.tsx +225 -0
- package/carbon/src/client/pages/admin/Logs.tsx +18 -0
- package/carbon/src/client/pages/admin/Newsletter.tsx +300 -0
- package/carbon/src/client/pages/admin/Notifications.tsx +603 -0
- package/carbon/src/client/pages/admin/Organizations.tsx +306 -0
- package/carbon/src/client/pages/admin/Settings.tsx +314 -0
- package/carbon/src/client/pages/admin/Theme.tsx +465 -0
- package/carbon/src/client/pages/admin/Users.tsx +365 -0
- package/carbon/src/client/pages/api-docs.css +156 -0
- package/carbon/src/client/pages/organizations/Details.tsx +200 -0
- package/carbon/src/client/pages/organizations/Members.tsx +402 -0
- package/carbon/src/client/pages/settings/Billing.tsx +473 -0
- package/carbon/src/client/pages/settings/Profile.tsx +160 -0
- package/carbon/src/client/pages/settings/Security.tsx +341 -0
- package/carbon/src/client/public/favicon.svg +19 -0
- package/carbon/src/client/public/robots.txt +8 -0
- package/carbon/src/server/billing/index.ts +104 -0
- package/carbon/src/server/billing/provider.ts +81 -0
- package/carbon/src/server/billing/providers/paddle.ts +314 -0
- package/carbon/src/server/billing/providers/polar.ts +325 -0
- package/carbon/src/server/billing/providers/stripe.ts +233 -0
- package/carbon/src/server/emails/templates.ts +116 -0
- package/carbon/src/server/index.ts +554 -0
- package/carbon/src/server/lib/auth.ts +6 -0
- package/carbon/src/server/lib/email.ts +64 -0
- package/carbon/src/server/lib/env.ts +112 -0
- package/carbon/src/server/lib/errors.ts +21 -0
- package/carbon/src/server/lib/logger.ts +17 -0
- package/carbon/src/server/lib/rate-limiter.ts +288 -0
- package/carbon/src/server/lib/request.ts +34 -0
- package/carbon/src/server/lib/stripe.ts +42 -0
- package/carbon/src/server/lib/supabase.ts +65 -0
- package/carbon/src/server/middleware/requirePlan.ts +80 -0
- package/carbon/src/server/routes/_internal/services-status.ts +958 -0
- package/carbon/src/server/routes/_internal/verify-role.ts +185 -0
- package/carbon/src/server/routes/health.ts +48 -0
- package/carbon/src/server/routes/v1/admin/contact.ts +128 -0
- package/carbon/src/server/routes/v1/admin/jobs.ts +171 -0
- package/carbon/src/server/routes/v1/admin/newsletter.ts +237 -0
- package/carbon/src/server/routes/v1/auth.ts +390 -0
- package/carbon/src/server/routes/v1/billing.ts +718 -0
- package/carbon/src/server/routes/v1/contact.ts +93 -0
- package/carbon/src/server/routes/v1/index.ts +1333 -0
- package/carbon/src/server/routes/v1/newsletter.ts +181 -0
- package/carbon/src/server/routes/v1/performance.ts +157 -0
- package/carbon/src/server/routes/v1/stats.ts +170 -0
- package/carbon/src/server/routes/v1/theme.ts +106 -0
- package/carbon/src/server/routes/webhooks/billing.ts +376 -0
- package/carbon/src/server/routes/webhooks/stripe.ts +276 -0
- package/carbon/src/server/types.ts +11 -0
- package/carbon/src/shared/pricing.ts +155 -0
- package/carbon/src/shared/types.ts +338 -0
- package/carbon/supabase/migrations/00001_init.sql +717 -0
- package/carbon/supabase/migrations/00002_theme_settings.sql +13 -0
- package/carbon/supabase/migrations/00003_pg_cron.sql +121 -0
- package/carbon/supabase/migrations/00004_contact_newsletter.sql +81 -0
- package/carbon/supabase/migrations/00005_localization_languages.sql +22 -0
- package/carbon/supabase/seed.sql +16 -0
- package/carbon/tests/_helpers/app.ts +45 -0
- package/carbon/tests/_helpers/env.ts +37 -0
- package/carbon/tests/_helpers/factories.ts +69 -0
- package/carbon/tests/_helpers/jwt.ts +23 -0
- package/carbon/tests/_helpers/setup-integration.ts +20 -0
- package/carbon/tests/_helpers/setup-rtl.ts +12 -0
- package/carbon/tests/component/ErrorBoundary.test.tsx +53 -0
- package/carbon/tests/component/use-auth-settings.test.tsx +119 -0
- package/carbon/tests/integration/server/routes/contact.test.ts +162 -0
- package/carbon/tests/integration/server/routes/health.test.ts +61 -0
- package/carbon/tests/structural/i18n-parity.test.ts +42 -0
- package/carbon/tests/unit/client/utils.test.ts +49 -0
- package/carbon/tests/unit/shared/pricing.test.ts +93 -0
- package/carbon/tsconfig.json +27 -0
- package/carbon/tsconfig.server.json +27 -0
- package/carbon/tsconfig.test.json +9 -0
- package/carbon/vite.config.ts +110 -0
- package/carbon/vitest.config.ts +74 -0
- package/carbon/volumes/db/jwt.sql +57 -0
- package/carbon/volumes/db/metabase-init.sh +29 -0
- package/carbon/volumes/db/n8n-init.sh +25 -0
- package/carbon/volumes/db/realtime.sql +33 -0
- package/carbon/volumes/db/roles.sql +93 -0
- package/carbon/volumes/db/set-passwords.sh +12 -0
- package/carbon/volumes/db/super-admin.dev.sql +113 -0
- package/carbon/volumes/db/super-admin.generated.sql +113 -0
- package/carbon/volumes/db/super-admin.sql +114 -0
- package/carbon/volumes/grafana/dashboards/logs.json +179 -0
- package/carbon/volumes/grafana/dashboards/overview.json +523 -0
- package/carbon/volumes/grafana/dashboards/postgresql.json +337 -0
- package/carbon/volumes/grafana/dashboards.dev/logs.json +179 -0
- package/carbon/volumes/grafana/dashboards.dev/overview.json +156 -0
- package/carbon/volumes/grafana/dashboards.dev/postgresql.json +337 -0
- package/carbon/volumes/grafana/provisioning/dashboards/dashboards.dev.yml +16 -0
- package/carbon/volumes/grafana/provisioning/dashboards/dashboards.yml +16 -0
- package/carbon/volumes/grafana/provisioning/datasources/datasources.yml +43 -0
- package/carbon/volumes/kong/docker-entrypoint.sh +9 -0
- package/carbon/volumes/kong/kong.yml +208 -0
- package/carbon/volumes/loki/loki-config.yml +58 -0
- package/carbon/volumes/n8n/hooks.js +131 -0
- package/carbon/volumes/n8n/scripts/setup.sh +66 -0
- package/carbon/volumes/prometheus/prometheus.yml +43 -0
- package/carbon/volumes/promtail/promtail-config.yml +64 -0
- package/carbon/volumes/traefik/middlewares.dev.yml +83 -0
- package/carbon/volumes/traefik/middlewares.yml +95 -0
- package/carbon/volumes/traefik/vite-dev.yml +20 -0
- package/package.json +95 -0
- package/src/access.js +354 -0
- package/src/activate.js +187 -0
- package/src/add.js +718 -0
- package/src/backup.js +786 -0
- package/src/cli.js +350 -0
- package/src/configure.js +967 -0
- package/src/console.js +155 -0
- package/src/create.js +1499 -0
- package/src/deploy.js +311 -0
- package/src/destroy.js +2033 -0
- package/src/diagnose.js +735 -0
- package/src/down.js +80 -0
- package/src/failover.js +1032 -0
- package/src/lib/backup-s3.js +179 -0
- package/src/lib/build.js +33 -0
- package/src/lib/checksum.js +28 -0
- package/src/lib/ci-setup.js +666 -0
- package/src/lib/cli/help.js +129 -0
- package/src/lib/cli/parse-flags.js +160 -0
- package/src/lib/cli/select-action.js +65 -0
- package/src/lib/cli/select-environment.js +108 -0
- package/src/lib/cli/tty-guard.js +75 -0
- package/src/lib/cloudflare.js +447 -0
- package/src/lib/colors.js +52 -0
- package/src/lib/command.js +361 -0
- package/src/lib/config.js +359 -0
- package/src/lib/cost.js +103 -0
- package/src/lib/deploy/bundle.js +231 -0
- package/src/lib/deploy/compose/acme-verify.js +121 -0
- package/src/lib/deploy/compose/build-args.js +78 -0
- package/src/lib/deploy/compose/ha.js +1874 -0
- package/src/lib/deploy/compose/index.js +1294 -0
- package/src/lib/deploy/compose/reconcile.js +74 -0
- package/src/lib/deploy/github.js +382 -0
- package/src/lib/deploy/image.js +191 -0
- package/src/lib/deploy/index.js +119 -0
- package/src/lib/deploy/k8s/LICENSE +99 -0
- package/src/lib/deploy/k8s/gitops-deploy.js +298 -0
- package/src/lib/deploy/k8s/ha/index.js +1000 -0
- package/src/lib/deploy/k8s/index.js +62 -0
- package/src/lib/deploy/k8s/k3s.js +2515 -0
- package/src/lib/deploy/orchestrator.js +1401 -0
- package/src/lib/deploy/prompts.js +545 -0
- package/src/lib/deploy/remote-build.js +130 -0
- package/src/lib/deploy/state.js +120 -0
- package/src/lib/deploy/utils.js +328 -0
- package/src/lib/deploy-logger.js +93 -0
- package/src/lib/dns-propagation.js +48 -0
- package/src/lib/environment.js +58 -0
- package/src/lib/fetch-retry.js +103 -0
- package/src/lib/github-environments.js +335 -0
- package/src/lib/hetzner-dns.js +377 -0
- package/src/lib/hetzner-guided-setup.js +275 -0
- package/src/lib/host-keys.js +37 -0
- package/src/lib/iac/cloud-init.js +52 -0
- package/src/lib/iac/index.js +325 -0
- package/src/lib/iac/programs/hetzner-compose.js +130 -0
- package/src/lib/iac/programs/hetzner-k8s.js +320 -0
- package/src/lib/kubectl.js +81 -0
- package/src/lib/licensing/index.js +259 -0
- package/src/lib/licensing/tiers.js +181 -0
- package/src/lib/licensing/validator.js +171 -0
- package/src/lib/merge-package-json.js +90 -0
- package/src/lib/operator-ip.js +381 -0
- package/src/lib/package-manager.js +111 -0
- package/src/lib/perf.js +71 -0
- package/src/lib/project-guard.js +39 -0
- package/src/lib/project.js +334 -0
- package/src/lib/providers/base.js +276 -0
- package/src/lib/providers/hetzner-s3.js +656 -0
- package/src/lib/providers/hetzner.js +755 -0
- package/src/lib/providers/index.js +164 -0
- package/src/lib/s3.js +510 -0
- package/src/lib/secret-scan.js +583 -0
- package/src/lib/secrets.js +63 -0
- package/src/lib/server-types.js +195 -0
- package/src/lib/shell.js +91 -0
- package/src/lib/ssh.js +241 -0
- package/src/lib/tracker.js +242 -0
- package/src/lib/upgrade-policy.js +170 -0
- package/src/lib/validators.js +105 -0
- package/src/lib/version.js +5 -0
- package/src/remove.js +292 -0
- package/src/reset.js +97 -0
- package/src/restore.js +871 -0
- package/src/scale.js +1734 -0
- package/src/shell.js +222 -0
- package/src/status.js +981 -0
- package/src/up.js +264 -0
- 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,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
|