create-nextblock 0.16.3 → 0.17.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/CLAUDE.md +22 -0
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/package.json +1 -1
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.swcrc +30 -30
- package/templates/nextblock-template/CLAUDE.md +26 -0
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -16
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -29
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +270 -205
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +10388 -9315
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -47
- package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -47
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +442 -441
- package/templates/nextblock-template/app/article/[slug]/page.utils.ts +4 -1
- package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -20
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +241 -241
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -23
- package/templates/nextblock-template/app/cms/components/SeoScoreBadge.tsx +3 -40
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TablePagination.tsx +136 -136
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -200
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/pages/page.tsx +273 -273
- package/templates/nextblock-template/app/cms/posts/page.tsx +251 -251
- package/templates/nextblock-template/app/cms/products/ProductFormClientShell.tsx +19 -0
- package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +14 -2
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +276 -276
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -190
- package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -56
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -38
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -68
- package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -34
- package/templates/nextblock-template/components/CartTranslator.tsx +210 -210
- package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -51
- package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -68
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/GlobalSearch.tsx +557 -557
- package/templates/nextblock-template/components/Header.tsx +38 -38
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +48 -48
- package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +9 -9
- package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -25
- package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -92
- package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +11 -0
- package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +24 -24
- package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -57
- package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +11 -0
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +19 -0
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms/payments-reminder.test.ts +135 -135
- package/templates/nextblock-template/lib/cms/payments-reminder.ts +105 -105
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +56 -54
- package/templates/nextblock-template/lib/media/youtube.ts +99 -99
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/seo/page-audit-context.tsx +3 -3
- package/templates/nextblock-template/lib/seo/page-document.test.ts +34 -0
- package/templates/nextblock-template/lib/seo/page-document.ts +3 -462
- package/templates/nextblock-template/lib/seo/robots-txt.ts +5 -4
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +50 -10
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -105
- package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -42
- package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -143
- package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -94
- package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -81
- package/templates/nextblock-template/lib/zod-config.ts +5 -5
- package/templates/nextblock-template/next-env.d.ts +1 -0
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/public/images/cortex_post.webp +0 -0
- package/templates/nextblock-template/public/images/update_nextblock.webp +0 -0
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -112
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tools/deploy-supabase.js +159 -159
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# apps/create-nextblock — scaffolding CLI
|
|
2
|
+
|
|
3
|
+
Plain-JavaScript ESM CLI published as `create-nextblock` (`npm create nextblock`). No build
|
|
4
|
+
step, no tests; `lint` is its only `project.json` target.
|
|
5
|
+
|
|
6
|
+
- `bin/create-nextblock.js`: `create [dir]` (cloud or Docker profile; `--yes` = cloud + default
|
|
7
|
+
name) and `activate ecommerce`. At scaffold time it writes `next.config.js` and
|
|
8
|
+
`tailwind.config.js` from string templates (`tsconfig.json` and `package.json` are patched in
|
|
9
|
+
place), so changes to those two files in `apps/nextblock` must be mirrored here.
|
|
10
|
+
- `scripts/sync-template.js` (`npm run sync:create-nextblock`) empties and regenerates
|
|
11
|
+
`templates/nextblock-template/` from `apps/nextblock`, root `docs/`,
|
|
12
|
+
`libs/ui/src/styles/globals.css`, and `docker-template/`; it copies `CLAUDE.md`/`AGENTS.md`
|
|
13
|
+
verbatim and rewrites `@nextblock-cms/ui/<sub>` imports to the barrel.
|
|
14
|
+
- `templates/nextblock-template/**` is generated output: committed, shipped, and the update
|
|
15
|
+
source for `apps/nextblock/tools/update.mjs`. Never edit it.
|
|
16
|
+
- `prepack` runs the sync, so `npm pack` / `npm publish` regenerate the template from the working
|
|
17
|
+
tree; inspect with `npm pack --dry-run --ignore-scripts`.
|
|
18
|
+
|
|
19
|
+
Gotchas: from source the CLI reads lib `^versions` and root overrides; the published tarball
|
|
20
|
+
falls back to `latest` and baked-in overrides, so `npm run test-create` and `npm create nextblock`
|
|
21
|
+
take different paths. `runSetupWizard` in `bin` is dead code; setup happens in the browser
|
|
22
|
+
`/setup` wizard or `docker-template/scripts/docker-setup.mjs`.
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
# ──────────────────────────────────────────────────────────────────────────────
|
|
2
|
-
# Reference for the Docker (self-hosted) .env that `npm run docker:setup` generates.
|
|
3
|
-
# You normally do NOT edit this by hand — run `npm run docker:setup` and it writes a
|
|
4
|
-
# `.env` with secure random secrets. This file documents every key the stack reads.
|
|
5
|
-
# ──────────────────────────────────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
# --- Auto-generated secrets (crypto-random) --------------------------------------------------
|
|
8
|
-
POSTGRES_PASSWORD=replace-me-generated
|
|
9
|
-
JWT_SECRET=replace-me-at-least-32-chars
|
|
10
|
-
JWT_EXP=3600
|
|
11
|
-
# anon + service_role keys are HS256 JWTs SIGNED with JWT_SECRET (generated for you):
|
|
12
|
-
ANON_KEY=replace-me-anon-jwt
|
|
13
|
-
SERVICE_ROLE_KEY=replace-me-service-role-jwt
|
|
14
|
-
CRON_SECRET=replace-me-generated
|
|
15
|
-
DRAFT_MODE_SECRET=replace-me-generated
|
|
16
|
-
REVALIDATE_SECRET_TOKEN=replace-me-generated
|
|
17
|
-
|
|
18
|
-
# --- Host port mappings ----------------------------------------------------------------------
|
|
19
|
-
# The published host ports for each service. docker:setup auto-picks a FREE port when a default
|
|
20
|
-
# is taken or reserved by the OS (common on Windows, e.g. Postgres 54322), then keeps the URLs
|
|
21
|
-
# below and LOOPBACK_PROXIES in lockstep. Change a port here only if you also update its URL.
|
|
22
|
-
APP_PORT=3000
|
|
23
|
-
KONG_HTTP_PORT=8000
|
|
24
|
-
MINIO_S3_PORT=9000
|
|
25
|
-
MINIO_CONSOLE_PORT=9001
|
|
26
|
-
POSTGRES_PORT_EXTERNAL=54322
|
|
27
|
-
# In-container loopback (socat): maps the localhost:<port> server code derives from the public
|
|
28
|
-
# URLs to the real service. Left-hand ports MUST match NEXT_PUBLIC_SUPABASE_URL / R2_S3_PUBLIC_ENDPOINT.
|
|
29
|
-
LOOPBACK_PROXIES=8000:kong:8000 9000:minio:9000
|
|
30
|
-
|
|
31
|
-
# --- Supabase wiring (internal container network vs browser) ---------------------------------
|
|
32
|
-
NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
|
|
33
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=${ANON_KEY}
|
|
34
|
-
SUPABASE_SERVICE_ROLE_KEY=${SERVICE_ROLE_KEY}
|
|
35
|
-
API_EXTERNAL_URL=http://localhost:8000
|
|
36
|
-
SITE_URL=http://localhost:3000
|
|
37
|
-
POSTGRES_DB=postgres
|
|
38
|
-
|
|
39
|
-
# --- App ------------------------------------------------------------------------------------
|
|
40
|
-
NEXT_PUBLIC_URL=http://localhost:3000
|
|
41
|
-
NEXT_PUBLIC_IS_SANDBOX=true
|
|
42
|
-
CORTEX_AI_ENCRYPTION_KEY=
|
|
43
|
-
|
|
44
|
-
# --- MinIO object storage (S3-compatible) ----------------------------------------------------
|
|
45
|
-
MINIO_ROOT_USER=nextblock
|
|
46
|
-
MINIO_ROOT_PASSWORD=replace-me-generated
|
|
47
|
-
STORAGE_BUCKET=nextblock
|
|
48
|
-
R2_ACCOUNT_ID=minio
|
|
49
|
-
R2_REGION=us-east-1
|
|
50
|
-
R2_S3_ENDPOINT=http://minio:9000
|
|
51
|
-
# 127.0.0.1 (not localhost) so the browser never sends the app's localhost cookies to MinIO,
|
|
52
|
-
# which would otherwise 400 (MetadataTooLarge) once the Supabase auth cookies grow.
|
|
53
|
-
R2_S3_PUBLIC_ENDPOINT=http://127.0.0.1:9000
|
|
54
|
-
R2_FORCE_PATH_STYLE=true
|
|
55
|
-
NEXT_PUBLIC_R2_BASE_URL=http://127.0.0.1:9000/nextblock
|
|
56
|
-
NEXT_PUBLIC_R2_PUBLIC_URL=http://127.0.0.1:9000/nextblock
|
|
57
|
-
|
|
58
|
-
# --- Cloudflare Turnstile (optional). Press Enter at setup to skip and use the dev sandbox. ---
|
|
59
|
-
NEXT_PUBLIC_TURNSTILE_SITE_KEY=
|
|
60
|
-
TURNSTILE_SECRET_KEY=
|
|
61
|
-
|
|
62
|
-
# --- SMTP (optional). Blank => GoTrue auto-confirms sign-ups (loopback mode). -----------------
|
|
63
|
-
GOTRUE_MAILER_AUTOCONFIRM=true
|
|
64
|
-
SMTP_HOST=
|
|
65
|
-
SMTP_PORT=
|
|
66
|
-
SMTP_USER=
|
|
67
|
-
SMTP_PASS=
|
|
68
|
-
SMTP_FROM_EMAIL=
|
|
69
|
-
SMTP_FROM_NAME=
|
|
1
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
# Reference for the Docker (self-hosted) .env that `npm run docker:setup` generates.
|
|
3
|
+
# You normally do NOT edit this by hand — run `npm run docker:setup` and it writes a
|
|
4
|
+
# `.env` with secure random secrets. This file documents every key the stack reads.
|
|
5
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
# --- Auto-generated secrets (crypto-random) --------------------------------------------------
|
|
8
|
+
POSTGRES_PASSWORD=replace-me-generated
|
|
9
|
+
JWT_SECRET=replace-me-at-least-32-chars
|
|
10
|
+
JWT_EXP=3600
|
|
11
|
+
# anon + service_role keys are HS256 JWTs SIGNED with JWT_SECRET (generated for you):
|
|
12
|
+
ANON_KEY=replace-me-anon-jwt
|
|
13
|
+
SERVICE_ROLE_KEY=replace-me-service-role-jwt
|
|
14
|
+
CRON_SECRET=replace-me-generated
|
|
15
|
+
DRAFT_MODE_SECRET=replace-me-generated
|
|
16
|
+
REVALIDATE_SECRET_TOKEN=replace-me-generated
|
|
17
|
+
|
|
18
|
+
# --- Host port mappings ----------------------------------------------------------------------
|
|
19
|
+
# The published host ports for each service. docker:setup auto-picks a FREE port when a default
|
|
20
|
+
# is taken or reserved by the OS (common on Windows, e.g. Postgres 54322), then keeps the URLs
|
|
21
|
+
# below and LOOPBACK_PROXIES in lockstep. Change a port here only if you also update its URL.
|
|
22
|
+
APP_PORT=3000
|
|
23
|
+
KONG_HTTP_PORT=8000
|
|
24
|
+
MINIO_S3_PORT=9000
|
|
25
|
+
MINIO_CONSOLE_PORT=9001
|
|
26
|
+
POSTGRES_PORT_EXTERNAL=54322
|
|
27
|
+
# In-container loopback (socat): maps the localhost:<port> server code derives from the public
|
|
28
|
+
# URLs to the real service. Left-hand ports MUST match NEXT_PUBLIC_SUPABASE_URL / R2_S3_PUBLIC_ENDPOINT.
|
|
29
|
+
LOOPBACK_PROXIES=8000:kong:8000 9000:minio:9000
|
|
30
|
+
|
|
31
|
+
# --- Supabase wiring (internal container network vs browser) ---------------------------------
|
|
32
|
+
NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
|
|
33
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=${ANON_KEY}
|
|
34
|
+
SUPABASE_SERVICE_ROLE_KEY=${SERVICE_ROLE_KEY}
|
|
35
|
+
API_EXTERNAL_URL=http://localhost:8000
|
|
36
|
+
SITE_URL=http://localhost:3000
|
|
37
|
+
POSTGRES_DB=postgres
|
|
38
|
+
|
|
39
|
+
# --- App ------------------------------------------------------------------------------------
|
|
40
|
+
NEXT_PUBLIC_URL=http://localhost:3000
|
|
41
|
+
NEXT_PUBLIC_IS_SANDBOX=true
|
|
42
|
+
CORTEX_AI_ENCRYPTION_KEY=
|
|
43
|
+
|
|
44
|
+
# --- MinIO object storage (S3-compatible) ----------------------------------------------------
|
|
45
|
+
MINIO_ROOT_USER=nextblock
|
|
46
|
+
MINIO_ROOT_PASSWORD=replace-me-generated
|
|
47
|
+
STORAGE_BUCKET=nextblock
|
|
48
|
+
R2_ACCOUNT_ID=minio
|
|
49
|
+
R2_REGION=us-east-1
|
|
50
|
+
R2_S3_ENDPOINT=http://minio:9000
|
|
51
|
+
# 127.0.0.1 (not localhost) so the browser never sends the app's localhost cookies to MinIO,
|
|
52
|
+
# which would otherwise 400 (MetadataTooLarge) once the Supabase auth cookies grow.
|
|
53
|
+
R2_S3_PUBLIC_ENDPOINT=http://127.0.0.1:9000
|
|
54
|
+
R2_FORCE_PATH_STYLE=true
|
|
55
|
+
NEXT_PUBLIC_R2_BASE_URL=http://127.0.0.1:9000/nextblock
|
|
56
|
+
NEXT_PUBLIC_R2_PUBLIC_URL=http://127.0.0.1:9000/nextblock
|
|
57
|
+
|
|
58
|
+
# --- Cloudflare Turnstile (optional). Press Enter at setup to skip and use the dev sandbox. ---
|
|
59
|
+
NEXT_PUBLIC_TURNSTILE_SITE_KEY=
|
|
60
|
+
TURNSTILE_SECRET_KEY=
|
|
61
|
+
|
|
62
|
+
# --- SMTP (optional). Blank => GoTrue auto-confirms sign-ups (loopback mode). -----------------
|
|
63
|
+
GOTRUE_MAILER_AUTOCONFIRM=true
|
|
64
|
+
SMTP_HOST=
|
|
65
|
+
SMTP_PORT=
|
|
66
|
+
SMTP_USER=
|
|
67
|
+
SMTP_PASS=
|
|
68
|
+
SMTP_FROM_EMAIL=
|
|
69
|
+
SMTP_FROM_NAME=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
-- Expose the JWT secret to Postgres as a database GUC, matching Supabase's setup. Runs once.
|
|
2
|
-
\set jwt_secret `echo "$JWT_SECRET"`
|
|
3
|
-
\set jwt_exp `echo "$JWT_EXP"`
|
|
4
|
-
|
|
5
|
-
alter database postgres set "app.settings.jwt_secret" to :'jwt_secret';
|
|
6
|
-
alter database postgres set "app.settings.jwt_exp" to :'jwt_exp';
|
|
1
|
+
-- Expose the JWT secret to Postgres as a database GUC, matching Supabase's setup. Runs once.
|
|
2
|
+
\set jwt_secret `echo "$JWT_SECRET"`
|
|
3
|
+
\set jwt_exp `echo "$JWT_EXP"`
|
|
4
|
+
|
|
5
|
+
alter database postgres set "app.settings.jwt_secret" to :'jwt_secret';
|
|
6
|
+
alter database postgres set "app.settings.jwt_exp" to :'jwt_exp';
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
-- Self-hosted Supabase role passwords. The supabase/postgres image creates the platform roles;
|
|
2
|
-
-- GoTrue logs in as supabase_auth_admin and PostgREST as authenticator. Give the roles that exist
|
|
3
|
-
-- the generated POSTGRES_PASSWORD (the set varies by image tag, so each is guarded; the password
|
|
4
|
-
-- is passed via a session GUC because psql variables aren't interpolated inside a dollar block).
|
|
5
|
-
-- Runs once on first init.
|
|
6
|
-
\set pgpass `echo "$POSTGRES_PASSWORD"`
|
|
7
|
-
select set_config('nextblock.pgpass', :'pgpass', false);
|
|
8
|
-
|
|
9
|
-
do $$
|
|
10
|
-
declare
|
|
11
|
-
role_name text;
|
|
12
|
-
begin
|
|
13
|
-
foreach role_name in array array[
|
|
14
|
-
'authenticator',
|
|
15
|
-
'pgbouncer',
|
|
16
|
-
'supabase_auth_admin',
|
|
17
|
-
'supabase_storage_admin',
|
|
18
|
-
'supabase_functions_admin',
|
|
19
|
-
'supabase_read_only_user'
|
|
20
|
-
] loop
|
|
21
|
-
if exists (select 1 from pg_roles where rolname = role_name) then
|
|
22
|
-
execute format('alter role %I with password %L', role_name, current_setting('nextblock.pgpass'));
|
|
23
|
-
end if;
|
|
24
|
-
end loop;
|
|
25
|
-
end $$;
|
|
1
|
+
-- Self-hosted Supabase role passwords. The supabase/postgres image creates the platform roles;
|
|
2
|
+
-- GoTrue logs in as supabase_auth_admin and PostgREST as authenticator. Give the roles that exist
|
|
3
|
+
-- the generated POSTGRES_PASSWORD (the set varies by image tag, so each is guarded; the password
|
|
4
|
+
-- is passed via a session GUC because psql variables aren't interpolated inside a dollar block).
|
|
5
|
+
-- Runs once on first init.
|
|
6
|
+
\set pgpass `echo "$POSTGRES_PASSWORD"`
|
|
7
|
+
select set_config('nextblock.pgpass', :'pgpass', false);
|
|
8
|
+
|
|
9
|
+
do $$
|
|
10
|
+
declare
|
|
11
|
+
role_name text;
|
|
12
|
+
begin
|
|
13
|
+
foreach role_name in array array[
|
|
14
|
+
'authenticator',
|
|
15
|
+
'pgbouncer',
|
|
16
|
+
'supabase_auth_admin',
|
|
17
|
+
'supabase_storage_admin',
|
|
18
|
+
'supabase_functions_admin',
|
|
19
|
+
'supabase_read_only_user'
|
|
20
|
+
] loop
|
|
21
|
+
if exists (select 1 from pg_roles where rolname = role_name) then
|
|
22
|
+
execute format('alter role %I with password %L', role_name, current_setting('nextblock.pgpass'));
|
|
23
|
+
end if;
|
|
24
|
+
end loop;
|
|
25
|
+
end $$;
|
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
# Kong declarative (DB-less) gateway config for the NextBlock self-hosted stack.
|
|
2
|
-
#
|
|
3
|
-
# $SUPABASE_ANON_KEY and $SUPABASE_SERVICE_KEY are substituted at container start by the kong
|
|
4
|
-
# service entrypoint (docker-compose.yml) from the generated ANON_KEY / SERVICE_ROLE_KEY env.
|
|
5
|
-
# Trimmed to just the Auth (GoTrue) and PostgREST routes the app uses.
|
|
6
|
-
_format_version: '2.1'
|
|
7
|
-
_transform: true
|
|
8
|
-
|
|
9
|
-
consumers:
|
|
10
|
-
- username: anon
|
|
11
|
-
keyauth_credentials:
|
|
12
|
-
- key: $SUPABASE_ANON_KEY
|
|
13
|
-
- username: service_role
|
|
14
|
-
keyauth_credentials:
|
|
15
|
-
- key: $SUPABASE_SERVICE_KEY
|
|
16
|
-
|
|
17
|
-
acls:
|
|
18
|
-
- consumer: anon
|
|
19
|
-
group: anon
|
|
20
|
-
- consumer: service_role
|
|
21
|
-
group: admin
|
|
22
|
-
|
|
23
|
-
services:
|
|
24
|
-
- name: auth-v1-open
|
|
25
|
-
url: http://auth:9999/verify
|
|
26
|
-
routes:
|
|
27
|
-
- name: auth-v1-open
|
|
28
|
-
strip_path: true
|
|
29
|
-
paths:
|
|
30
|
-
- /auth/v1/verify
|
|
31
|
-
plugins:
|
|
32
|
-
- name: cors
|
|
33
|
-
- name: auth-v1-open-callback
|
|
34
|
-
url: http://auth:9999/callback
|
|
35
|
-
routes:
|
|
36
|
-
- name: auth-v1-open-callback
|
|
37
|
-
strip_path: true
|
|
38
|
-
paths:
|
|
39
|
-
- /auth/v1/callback
|
|
40
|
-
plugins:
|
|
41
|
-
- name: cors
|
|
42
|
-
- name: auth-v1-open-authorize
|
|
43
|
-
url: http://auth:9999/authorize
|
|
44
|
-
routes:
|
|
45
|
-
- name: auth-v1-open-authorize
|
|
46
|
-
strip_path: true
|
|
47
|
-
paths:
|
|
48
|
-
- /auth/v1/authorize
|
|
49
|
-
plugins:
|
|
50
|
-
- name: cors
|
|
51
|
-
|
|
52
|
-
- name: auth-v1
|
|
53
|
-
url: http://auth:9999/
|
|
54
|
-
routes:
|
|
55
|
-
- name: auth-v1-all
|
|
56
|
-
strip_path: true
|
|
57
|
-
paths:
|
|
58
|
-
- /auth/v1/
|
|
59
|
-
plugins:
|
|
60
|
-
- name: cors
|
|
61
|
-
- name: key-auth
|
|
62
|
-
config:
|
|
63
|
-
hide_credentials: false
|
|
64
|
-
- name: acl
|
|
65
|
-
config:
|
|
66
|
-
hide_groups_header: true
|
|
67
|
-
allow:
|
|
68
|
-
- admin
|
|
69
|
-
- anon
|
|
70
|
-
|
|
71
|
-
- name: rest-v1
|
|
72
|
-
url: http://rest:3000/
|
|
73
|
-
routes:
|
|
74
|
-
- name: rest-v1-all
|
|
75
|
-
strip_path: true
|
|
76
|
-
paths:
|
|
77
|
-
- /rest/v1/
|
|
78
|
-
plugins:
|
|
79
|
-
- name: cors
|
|
80
|
-
- name: key-auth
|
|
81
|
-
config:
|
|
82
|
-
hide_credentials: true
|
|
83
|
-
- name: acl
|
|
84
|
-
config:
|
|
85
|
-
hide_groups_header: true
|
|
86
|
-
allow:
|
|
87
|
-
- admin
|
|
88
|
-
- anon
|
|
89
|
-
|
|
90
|
-
- name: graphql-v1
|
|
91
|
-
url: http://rest:3000/rpc/graphql
|
|
92
|
-
routes:
|
|
93
|
-
- name: graphql-v1-all
|
|
94
|
-
strip_path: true
|
|
95
|
-
paths:
|
|
96
|
-
- /graphql/v1
|
|
97
|
-
plugins:
|
|
98
|
-
- name: cors
|
|
99
|
-
- name: key-auth
|
|
100
|
-
config:
|
|
101
|
-
hide_credentials: false
|
|
102
|
-
- name: request-transformer
|
|
103
|
-
config:
|
|
104
|
-
add:
|
|
105
|
-
headers:
|
|
106
|
-
- 'Content-Profile: graphql_public'
|
|
107
|
-
- name: acl
|
|
108
|
-
config:
|
|
109
|
-
hide_groups_header: true
|
|
110
|
-
allow:
|
|
111
|
-
- admin
|
|
112
|
-
- anon
|
|
1
|
+
# Kong declarative (DB-less) gateway config for the NextBlock self-hosted stack.
|
|
2
|
+
#
|
|
3
|
+
# $SUPABASE_ANON_KEY and $SUPABASE_SERVICE_KEY are substituted at container start by the kong
|
|
4
|
+
# service entrypoint (docker-compose.yml) from the generated ANON_KEY / SERVICE_ROLE_KEY env.
|
|
5
|
+
# Trimmed to just the Auth (GoTrue) and PostgREST routes the app uses.
|
|
6
|
+
_format_version: '2.1'
|
|
7
|
+
_transform: true
|
|
8
|
+
|
|
9
|
+
consumers:
|
|
10
|
+
- username: anon
|
|
11
|
+
keyauth_credentials:
|
|
12
|
+
- key: $SUPABASE_ANON_KEY
|
|
13
|
+
- username: service_role
|
|
14
|
+
keyauth_credentials:
|
|
15
|
+
- key: $SUPABASE_SERVICE_KEY
|
|
16
|
+
|
|
17
|
+
acls:
|
|
18
|
+
- consumer: anon
|
|
19
|
+
group: anon
|
|
20
|
+
- consumer: service_role
|
|
21
|
+
group: admin
|
|
22
|
+
|
|
23
|
+
services:
|
|
24
|
+
- name: auth-v1-open
|
|
25
|
+
url: http://auth:9999/verify
|
|
26
|
+
routes:
|
|
27
|
+
- name: auth-v1-open
|
|
28
|
+
strip_path: true
|
|
29
|
+
paths:
|
|
30
|
+
- /auth/v1/verify
|
|
31
|
+
plugins:
|
|
32
|
+
- name: cors
|
|
33
|
+
- name: auth-v1-open-callback
|
|
34
|
+
url: http://auth:9999/callback
|
|
35
|
+
routes:
|
|
36
|
+
- name: auth-v1-open-callback
|
|
37
|
+
strip_path: true
|
|
38
|
+
paths:
|
|
39
|
+
- /auth/v1/callback
|
|
40
|
+
plugins:
|
|
41
|
+
- name: cors
|
|
42
|
+
- name: auth-v1-open-authorize
|
|
43
|
+
url: http://auth:9999/authorize
|
|
44
|
+
routes:
|
|
45
|
+
- name: auth-v1-open-authorize
|
|
46
|
+
strip_path: true
|
|
47
|
+
paths:
|
|
48
|
+
- /auth/v1/authorize
|
|
49
|
+
plugins:
|
|
50
|
+
- name: cors
|
|
51
|
+
|
|
52
|
+
- name: auth-v1
|
|
53
|
+
url: http://auth:9999/
|
|
54
|
+
routes:
|
|
55
|
+
- name: auth-v1-all
|
|
56
|
+
strip_path: true
|
|
57
|
+
paths:
|
|
58
|
+
- /auth/v1/
|
|
59
|
+
plugins:
|
|
60
|
+
- name: cors
|
|
61
|
+
- name: key-auth
|
|
62
|
+
config:
|
|
63
|
+
hide_credentials: false
|
|
64
|
+
- name: acl
|
|
65
|
+
config:
|
|
66
|
+
hide_groups_header: true
|
|
67
|
+
allow:
|
|
68
|
+
- admin
|
|
69
|
+
- anon
|
|
70
|
+
|
|
71
|
+
- name: rest-v1
|
|
72
|
+
url: http://rest:3000/
|
|
73
|
+
routes:
|
|
74
|
+
- name: rest-v1-all
|
|
75
|
+
strip_path: true
|
|
76
|
+
paths:
|
|
77
|
+
- /rest/v1/
|
|
78
|
+
plugins:
|
|
79
|
+
- name: cors
|
|
80
|
+
- name: key-auth
|
|
81
|
+
config:
|
|
82
|
+
hide_credentials: true
|
|
83
|
+
- name: acl
|
|
84
|
+
config:
|
|
85
|
+
hide_groups_header: true
|
|
86
|
+
allow:
|
|
87
|
+
- admin
|
|
88
|
+
- anon
|
|
89
|
+
|
|
90
|
+
- name: graphql-v1
|
|
91
|
+
url: http://rest:3000/rpc/graphql
|
|
92
|
+
routes:
|
|
93
|
+
- name: graphql-v1-all
|
|
94
|
+
strip_path: true
|
|
95
|
+
paths:
|
|
96
|
+
- /graphql/v1
|
|
97
|
+
plugins:
|
|
98
|
+
- name: cors
|
|
99
|
+
- name: key-auth
|
|
100
|
+
config:
|
|
101
|
+
hide_credentials: false
|
|
102
|
+
- name: request-transformer
|
|
103
|
+
config:
|
|
104
|
+
add:
|
|
105
|
+
headers:
|
|
106
|
+
- 'Content-Profile: graphql_public'
|
|
107
|
+
- name: acl
|
|
108
|
+
config:
|
|
109
|
+
hide_groups_header: true
|
|
110
|
+
allow:
|
|
111
|
+
- admin
|
|
112
|
+
- anon
|