@voltro/cli 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/CHANGELOG.md +52 -0
- package/LICENSE +57 -0
- package/README.md +26 -0
- package/SECURITY.md +56 -0
- package/THIRD-PARTY-NOTICES.md +20236 -0
- package/bin/voltro.mjs +43 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +9 -0
- package/dist/commands-CfPH2Wf4.js +18061 -0
- package/dist/frameworkInspectState-CX2250XB.js +86 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +5 -0
- package/dist/inspectState.d.ts +116 -0
- package/dist/inspectState.js +2 -0
- package/dist/startup.d.ts +26 -0
- package/dist/startup.js +2 -0
- package/dist/startupRunner-CRhuUl91.js +71 -0
- package/package.json +88 -0
- package/templates/AGENTS.core.md +258 -0
- package/templates/AGENTS.md +351 -0
- package/templates/agent-docs/_index.md +93 -0
- package/templates/agent-docs/_manifest.json +655 -0
- package/templates/agent-docs/ai.md +1845 -0
- package/templates/agent-docs/authentication.md +1788 -0
- package/templates/agent-docs/caching.md +624 -0
- package/templates/agent-docs/cli.md +1650 -0
- package/templates/agent-docs/configuration.md +295 -0
- package/templates/agent-docs/data.md +2172 -0
- package/templates/agent-docs/database/advancedqueries.md +1583 -0
- package/templates/agent-docs/database/columntypes.md +1200 -0
- package/templates/agent-docs/database/hosting.md +881 -0
- package/templates/agent-docs/database/migrations.md +2938 -0
- package/templates/agent-docs/database/misc.md +270 -0
- package/templates/agent-docs/database/overview.md +108 -0
- package/templates/agent-docs/database/querying.md +1622 -0
- package/templates/agent-docs/database/scaling.md +331 -0
- package/templates/agent-docs/database/schema.md +1458 -0
- package/templates/agent-docs/database/seedsdialects.md +1235 -0
- package/templates/agent-docs/database/transactions.md +285 -0
- package/templates/agent-docs/deployment.md +999 -0
- package/templates/agent-docs/internationalization.md +359 -0
- package/templates/agent-docs/introduction.md +438 -0
- package/templates/agent-docs/multi-tenancy.md +610 -0
- package/templates/agent-docs/observability.md +350 -0
- package/templates/agent-docs/plugins.md +1273 -0
- package/templates/agent-docs/reference.md +978 -0
- package/templates/agent-docs/routing.md +1553 -0
- package/templates/agent-docs/scheduling.md +666 -0
- package/templates/agent-docs/schema-driven-ui.md +607 -0
- package/templates/agent-docs/security.md +42 -0
- package/templates/agent-docs/templates/apibackends.md +3214 -0
- package/templates/agent-docs/templates/appshells.md +2062 -0
- package/templates/agent-docs/templates/custom.md +128 -0
- package/templates/agent-docs/templates/overview.md +122 -0
- package/templates/agent-docs/templates/serverless.md +315 -0
- package/templates/agent-docs/testing.md +376 -0
- package/templates/agent-docs/workflows.md +1351 -0
- package/templates/apps/api-ai/README.md +105 -0
- package/templates/apps/api-ai/actions/summarize.action.server.tsx +32 -0
- package/templates/apps/api-ai/actions/summarize.action.ts +33 -0
- package/templates/apps/api-ai/agents/support.agent.server.tsx +31 -0
- package/templates/apps/api-ai/agents/support.agent.tsx +27 -0
- package/templates/apps/api-ai/app.config.ts +57 -0
- package/templates/apps/api-ai/database/schema.ts +67 -0
- package/templates/apps/api-ai/package.json +27 -0
- package/templates/apps/api-ai/seeds/docs.seed.ts +67 -0
- package/templates/apps/api-ai/template.json +6 -0
- package/templates/apps/api-ai/tests/summarize.test.ts +50 -0
- package/templates/apps/api-ai/tools/searchDocs.tool.tsx +60 -0
- package/templates/apps/api-ai/tsconfig.json +5 -0
- package/templates/apps/api-auth/.env +17 -0
- package/templates/apps/api-auth/README.md +109 -0
- package/templates/apps/api-auth/actions/me.action.server.ts +20 -0
- package/templates/apps/api-auth/actions/me.action.ts +19 -0
- package/templates/apps/api-auth/app.config.ts +59 -0
- package/templates/apps/api-auth/database/schema.ts +26 -0
- package/templates/apps/api-auth/package.json +28 -0
- package/templates/apps/api-auth/template.json +6 -0
- package/templates/apps/api-auth/tests/me.test.ts +37 -0
- package/templates/apps/api-auth/tsconfig.json +5 -0
- package/templates/apps/api-backend/README.md +25 -0
- package/templates/apps/api-backend/app.config.ts +39 -0
- package/templates/apps/api-backend/database/schema.ts +57 -0
- package/templates/apps/api-backend/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend/package.json +28 -0
- package/templates/apps/api-backend/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend/template.json +6 -0
- package/templates/apps/api-backend/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend/tsconfig.json +5 -0
- package/templates/apps/api-backend-deactivation/README.md +49 -0
- package/templates/apps/api-backend-deactivation/actions/users.get.action.server.ts +17 -0
- package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +18 -0
- package/templates/apps/api-backend-deactivation/app.config.ts +20 -0
- package/templates/apps/api-backend-deactivation/database/schema.ts +41 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.server.ts +6 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +16 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.server.ts +10 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +19 -0
- package/templates/apps/api-backend-deactivation/package.json +28 -0
- package/templates/apps/api-backend-deactivation/template.json +6 -0
- package/templates/apps/api-backend-deactivation/tests/users.deactivate.test.ts +47 -0
- package/templates/apps/api-backend-deactivation/tsconfig.json +5 -0
- package/templates/apps/api-backend-mail/README.md +39 -0
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.server.ts +15 -0
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +21 -0
- package/templates/apps/api-backend-mail/app.config.ts +34 -0
- package/templates/apps/api-backend-mail/database/schema.ts +57 -0
- package/templates/apps/api-backend-mail/emails/welcome.email.tsx +106 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-mail/package.json +30 -0
- package/templates/apps/api-backend-mail/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-mail/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-mail/template.json +6 -0
- package/templates/apps/api-backend-mail/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-mail/tsconfig.json +5 -0
- package/templates/apps/api-backend-mariadb/.env.example +35 -0
- package/templates/apps/api-backend-mariadb/README.md +31 -0
- package/templates/apps/api-backend-mariadb/app.config.ts +68 -0
- package/templates/apps/api-backend-mariadb/database/schema.ts +57 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-mariadb/package.json +30 -0
- package/templates/apps/api-backend-mariadb/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-mariadb/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-mariadb/template.json +6 -0
- package/templates/apps/api-backend-mariadb/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-mariadb/tsconfig.json +5 -0
- package/templates/apps/api-backend-storage/README.md +86 -0
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.server.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.server.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +20 -0
- package/templates/apps/api-backend-storage/app.config.ts +38 -0
- package/templates/apps/api-backend-storage/database/schema.ts +57 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-storage/package.json +27 -0
- package/templates/apps/api-backend-storage/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-storage/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-storage/template.json +6 -0
- package/templates/apps/api-backend-storage/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-storage/tsconfig.json +5 -0
- package/templates/apps/api-data-advanced/.env +17 -0
- package/templates/apps/api-data-advanced/README.md +88 -0
- package/templates/apps/api-data-advanced/app.config.ts +56 -0
- package/templates/apps/api-data-advanced/database/actors.entity.ts +14 -0
- package/templates/apps/api-data-advanced/database/authors.entity.ts +30 -0
- package/templates/apps/api-data-advanced/database/authors.relations.ts +15 -0
- package/templates/apps/api-data-advanced/database/books.entity.ts +59 -0
- package/templates/apps/api-data-advanced/database/books.relations.ts +10 -0
- package/templates/apps/api-data-advanced/database/index.ts +23 -0
- package/templates/apps/api-data-advanced/database/tenants.entity.ts +11 -0
- package/templates/apps/api-data-advanced/package.json +28 -0
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.server.ts +18 -0
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +40 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.server.ts +17 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.ts +39 -0
- package/templates/apps/api-data-advanced/seeds/catalog.seed.ts +101 -0
- package/templates/apps/api-data-advanced/template.json +6 -0
- package/templates/apps/api-data-advanced/tests/queries.test.ts +124 -0
- package/templates/apps/api-data-advanced/tsconfig.json +5 -0
- package/templates/apps/api-durable/README.md +81 -0
- package/templates/apps/api-durable/aggregates/orderStats.aggregate.ts +49 -0
- package/templates/apps/api-durable/app.config.ts +41 -0
- package/templates/apps/api-durable/database/schema.ts +65 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.server.ts +43 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +23 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.server.ts +45 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.ts +40 -0
- package/templates/apps/api-durable/package.json +28 -0
- package/templates/apps/api-durable/schedules/nightlyReport.cron.tsx +37 -0
- package/templates/apps/api-durable/startup/warm.startup.tsx +33 -0
- package/templates/apps/api-durable/subscribers/orderChanges.subscribe.ts +27 -0
- package/templates/apps/api-durable/template.json +6 -0
- package/templates/apps/api-durable/tests/orders.place.test.ts +91 -0
- package/templates/apps/api-durable/triggers/order.placed.trigger.tsx +21 -0
- package/templates/apps/api-durable/tsconfig.json +5 -0
- package/templates/apps/api-durable/workflows/order.fulfill.workflow.server.tsx +103 -0
- package/templates/apps/api-durable/workflows/order.fulfill.workflow.tsx +25 -0
- package/templates/apps/api-feature-flags/README.md +63 -0
- package/templates/apps/api-feature-flags/actions/notes.export.action.server.ts +11 -0
- package/templates/apps/api-feature-flags/actions/notes.export.action.ts +18 -0
- package/templates/apps/api-feature-flags/app.config.ts +41 -0
- package/templates/apps/api-feature-flags/database/schema.ts +37 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.server.ts +29 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +28 -0
- package/templates/apps/api-feature-flags/package.json +29 -0
- package/templates/apps/api-feature-flags/template.json +6 -0
- package/templates/apps/api-feature-flags/tests/notes.create.test.ts +67 -0
- package/templates/apps/api-feature-flags/tsconfig.json +5 -0
- package/templates/apps/api-governance/.env +4 -0
- package/templates/apps/api-governance/README.md +61 -0
- package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -0
- package/templates/apps/api-governance/actions/profiles.get.action.ts +17 -0
- package/templates/apps/api-governance/app.config.ts +35 -0
- package/templates/apps/api-governance/database/schema.ts +41 -0
- package/templates/apps/api-governance/mutations/profiles.create.mutation.server.ts +17 -0
- package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +21 -0
- package/templates/apps/api-governance/package.json +29 -0
- package/templates/apps/api-governance/template.json +6 -0
- package/templates/apps/api-governance/tests/profiles.create.test.ts +59 -0
- package/templates/apps/api-governance/tsconfig.json +5 -0
- package/templates/apps/api-kv/README.md +100 -0
- package/templates/apps/api-kv/actions/sync.pull.action.server.ts +75 -0
- package/templates/apps/api-kv/actions/sync.pull.action.ts +25 -0
- package/templates/apps/api-kv/actions/sync.reset.action.server.ts +25 -0
- package/templates/apps/api-kv/actions/sync.reset.action.ts +22 -0
- package/templates/apps/api-kv/actions/sync.status.action.server.ts +28 -0
- package/templates/apps/api-kv/actions/sync.status.action.ts +17 -0
- package/templates/apps/api-kv/app.config.ts +48 -0
- package/templates/apps/api-kv/database/schema.ts +62 -0
- package/templates/apps/api-kv/package.json +28 -0
- package/templates/apps/api-kv/queries/events.list.query.server.ts +14 -0
- package/templates/apps/api-kv/queries/events.list.query.ts +23 -0
- package/templates/apps/api-kv/template.json +6 -0
- package/templates/apps/api-kv/tests/sync.test.ts +103 -0
- package/templates/apps/api-kv/tsconfig.json +5 -0
- package/templates/apps/api-moderation/README.md +46 -0
- package/templates/apps/api-moderation/app.config.ts +33 -0
- package/templates/apps/api-moderation/database/schema.ts +45 -0
- package/templates/apps/api-moderation/mutations/comments.create.mutation.server.ts +8 -0
- package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +20 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.server.ts +9 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +25 -0
- package/templates/apps/api-moderation/package.json +29 -0
- package/templates/apps/api-moderation/template.json +6 -0
- package/templates/apps/api-moderation/tests/posts.create.test.ts +79 -0
- package/templates/apps/api-moderation/tsconfig.json +5 -0
- package/templates/apps/api-observability/README.md +106 -0
- package/templates/apps/api-observability/app.config.ts +32 -0
- package/templates/apps/api-observability/database/schema.ts +38 -0
- package/templates/apps/api-observability/mutations/notes.create.mutation.server.ts +33 -0
- package/templates/apps/api-observability/mutations/notes.create.mutation.ts +15 -0
- package/templates/apps/api-observability/package.json +29 -0
- package/templates/apps/api-observability/queries/notes.list.query.server.ts +7 -0
- package/templates/apps/api-observability/queries/notes.list.query.ts +14 -0
- package/templates/apps/api-observability/template.json +6 -0
- package/templates/apps/api-observability/tests/notes.create.test.ts +36 -0
- package/templates/apps/api-observability/tsconfig.json +5 -0
- package/templates/apps/api-ratelimit/README.md +49 -0
- package/templates/apps/api-ratelimit/app.config.ts +42 -0
- package/templates/apps/api-ratelimit/database/schema.ts +37 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.server.ts +16 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +34 -0
- package/templates/apps/api-ratelimit/package.json +29 -0
- package/templates/apps/api-ratelimit/template.json +6 -0
- package/templates/apps/api-ratelimit/tests/notes.create.test.ts +69 -0
- package/templates/apps/api-ratelimit/tsconfig.json +5 -0
- package/templates/apps/api-rbac/README.md +59 -0
- package/templates/apps/api-rbac/app.config.ts +48 -0
- package/templates/apps/api-rbac/database/schema.ts +37 -0
- package/templates/apps/api-rbac/mutations/notes.create.mutation.server.ts +22 -0
- package/templates/apps/api-rbac/mutations/notes.create.mutation.ts +26 -0
- package/templates/apps/api-rbac/package.json +29 -0
- package/templates/apps/api-rbac/template.json +6 -0
- package/templates/apps/api-rbac/tests/notes.create.test.ts +80 -0
- package/templates/apps/api-rbac/tsconfig.json +5 -0
- package/templates/apps/api-rest/README.md +85 -0
- package/templates/apps/api-rest/app.config.ts +70 -0
- package/templates/apps/api-rest/database/schema.ts +52 -0
- package/templates/apps/api-rest/lib/product.ts +30 -0
- package/templates/apps/api-rest/package.json +27 -0
- package/templates/apps/api-rest/routes/v1/products.create.route.tsx +45 -0
- package/templates/apps/api-rest/routes/v1/products.delete.route.tsx +25 -0
- package/templates/apps/api-rest/routes/v1/products.get.route.tsx +29 -0
- package/templates/apps/api-rest/routes/v1/products.list.route.tsx +43 -0
- package/templates/apps/api-rest/template.json +6 -0
- package/templates/apps/api-rest/tests/products.create.test.ts +53 -0
- package/templates/apps/api-rest/tsconfig.json +5 -0
- package/templates/apps/api-saas/README.md +106 -0
- package/templates/apps/api-saas/app.config.ts +51 -0
- package/templates/apps/api-saas/database/schema.ts +50 -0
- package/templates/apps/api-saas/mutations/projects.create.mutation.server.ts +52 -0
- package/templates/apps/api-saas/mutations/projects.create.mutation.ts +18 -0
- package/templates/apps/api-saas/package.json +31 -0
- package/templates/apps/api-saas/queries/projects.list.query.server.ts +7 -0
- package/templates/apps/api-saas/queries/projects.list.query.ts +18 -0
- package/templates/apps/api-saas/template.json +6 -0
- package/templates/apps/api-saas/tests/projects.create.test.ts +47 -0
- package/templates/apps/api-saas/tsconfig.json +5 -0
- package/templates/apps/api-search/README.md +68 -0
- package/templates/apps/api-search/app.config.ts +31 -0
- package/templates/apps/api-search/database/schema.ts +47 -0
- package/templates/apps/api-search/lib/search.ts +27 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.server.ts +19 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.ts +35 -0
- package/templates/apps/api-search/package.json +29 -0
- package/templates/apps/api-search/queries/articles.list.query.server.ts +14 -0
- package/templates/apps/api-search/queries/articles.list.query.ts +19 -0
- package/templates/apps/api-search/seeds/articles.seed.ts +41 -0
- package/templates/apps/api-search/startup/searchBackfill.startup.tsx +24 -0
- package/templates/apps/api-search/template.json +6 -0
- package/templates/apps/api-search/tests/articles.create.test.ts +69 -0
- package/templates/apps/api-search/tsconfig.json +5 -0
- package/templates/apps/api-versioning/README.md +51 -0
- package/templates/apps/api-versioning/actions/documents.asOf.action.server.ts +13 -0
- package/templates/apps/api-versioning/actions/documents.asOf.action.ts +14 -0
- package/templates/apps/api-versioning/actions/documents.history.action.server.ts +15 -0
- package/templates/apps/api-versioning/actions/documents.history.action.ts +17 -0
- package/templates/apps/api-versioning/app.config.ts +24 -0
- package/templates/apps/api-versioning/database/schema.ts +38 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.server.ts +8 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +21 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.server.ts +9 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +21 -0
- package/templates/apps/api-versioning/package.json +29 -0
- package/templates/apps/api-versioning/template.json +6 -0
- package/templates/apps/api-versioning/tests/documents.create.test.ts +37 -0
- package/templates/apps/api-versioning/tsconfig.json +5 -0
- package/templates/apps/api-webhooks/.env +6 -0
- package/templates/apps/api-webhooks/README.md +106 -0
- package/templates/apps/api-webhooks/app.config.ts +16 -0
- package/templates/apps/api-webhooks/database/schema.ts +49 -0
- package/templates/apps/api-webhooks/events/order.completed.webhook.tsx +22 -0
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.server.ts +37 -0
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +15 -0
- package/templates/apps/api-webhooks/package.json +28 -0
- package/templates/apps/api-webhooks/queries/orders.list.query.server.ts +7 -0
- package/templates/apps/api-webhooks/queries/orders.list.query.ts +15 -0
- package/templates/apps/api-webhooks/template.json +6 -0
- package/templates/apps/api-webhooks/tests/orders.fulfill.test.ts +51 -0
- package/templates/apps/api-webhooks/tsconfig.json +5 -0
- package/templates/apps/api-webhooks/webhooks/orders.webhook.tsx +35 -0
- package/templates/apps/changelog/README.md +77 -0
- package/templates/apps/changelog/app.config.ts +27 -0
- package/templates/apps/changelog/content/releases/0.1.0.mdx +19 -0
- package/templates/apps/changelog/content/releases/0.2.0.mdx +28 -0
- package/templates/apps/changelog/package.json +30 -0
- package/templates/apps/changelog/scripts/generate-rss.mjs +38 -0
- package/templates/apps/changelog/src/globals.css +66 -0
- package/templates/apps/changelog/src/globals.d.ts +16 -0
- package/templates/apps/changelog/src/lib/locale.test.ts +72 -0
- package/templates/apps/changelog/src/lib/locale.ts +55 -0
- package/templates/apps/changelog/src/lib/releases.ts +21 -0
- package/templates/apps/changelog/src/locales/de.ts +22 -0
- package/templates/apps/changelog/src/locales/en.ts +30 -0
- package/templates/apps/changelog/src/pages/[locale]/[slug].tsx +24 -0
- package/templates/apps/changelog/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/changelog/src/pages/[locale]/mirrors.test.tsx +95 -0
- package/templates/apps/changelog/src/pages/[slug].test.tsx +127 -0
- package/templates/apps/changelog/src/pages/[slug].tsx +52 -0
- package/templates/apps/changelog/src/pages/index.test.tsx +112 -0
- package/templates/apps/changelog/src/pages/index.tsx +55 -0
- package/templates/apps/changelog/src/pages/layout.tsx +84 -0
- package/templates/apps/changelog/template.json +6 -0
- package/templates/apps/changelog/tsconfig.json +11 -0
- package/templates/apps/edge-functions/README.md +55 -0
- package/templates/apps/edge-functions/functions/aiComplete.serverless.ts +58 -0
- package/templates/apps/edge-functions/functions/currencyConvert.serverless.ts +47 -0
- package/templates/apps/edge-functions/functions/geoGreeting.serverless.ts +44 -0
- package/templates/apps/edge-functions/functions/health.serverless.ts +29 -0
- package/templates/apps/edge-functions/functions/resolveLink.serverless.ts +32 -0
- package/templates/apps/edge-functions/functions/shareLink.serverless.ts +30 -0
- package/templates/apps/edge-functions/functions/slackNotify.serverless.ts +40 -0
- package/templates/apps/edge-functions/functions/verifySignature.serverless.ts +52 -0
- package/templates/apps/edge-functions/package.json +21 -0
- package/templates/apps/edge-functions/template.json +6 -0
- package/templates/apps/edge-functions/tsconfig.json +10 -0
- package/templates/apps/frontend-admin/README.md +40 -0
- package/templates/apps/frontend-admin/app.config.ts +37 -0
- package/templates/apps/frontend-admin/package.json +30 -0
- package/templates/apps/frontend-admin/src/config.ts +8 -0
- package/templates/apps/frontend-admin/src/globals.css +76 -0
- package/templates/apps/frontend-admin/src/globals.d.ts +6 -0
- package/templates/apps/frontend-admin/src/lib/admin.ts +16 -0
- package/templates/apps/frontend-admin/src/lib/auth.ts +24 -0
- package/templates/apps/frontend-admin/src/locales/de.ts +67 -0
- package/templates/apps/frontend-admin/src/locales/en.ts +79 -0
- package/templates/apps/frontend-admin/src/locales/index.ts +15 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/index.test.tsx +55 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/index.tsx +32 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +29 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/login.test.tsx +73 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/login.tsx +35 -0
- package/templates/apps/frontend-admin/src/pages/admin/[entity].tsx +121 -0
- package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +119 -0
- package/templates/apps/frontend-admin/src/pages/admin/error.tsx +20 -0
- package/templates/apps/frontend-admin/src/pages/admin/fallbacks.test.tsx +68 -0
- package/templates/apps/frontend-admin/src/pages/admin/index.test.tsx +88 -0
- package/templates/apps/frontend-admin/src/pages/admin/index.tsx +65 -0
- package/templates/apps/frontend-admin/src/pages/admin/layout.test.tsx +114 -0
- package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +97 -0
- package/templates/apps/frontend-admin/src/pages/admin/loading.tsx +15 -0
- package/templates/apps/frontend-admin/src/pages/admin/not-found.tsx +15 -0
- package/templates/apps/frontend-admin/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-admin/src/pages/layouts.test.tsx +54 -0
- package/templates/apps/frontend-admin/template.json +6 -0
- package/templates/apps/frontend-admin/tsconfig.json +11 -0
- package/templates/apps/frontend-app/README.md +98 -0
- package/templates/apps/frontend-app/app.config.ts +43 -0
- package/templates/apps/frontend-app/package.json +30 -0
- package/templates/apps/frontend-app/src/locales/de.ts +36 -0
- package/templates/apps/frontend-app/src/locales/en.ts +43 -0
- package/templates/apps/frontend-app/src/locales/index.ts +15 -0
- package/templates/apps/frontend-app/src/pages/index.test.tsx +167 -0
- package/templates/apps/frontend-app/src/pages/index.tsx +136 -0
- package/templates/apps/frontend-app/src/pages/layout.tsx +41 -0
- package/templates/apps/frontend-app/src/pages/schema-ui.test.tsx +99 -0
- package/templates/apps/frontend-app/src/pages/schema-ui.tsx +74 -0
- package/templates/apps/frontend-app/template.json +6 -0
- package/templates/apps/frontend-app/tsconfig.json +11 -0
- package/templates/apps/frontend-blank/README.md +18 -0
- package/templates/apps/frontend-blank/app.config.ts +29 -0
- package/templates/apps/frontend-blank/package.json +29 -0
- package/templates/apps/frontend-blank/src/locales/de.ts +15 -0
- package/templates/apps/frontend-blank/src/locales/en.ts +22 -0
- package/templates/apps/frontend-blank/src/locales/index.ts +15 -0
- package/templates/apps/frontend-blank/src/pages/index.test.tsx +55 -0
- package/templates/apps/frontend-blank/src/pages/index.tsx +27 -0
- package/templates/apps/frontend-blank/src/pages/layout.test.tsx +54 -0
- package/templates/apps/frontend-blank/src/pages/layout.tsx +35 -0
- package/templates/apps/frontend-blank/template.json +6 -0
- package/templates/apps/frontend-blank/tsconfig.json +11 -0
- package/templates/apps/frontend-contact/README.md +65 -0
- package/templates/apps/frontend-contact/app.config.ts +25 -0
- package/templates/apps/frontend-contact/functions/sendMessage.serverless.ts +69 -0
- package/templates/apps/frontend-contact/package.json +33 -0
- package/templates/apps/frontend-contact/src/components/ContactForm.island.test.tsx +142 -0
- package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +104 -0
- package/templates/apps/frontend-contact/src/config.ts +12 -0
- package/templates/apps/frontend-contact/src/globals.css +84 -0
- package/templates/apps/frontend-contact/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-contact/src/locales/de.ts +26 -0
- package/templates/apps/frontend-contact/src/locales/en.ts +29 -0
- package/templates/apps/frontend-contact/src/pages/[locale]/index.tsx +14 -0
- package/templates/apps/frontend-contact/src/pages/index.test.tsx +70 -0
- package/templates/apps/frontend-contact/src/pages/index.tsx +63 -0
- package/templates/apps/frontend-contact/src/pages/layout.tsx +65 -0
- package/templates/apps/frontend-contact/template.json +6 -0
- package/templates/apps/frontend-contact/tsconfig.json +11 -0
- package/templates/apps/frontend-dashboard/README.md +54 -0
- package/templates/apps/frontend-dashboard/app.config.ts +39 -0
- package/templates/apps/frontend-dashboard/package.json +29 -0
- package/templates/apps/frontend-dashboard/src/config.ts +8 -0
- package/templates/apps/frontend-dashboard/src/globals.css +72 -0
- package/templates/apps/frontend-dashboard/src/globals.d.ts +6 -0
- package/templates/apps/frontend-dashboard/src/lib/auth.ts +27 -0
- package/templates/apps/frontend-dashboard/src/locales/de.ts +49 -0
- package/templates/apps/frontend-dashboard/src/locales/en.ts +60 -0
- package/templates/apps/frontend-dashboard/src/locales/index.ts +15 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.test.tsx +55 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.tsx +34 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +32 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.test.tsx +74 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.tsx +40 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/error.tsx +21 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/fallbacks.test.tsx +68 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/index.test.tsx +55 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/index.tsx +38 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.test.tsx +88 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +69 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/loading.tsx +21 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/not-found.tsx +19 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.test.tsx +69 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.tsx +35 -0
- package/templates/apps/frontend-dashboard/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-dashboard/src/pages/layouts.test.tsx +54 -0
- package/templates/apps/frontend-dashboard/template.json +6 -0
- package/templates/apps/frontend-dashboard/tsconfig.json +11 -0
- package/templates/apps/frontend-docs/README.md +19 -0
- package/templates/apps/frontend-docs/app.config.ts +25 -0
- package/templates/apps/frontend-docs/package.json +29 -0
- package/templates/apps/frontend-docs/src/globals.css +32 -0
- package/templates/apps/frontend-docs/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-docs/src/lib/locale.ts +56 -0
- package/templates/apps/frontend-docs/src/locales/de.ts +24 -0
- package/templates/apps/frontend-docs/src/locales/en.ts +28 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/docs/[...slug].tsx +18 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/mirrors.test.tsx +67 -0
- package/templates/apps/frontend-docs/src/pages/docs/[...slug].test.tsx +115 -0
- package/templates/apps/frontend-docs/src/pages/docs/[...slug].tsx +82 -0
- package/templates/apps/frontend-docs/src/pages/index.test.tsx +90 -0
- package/templates/apps/frontend-docs/src/pages/index.tsx +45 -0
- package/templates/apps/frontend-docs/src/pages/layout.test.tsx +84 -0
- package/templates/apps/frontend-docs/src/pages/layout.tsx +66 -0
- package/templates/apps/frontend-docs/template.json +6 -0
- package/templates/apps/frontend-docs/tsconfig.json +11 -0
- package/templates/apps/frontend-i18n/README.md +61 -0
- package/templates/apps/frontend-i18n/app.config.ts +33 -0
- package/templates/apps/frontend-i18n/package.json +28 -0
- package/templates/apps/frontend-i18n/src/globals.css +46 -0
- package/templates/apps/frontend-i18n/src/globals.d.ts +6 -0
- package/templates/apps/frontend-i18n/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-i18n/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-i18n/src/locales/de.ts +24 -0
- package/templates/apps/frontend-i18n/src/locales/en.ts +25 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/about.tsx +11 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/mirrors.test.tsx +50 -0
- package/templates/apps/frontend-i18n/src/pages/about.test.tsx +75 -0
- package/templates/apps/frontend-i18n/src/pages/about.tsx +31 -0
- package/templates/apps/frontend-i18n/src/pages/index.test.tsx +102 -0
- package/templates/apps/frontend-i18n/src/pages/index.tsx +43 -0
- package/templates/apps/frontend-i18n/src/pages/layout.test.tsx +86 -0
- package/templates/apps/frontend-i18n/src/pages/layout.tsx +70 -0
- package/templates/apps/frontend-i18n/template.json +6 -0
- package/templates/apps/frontend-i18n/tsconfig.json +11 -0
- package/templates/apps/frontend-landing/README.md +17 -0
- package/templates/apps/frontend-landing/app.config.ts +25 -0
- package/templates/apps/frontend-landing/package.json +29 -0
- package/templates/apps/frontend-landing/src/globals.css +23 -0
- package/templates/apps/frontend-landing/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-landing/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-landing/src/locales/de.ts +24 -0
- package/templates/apps/frontend-landing/src/locales/en.ts +26 -0
- package/templates/apps/frontend-landing/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-landing/src/pages/[locale]/mirrors.test.tsx +37 -0
- package/templates/apps/frontend-landing/src/pages/index.test.tsx +110 -0
- package/templates/apps/frontend-landing/src/pages/index.tsx +75 -0
- package/templates/apps/frontend-landing/src/pages/layout.test.tsx +84 -0
- package/templates/apps/frontend-landing/src/pages/layout.tsx +66 -0
- package/templates/apps/frontend-landing/template.json +6 -0
- package/templates/apps/frontend-landing/tsconfig.json +11 -0
- package/templates/apps/frontend-spa/README.md +45 -0
- package/templates/apps/frontend-spa/app.config.ts +27 -0
- package/templates/apps/frontend-spa/package.json +29 -0
- package/templates/apps/frontend-spa/src/globals.css +84 -0
- package/templates/apps/frontend-spa/src/locales/de.ts +22 -0
- package/templates/apps/frontend-spa/src/locales/en.ts +29 -0
- package/templates/apps/frontend-spa/src/locales/index.ts +15 -0
- package/templates/apps/frontend-spa/src/pages/index.test.tsx +137 -0
- package/templates/apps/frontend-spa/src/pages/index.tsx +123 -0
- package/templates/apps/frontend-spa/src/pages/layout.tsx +27 -0
- package/templates/apps/frontend-spa/template.json +6 -0
- package/templates/apps/frontend-spa/tsconfig.json +11 -0
- package/templates/apps/frontend-ssr/README.md +68 -0
- package/templates/apps/frontend-ssr/app.config.ts +32 -0
- package/templates/apps/frontend-ssr/package.json +29 -0
- package/templates/apps/frontend-ssr/src/globals.css +67 -0
- package/templates/apps/frontend-ssr/src/locales/de.ts +41 -0
- package/templates/apps/frontend-ssr/src/locales/en.ts +54 -0
- package/templates/apps/frontend-ssr/src/locales/index.ts +16 -0
- package/templates/apps/frontend-ssr/src/pages/feed-swr.test.tsx +69 -0
- package/templates/apps/frontend-ssr/src/pages/feed-swr.tsx +54 -0
- package/templates/apps/frontend-ssr/src/pages/feed.test.tsx +73 -0
- package/templates/apps/frontend-ssr/src/pages/feed.tsx +64 -0
- package/templates/apps/frontend-ssr/src/pages/index.test.tsx +89 -0
- package/templates/apps/frontend-ssr/src/pages/index.tsx +72 -0
- package/templates/apps/frontend-ssr/src/pages/layout.tsx +37 -0
- package/templates/apps/frontend-ssr/template.json +6 -0
- package/templates/apps/frontend-ssr/tsconfig.json +11 -0
- package/templates/apps/frontend-ssr-api/README.md +50 -0
- package/templates/apps/frontend-ssr-api/app.config.ts +43 -0
- package/templates/apps/frontend-ssr-api/package.json +30 -0
- package/templates/apps/frontend-ssr-api/src/globals.css +38 -0
- package/templates/apps/frontend-ssr-api/src/globals.d.ts +6 -0
- package/templates/apps/frontend-ssr-api/src/locales/de.ts +20 -0
- package/templates/apps/frontend-ssr-api/src/locales/en.ts +31 -0
- package/templates/apps/frontend-ssr-api/src/locales/index.ts +16 -0
- package/templates/apps/frontend-ssr-api/src/pages/index.test.tsx +105 -0
- package/templates/apps/frontend-ssr-api/src/pages/index.tsx +83 -0
- package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +28 -0
- package/templates/apps/frontend-ssr-api/template.json +6 -0
- package/templates/apps/frontend-ssr-api/tsconfig.json +11 -0
- package/templates/apps/frontend-static-blog/README.md +49 -0
- package/templates/apps/frontend-static-blog/app.config.ts +34 -0
- package/templates/apps/frontend-static-blog/package.json +28 -0
- package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.test.tsx +65 -0
- package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +35 -0
- package/templates/apps/frontend-static-blog/src/content/posts.ts +64 -0
- package/templates/apps/frontend-static-blog/src/globals.css +75 -0
- package/templates/apps/frontend-static-blog/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-static-blog/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-static-blog/src/locales/de.ts +19 -0
- package/templates/apps/frontend-static-blog/src/locales/en.ts +26 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/blog/[slug].tsx +20 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/mirrors.test.tsx +62 -0
- package/templates/apps/frontend-static-blog/src/pages/blog/[slug].test.tsx +116 -0
- package/templates/apps/frontend-static-blog/src/pages/blog/[slug].tsx +69 -0
- package/templates/apps/frontend-static-blog/src/pages/index.test.tsx +100 -0
- package/templates/apps/frontend-static-blog/src/pages/index.tsx +58 -0
- package/templates/apps/frontend-static-blog/src/pages/layout.tsx +63 -0
- package/templates/apps/frontend-static-blog/template.json +6 -0
- package/templates/apps/frontend-static-blog/tsconfig.json +11 -0
- package/templates/baselines/bare/.env.example +37 -0
- package/templates/baselines/bare/README.md +47 -0
- package/templates/baselines/bare/baseline.json +31 -0
- package/templates/baselines/bare/deploy/README.md +43 -0
- package/templates/baselines/bare/deploy/voltro.service.example +36 -0
- package/templates/baselines/compose/.env.example +46 -0
- package/templates/baselines/compose/README.md +69 -0
- package/templates/baselines/compose/baseline.json +51 -0
- package/templates/baselines/compose/docker/.dockerignore +38 -0
- package/templates/baselines/compose/docker/api.Dockerfile +57 -0
- package/templates/baselines/compose/docker/dev.Dockerfile +35 -0
- package/templates/baselines/compose/docker/web.Dockerfile +59 -0
- package/templates/baselines/compose/docker-compose.dev.yml +89 -0
- package/templates/baselines/compose/docker-compose.prod.yml +87 -0
- package/templates/baselines/compose/docker-compose.yml +41 -0
- package/templates/baselines/compose-mariadb/.env.example +57 -0
- package/templates/baselines/compose-mariadb/README.md +78 -0
- package/templates/baselines/compose-mariadb/baseline.json +51 -0
- package/templates/baselines/compose-mariadb/docker/.dockerignore +38 -0
- package/templates/baselines/compose-mariadb/docker/api.Dockerfile +57 -0
- package/templates/baselines/compose-mariadb/docker/dev.Dockerfile +35 -0
- package/templates/baselines/compose-mariadb/docker/mariadb-init.sql +6 -0
- package/templates/baselines/compose-mariadb/docker/web.Dockerfile +59 -0
- package/templates/baselines/compose-mariadb/docker-compose.dev.yml +117 -0
- package/templates/baselines/compose-mariadb/docker-compose.prod.yml +114 -0
- package/templates/baselines/compose-mariadb/docker-compose.yml +79 -0
- package/templates/baselines/helm/.env.example +39 -0
- package/templates/baselines/helm/README.md +98 -0
- package/templates/baselines/helm/baseline.json +53 -0
- package/templates/baselines/helm/charts/voltro-app/.helmignore +10 -0
- package/templates/baselines/helm/charts/voltro-app/Chart.yaml +10 -0
- package/templates/baselines/helm/charts/voltro-app/templates/_helpers.tpl +36 -0
- package/templates/baselines/helm/charts/voltro-app/templates/configmap.yaml +13 -0
- package/templates/baselines/helm/charts/voltro-app/templates/deployment-api.yaml +120 -0
- package/templates/baselines/helm/charts/voltro-app/templates/deployment-web.yaml +45 -0
- package/templates/baselines/helm/charts/voltro-app/templates/ingress.yaml +37 -0
- package/templates/baselines/helm/charts/voltro-app/templates/postgres-service.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/templates/postgres-statefulset.yaml +73 -0
- package/templates/baselines/helm/charts/voltro-app/templates/secret.yaml +33 -0
- package/templates/baselines/helm/charts/voltro-app/templates/service-api.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/templates/service-web.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/values-dev.yaml +21 -0
- package/templates/baselines/helm/charts/voltro-app/values-prod.yaml +58 -0
- package/templates/baselines/helm/charts/voltro-app/values-staging.yaml +25 -0
- package/templates/baselines/helm/charts/voltro-app/values.yaml +109 -0
- package/templates/baselines/helm/deploy/README.md +94 -0
- package/templates/patches/@effect__cluster@0.59.0.patch +262 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# {{projectName}} full-stack DEV docker compose.
|
|
2
|
+
#
|
|
3
|
+
# Boots Postgres + apps with hot-reload. Each app container runs as
|
|
4
|
+
# the HOST user (via `user: ${HOST_UID}:${HOST_GID}`) so files written
|
|
5
|
+
# into the bind-mounted workspace land owned by you, not root. Without
|
|
6
|
+
# this, switching between docker dev and native pnpm dev leaves
|
|
7
|
+
# permission-denied errors on the cached vite deps.
|
|
8
|
+
#
|
|
9
|
+
# The pnpm-prebaked dev image (docker/dev.Dockerfile) is built once
|
|
10
|
+
# on first `up`; subsequent `up` calls reuse the cached layer.
|
|
11
|
+
#
|
|
12
|
+
# Prereqs on the host BEFORE running this:
|
|
13
|
+
# 1. pnpm install in the project root (deps need to exist on host
|
|
14
|
+
# because they're mounted in)
|
|
15
|
+
# 2. .env in place — see .env.example
|
|
16
|
+
#
|
|
17
|
+
# Run:
|
|
18
|
+
# pnpm dev:docker # wraps `HOST_UID=... HOST_GID=... docker compose up`
|
|
19
|
+
#
|
|
20
|
+
# Native-pnpm-dev alternative (faster HMR, no container overhead):
|
|
21
|
+
# pnpm dev:hybrid
|
|
22
|
+
#
|
|
23
|
+
# As you add apps to apps/, copy a service block and bump the port.
|
|
24
|
+
|
|
25
|
+
x-node-defaults: &node-defaults
|
|
26
|
+
build:
|
|
27
|
+
context: ./
|
|
28
|
+
dockerfile: docker/dev.Dockerfile
|
|
29
|
+
image: {{projectName}}-dev:latest
|
|
30
|
+
user: "${HOST_UID:-1000}:${HOST_GID:-1000}"
|
|
31
|
+
volumes:
|
|
32
|
+
- ./:/workspace:cached
|
|
33
|
+
depends_on:
|
|
34
|
+
postgres:
|
|
35
|
+
condition: service_healthy
|
|
36
|
+
|
|
37
|
+
services:
|
|
38
|
+
postgres:
|
|
39
|
+
image: postgres:17-alpine
|
|
40
|
+
container_name: {{projectName}}-postgres
|
|
41
|
+
restart: unless-stopped
|
|
42
|
+
environment:
|
|
43
|
+
POSTGRES_USER: app
|
|
44
|
+
POSTGRES_PASSWORD: app
|
|
45
|
+
POSTGRES_DB: {{projectNameSnake}}
|
|
46
|
+
ports:
|
|
47
|
+
- "5433:5432"
|
|
48
|
+
command:
|
|
49
|
+
- "postgres"
|
|
50
|
+
- "-c"
|
|
51
|
+
- "wal_level=logical"
|
|
52
|
+
- "-c"
|
|
53
|
+
- "max_wal_senders=4"
|
|
54
|
+
- "-c"
|
|
55
|
+
- "max_replication_slots=4"
|
|
56
|
+
volumes:
|
|
57
|
+
- {{projectName}}-pgdata:/var/lib/postgresql/data
|
|
58
|
+
healthcheck:
|
|
59
|
+
test: ["CMD-SHELL", "pg_isready -U app -d {{projectNameSnake}}"]
|
|
60
|
+
interval: 2s
|
|
61
|
+
timeout: 2s
|
|
62
|
+
retries: 10
|
|
63
|
+
|
|
64
|
+
api:
|
|
65
|
+
<<: *node-defaults
|
|
66
|
+
container_name: {{projectName}}-api-dev
|
|
67
|
+
working_dir: /workspace/apps/{{projectName}}/api
|
|
68
|
+
command: pnpm voltro dev .
|
|
69
|
+
environment:
|
|
70
|
+
NODE_ENV: development
|
|
71
|
+
HOME: /tmp
|
|
72
|
+
DB_URL: postgres://app:app@postgres:5432/{{projectNameSnake}}
|
|
73
|
+
VOLTRO_SESSION_SECRET: ${VOLTRO_SESSION_SECRET:-dev-only-secret-please-rotate-in-prod}
|
|
74
|
+
ports:
|
|
75
|
+
- "4000:4000"
|
|
76
|
+
|
|
77
|
+
web:
|
|
78
|
+
<<: *node-defaults
|
|
79
|
+
container_name: {{projectName}}-web-dev
|
|
80
|
+
working_dir: /workspace/apps/{{projectName}}/web
|
|
81
|
+
command: pnpm voltro dev .
|
|
82
|
+
environment:
|
|
83
|
+
NODE_ENV: development
|
|
84
|
+
HOME: /tmp
|
|
85
|
+
ports:
|
|
86
|
+
- "5173:5173"
|
|
87
|
+
|
|
88
|
+
volumes:
|
|
89
|
+
{{projectName}}-pgdata:
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# {{projectName}} full-stack PROD docker compose.
|
|
2
|
+
#
|
|
3
|
+
# Builds locked images per app via docker/{api,web}.Dockerfile and
|
|
4
|
+
# runs them behind Postgres. No source volumes — each app's code is
|
|
5
|
+
# baked in at image-build time. Use this to smoke-test prod config
|
|
6
|
+
# locally before deploying.
|
|
7
|
+
#
|
|
8
|
+
# This is NOT the production deploy target itself — that's helm or
|
|
9
|
+
# your cloud provider's container runtime. This file gives parity
|
|
10
|
+
# checking on localhost.
|
|
11
|
+
#
|
|
12
|
+
# Run:
|
|
13
|
+
# pnpm prod:build # build all images (slow, ~5 min)
|
|
14
|
+
# pnpm prod:up # boot the stack
|
|
15
|
+
# pnpm prod:down # tear down
|
|
16
|
+
#
|
|
17
|
+
# Different DB user from dev so accidental `pnpm db:reset` against
|
|
18
|
+
# the dev compose doesn't wipe a prod-shape dataset you wanted to
|
|
19
|
+
# poke at.
|
|
20
|
+
|
|
21
|
+
services:
|
|
22
|
+
postgres:
|
|
23
|
+
image: postgres:17-alpine
|
|
24
|
+
container_name: {{projectName}}-postgres-prod
|
|
25
|
+
restart: unless-stopped
|
|
26
|
+
environment:
|
|
27
|
+
POSTGRES_USER: {{projectNameSnake}}
|
|
28
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me-in-prod}
|
|
29
|
+
POSTGRES_DB: {{projectNameSnake}}
|
|
30
|
+
ports:
|
|
31
|
+
- "5434:5432"
|
|
32
|
+
command:
|
|
33
|
+
- "postgres"
|
|
34
|
+
- "-c"
|
|
35
|
+
- "wal_level=logical"
|
|
36
|
+
- "-c"
|
|
37
|
+
- "max_wal_senders=4"
|
|
38
|
+
- "-c"
|
|
39
|
+
- "max_replication_slots=4"
|
|
40
|
+
volumes:
|
|
41
|
+
- {{projectName}}-prod-pgdata:/var/lib/postgresql/data
|
|
42
|
+
healthcheck:
|
|
43
|
+
test: ["CMD-SHELL", "pg_isready -U {{projectNameSnake}} -d {{projectNameSnake}}"]
|
|
44
|
+
interval: 5s
|
|
45
|
+
timeout: 3s
|
|
46
|
+
retries: 20
|
|
47
|
+
|
|
48
|
+
api:
|
|
49
|
+
build:
|
|
50
|
+
context: ./
|
|
51
|
+
dockerfile: docker/api.Dockerfile
|
|
52
|
+
target: prod
|
|
53
|
+
args:
|
|
54
|
+
APP_PATH: apps/{{projectName}}/api
|
|
55
|
+
image: {{projectName}}-api:latest
|
|
56
|
+
container_name: {{projectName}}-api
|
|
57
|
+
restart: unless-stopped
|
|
58
|
+
environment:
|
|
59
|
+
NODE_ENV: production
|
|
60
|
+
DB_URL: postgres://{{projectNameSnake}}:${POSTGRES_PASSWORD:-change-me-in-prod}@postgres:5432/{{projectNameSnake}}
|
|
61
|
+
VOLTRO_SESSION_SECRET: ${VOLTRO_SESSION_SECRET:?must be set for prod compose}
|
|
62
|
+
ports:
|
|
63
|
+
- "4000:4000"
|
|
64
|
+
depends_on:
|
|
65
|
+
postgres:
|
|
66
|
+
condition: service_healthy
|
|
67
|
+
|
|
68
|
+
web:
|
|
69
|
+
build:
|
|
70
|
+
context: ./
|
|
71
|
+
dockerfile: docker/web.Dockerfile
|
|
72
|
+
target: prod
|
|
73
|
+
args:
|
|
74
|
+
APP_PATH: apps/{{projectName}}/web
|
|
75
|
+
APP_PORT: "5173"
|
|
76
|
+
image: {{projectName}}-web:latest
|
|
77
|
+
container_name: {{projectName}}-web
|
|
78
|
+
restart: unless-stopped
|
|
79
|
+
environment:
|
|
80
|
+
NODE_ENV: production
|
|
81
|
+
ports:
|
|
82
|
+
- "5173:5173"
|
|
83
|
+
depends_on:
|
|
84
|
+
- api
|
|
85
|
+
|
|
86
|
+
volumes:
|
|
87
|
+
{{projectName}}-prod-pgdata:
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# {{projectName}} infra docker compose — postgres only.
|
|
2
|
+
#
|
|
3
|
+
# Brought up by `pnpm db:up`. Apps run natively via `pnpm dev` against
|
|
4
|
+
# this. For full-docker dev (apps in containers too), use
|
|
5
|
+
# `pnpm dev:docker` which adds docker-compose.dev.yml on top.
|
|
6
|
+
#
|
|
7
|
+
# Port 5433 (NOT default 5432) so it never clashes with a host
|
|
8
|
+
# Postgres install.
|
|
9
|
+
|
|
10
|
+
services:
|
|
11
|
+
postgres:
|
|
12
|
+
image: postgres:17-alpine
|
|
13
|
+
container_name: {{projectName}}-postgres
|
|
14
|
+
restart: unless-stopped
|
|
15
|
+
environment:
|
|
16
|
+
POSTGRES_USER: app
|
|
17
|
+
POSTGRES_PASSWORD: app
|
|
18
|
+
POSTGRES_DB: {{projectNameSnake}}
|
|
19
|
+
ports:
|
|
20
|
+
- "5433:5432"
|
|
21
|
+
command:
|
|
22
|
+
- "postgres"
|
|
23
|
+
# wal_level=logical so CDC subscribers (workflow run mirror,
|
|
24
|
+
# logical-replication consumers) can subscribe via pgoutput.
|
|
25
|
+
# Harmless when nothing's subscribing.
|
|
26
|
+
- "-c"
|
|
27
|
+
- "wal_level=logical"
|
|
28
|
+
- "-c"
|
|
29
|
+
- "max_wal_senders=4"
|
|
30
|
+
- "-c"
|
|
31
|
+
- "max_replication_slots=4"
|
|
32
|
+
volumes:
|
|
33
|
+
- {{projectName}}-pgdata:/var/lib/postgresql/data
|
|
34
|
+
healthcheck:
|
|
35
|
+
test: ["CMD-SHELL", "pg_isready -U app -d {{projectNameSnake}}"]
|
|
36
|
+
interval: 2s
|
|
37
|
+
timeout: 2s
|
|
38
|
+
retries: 10
|
|
39
|
+
|
|
40
|
+
volumes:
|
|
41
|
+
{{projectName}}-pgdata:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Voltro local env — compose-mariadb baseline.
|
|
2
|
+
#
|
|
3
|
+
# The Voltro CLI auto-loads .env from each app dir + every ancestor at
|
|
4
|
+
# boot. Shell exports always override .env values, so CI can set DB_URL
|
|
5
|
+
# via env without touching this file.
|
|
6
|
+
|
|
7
|
+
# MariaDB connection — points at the mariadb service in docker-compose.yml
|
|
8
|
+
# (port 3307 to avoid clashing with a host MySQL on 3306). Inside the
|
|
9
|
+
# docker network (dev:docker) the host is `mariadb`; native (pnpm dev with
|
|
10
|
+
# pnpm db:up) it's `localhost` on 3307.
|
|
11
|
+
DB_DIALECT=mariadb
|
|
12
|
+
DB_URL=mysql://app:app@localhost:3307/{{projectNameSnake}}
|
|
13
|
+
# Cross-replica real-time via the binlog reader (the compose DB runs with
|
|
14
|
+
# binlog_format=ROW + binlog_row_image=FULL + a replication grant). CDC=0
|
|
15
|
+
# falls back to single-process inline emit.
|
|
16
|
+
CDC=1
|
|
17
|
+
|
|
18
|
+
# File storage — MinIO locally (S3-compatible). The createbuckets one-shot
|
|
19
|
+
# provisions the bucket; the public /_voltro/storage/:id route serves blobs.
|
|
20
|
+
STORAGE_PROVIDER=minio
|
|
21
|
+
S3_ENDPOINT=http://localhost:9000
|
|
22
|
+
S3_BUCKET={{projectNameSnake}}
|
|
23
|
+
S3_ACCESS_KEY_ID=minioadmin
|
|
24
|
+
S3_SECRET_ACCESS_KEY=minioadmin
|
|
25
|
+
S3_FORCE_PATH_STYLE=1
|
|
26
|
+
|
|
27
|
+
# HMAC key for signed sessions — REQUIRED by prod:up (no dev fallback).
|
|
28
|
+
VOLTRO_SESSION_SECRET=dev-only-secret-please-rotate-in-prod
|
|
29
|
+
|
|
30
|
+
# Used by docker-compose.prod.yml — the prod DB uses a different root
|
|
31
|
+
# password from dev (avoids `db:reset` blowing away a prod-shape dataset).
|
|
32
|
+
MARIADB_ROOT_PASSWORD=change-me-in-prod
|
|
33
|
+
|
|
34
|
+
# ─── Optional backends — ALL OFF by default; uncomment to activate ───────────
|
|
35
|
+
# The cache and the durable KV each run on a zero-infra default (in-process
|
|
36
|
+
# memory / your SQL store). Point either at a RESP server (Redis / Valkey /
|
|
37
|
+
# KeyDB / Dragonfly / Upstash) ONLY when you want cross-instance sharing.
|
|
38
|
+
# Enablement is per concern — a bare REDIS_URL is NOT a master switch; each
|
|
39
|
+
# concern reads its own <NAME>_REDIS_URL first, then a shared REDIS_URL.
|
|
40
|
+
|
|
41
|
+
# @voltro/cache → Redis: a distributed query/result cache. Easiest path:
|
|
42
|
+
# `voltro add redis` uncomments these AND injects a `redis` service into
|
|
43
|
+
# docker-compose.yml; then `docker compose up -d redis` and reboot.
|
|
44
|
+
# CACHE_BACKEND=redis
|
|
45
|
+
# CACHE_REDIS_URL=redis://localhost:6379
|
|
46
|
+
|
|
47
|
+
# @voltro/kv → Redis: durable `ctx.kv`. Default backend is `database`
|
|
48
|
+
# (durable, shared across replicas, survives restarts) — leave it unless you
|
|
49
|
+
# specifically want KV on Redis. If you do, use a PERSISTENT redis (AOF/RDB),
|
|
50
|
+
# NOT the ephemeral cache service `voltro add redis` provisions: an
|
|
51
|
+
# eviction/restart is data loss for durable KV. See docs → Caching → Key-value
|
|
52
|
+
# backends.
|
|
53
|
+
# KV_BACKEND=redis
|
|
54
|
+
# KV_REDIS_URL=redis://localhost:6379
|
|
55
|
+
|
|
56
|
+
# One server for everything, instead of the per-concern URLs above:
|
|
57
|
+
# REDIS_URL=redis://localhost:6379
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Compose baseline — MariaDB + MinIO
|
|
2
|
+
|
|
3
|
+
Three docker-compose files + two Dockerfiles. **MariaDB** (binlog CDC) +
|
|
4
|
+
**MinIO** (object storage) included. Two flavours: dev with volume-mounted
|
|
5
|
+
HMR, prod with built images. The local mirror of the Helm/MariaDB
|
|
6
|
+
production shape.
|
|
7
|
+
|
|
8
|
+
## Layout
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
.
|
|
12
|
+
├── docker/
|
|
13
|
+
│ ├── api.Dockerfile # multi-stage: deps + builder + prod
|
|
14
|
+
│ ├── web.Dockerfile # multi-stage: deps + builder + prod
|
|
15
|
+
│ ├── mariadb-init.sql # grants the app user REPLICATION (CDC reader)
|
|
16
|
+
│ └── .dockerignore
|
|
17
|
+
├── docker-compose.yml # mariadb + minio — the "infra" file
|
|
18
|
+
├── docker-compose.dev.yml # mariadb + minio + apps in dev mode
|
|
19
|
+
└── docker-compose.prod.yml # mariadb + minio + apps in prod (built images)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The MariaDB service runs with `binlog_format=ROW` + `binlog_row_image=FULL`
|
|
23
|
+
and a replication grant — Voltro's CDC reader tails the binary log to fan
|
|
24
|
+
real-time subscriptions out across replicas (the binlog IS the message
|
|
25
|
+
bus). MinIO provides S3-compatible object storage for the file-storage
|
|
26
|
+
primitive; the `createbuckets` one-shot provisions the app bucket.
|
|
27
|
+
|
|
28
|
+
## Common flows
|
|
29
|
+
|
|
30
|
+
### Daily dev — fastest
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
pnpm db:up # boot mariadb + minio (+ create the bucket)
|
|
34
|
+
pnpm dev # turbo run dev, native node, HMR <50ms
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Daily dev — full-docker (slower HMR but zero host install)
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
pnpm dev:docker # boots mariadb + minio + all apps in containers
|
|
41
|
+
pnpm dev:docker:down # stop everything
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Production smoke-test on localhost
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
pnpm prod:build # build all images (slow first run, ~5 min)
|
|
48
|
+
pnpm prod:up # boot the prod stack
|
|
49
|
+
pnpm prod:down # tear down
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## When to add apps
|
|
53
|
+
|
|
54
|
+
The shipped compose files cover ONE api + ONE web by default. As you
|
|
55
|
+
add apps to `apps/`, mirror the pattern in both `docker-compose.dev.yml`
|
|
56
|
+
and `docker-compose.prod.yml`: copy a service block, change its
|
|
57
|
+
`working_dir` / `APP_PATH` / port.
|
|
58
|
+
|
|
59
|
+
A future `voltro baseline sync` will auto-regenerate the service
|
|
60
|
+
blocks from your `project.json` / `app.config.ts` files. Until then,
|
|
61
|
+
hand-edit.
|
|
62
|
+
|
|
63
|
+
## What's NOT in here
|
|
64
|
+
|
|
65
|
+
- No CI configs (GitHub Actions / GitLab CI). Each provider's syntax
|
|
66
|
+
is different; we don't pick a winner.
|
|
67
|
+
- No reverse proxy (Traefik / nginx / Caddy). If you need one in
|
|
68
|
+
prod, add it as a service in `docker-compose.prod.yml`.
|
|
69
|
+
- No Redis, S3-emulator, or other infra. Add as needed.
|
|
70
|
+
|
|
71
|
+
## Switching baselines
|
|
72
|
+
|
|
73
|
+
`voltro baseline set helm` → swaps to Helm chart + Kustomize overlays.
|
|
74
|
+
`voltro baseline set bare` → removes docker-compose entirely.
|
|
75
|
+
|
|
76
|
+
Either switch backs up the current docker-compose files + Dockerfiles
|
|
77
|
+
to `.voltro-baseline-backup/<timestamp>/`. Application code is never
|
|
78
|
+
touched.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "compose-mariadb",
|
|
3
|
+
"displayName": "Docker Compose (MariaDB + MinIO)",
|
|
4
|
+
"summary": "Full stack via docker-compose: MariaDB with binlog CDC (ROW) + MinIO object storage. The local-dev shape for Voltro apps that deploy to MariaDB / K8s.",
|
|
5
|
+
"tags": ["docker", "compose", "mariadb", "cdc", "minio", "storage"],
|
|
6
|
+
"recommendedFor": "Apps targeting MariaDB (company DB) with real-time CDC + file storage; the local mirror of the Helm baseline.",
|
|
7
|
+
"tradeoffs": {
|
|
8
|
+
"pros": [
|
|
9
|
+
"Boots MariaDB (binlog ROW) + MinIO with one `pnpm db:up` — CDC works single-node",
|
|
10
|
+
"Local mirror of the K8s/MariaDB production shape (no surprises at deploy)",
|
|
11
|
+
"Object storage (avatars, AI blobs) works locally via MinIO",
|
|
12
|
+
"Zero-host-install: docker + git is all you need"
|
|
13
|
+
],
|
|
14
|
+
"cons": [
|
|
15
|
+
"HMR through volumes (dev:docker) is slower than native (200-2000ms, esp. macOS)",
|
|
16
|
+
"MariaDB binlog retention grows on disk; tune binlog-expire-logs-seconds for long-lived volumes",
|
|
17
|
+
"Docker Desktop adds ~3GB memory overhead on macOS/Windows"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
".env.example",
|
|
22
|
+
"docker/api.Dockerfile",
|
|
23
|
+
"docker/web.Dockerfile",
|
|
24
|
+
"docker/dev.Dockerfile",
|
|
25
|
+
"docker/.dockerignore",
|
|
26
|
+
"docker/mariadb-init.sql",
|
|
27
|
+
"docker-compose.yml",
|
|
28
|
+
"docker-compose.dev.yml",
|
|
29
|
+
"docker-compose.prod.yml"
|
|
30
|
+
],
|
|
31
|
+
"packageJsonScripts": {
|
|
32
|
+
"dev": "turbo run dev",
|
|
33
|
+
"dev:hybrid": "docker compose up -d --wait mariadb minio && docker compose up -d createbuckets && turbo run dev",
|
|
34
|
+
"dev:docker": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up",
|
|
35
|
+
"dev:docker:bg": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up -d",
|
|
36
|
+
"dev:docker:down": "docker compose -f docker-compose.dev.yml down",
|
|
37
|
+
"dev:docker:logs": "docker compose -f docker-compose.dev.yml logs -f",
|
|
38
|
+
"build": "turbo run build",
|
|
39
|
+
"test": "turbo run test",
|
|
40
|
+
"typecheck": "turbo run typecheck",
|
|
41
|
+
"db:up": "docker compose up -d --wait mariadb minio && docker compose up -d createbuckets",
|
|
42
|
+
"db:down": "docker compose stop mariadb minio",
|
|
43
|
+
"db:reset": "docker compose down -v && docker compose up -d --wait mariadb minio && docker compose up -d createbuckets",
|
|
44
|
+
"db:logs": "docker compose logs -f mariadb",
|
|
45
|
+
"db:sql": "docker compose exec mariadb mariadb -uapp -papp {{projectNameSnake}}",
|
|
46
|
+
"prod:build": "docker compose -f docker-compose.prod.yml build",
|
|
47
|
+
"prod:up": "docker compose -f docker-compose.prod.yml up -d",
|
|
48
|
+
"prod:down": "docker compose -f docker-compose.prod.yml down",
|
|
49
|
+
"prod:logs": "docker compose -f docker-compose.prod.yml logs -f"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Build context excludes — keep image size sane.
|
|
2
|
+
#
|
|
3
|
+
# Most of these are obvious noise. Customize per project if you
|
|
4
|
+
# have additional generated dirs to exclude.
|
|
5
|
+
|
|
6
|
+
**/node_modules
|
|
7
|
+
**/dist
|
|
8
|
+
**/.turbo
|
|
9
|
+
**/.next
|
|
10
|
+
**/.vite
|
|
11
|
+
**/.cache
|
|
12
|
+
**/coverage
|
|
13
|
+
|
|
14
|
+
**/.env
|
|
15
|
+
**/.env.local
|
|
16
|
+
**/.env.*.local
|
|
17
|
+
**/.voltro
|
|
18
|
+
**/.voltro-baseline-backup
|
|
19
|
+
|
|
20
|
+
**/.git
|
|
21
|
+
**/.gitignore.local
|
|
22
|
+
|
|
23
|
+
**/.vscode
|
|
24
|
+
**/.idea
|
|
25
|
+
**/*.swp
|
|
26
|
+
**/*.swo
|
|
27
|
+
|
|
28
|
+
**/*.log
|
|
29
|
+
**/npm-debug.log*
|
|
30
|
+
**/yarn-debug.log*
|
|
31
|
+
**/yarn-error.log*
|
|
32
|
+
|
|
33
|
+
**/.DS_Store
|
|
34
|
+
**/Thumbs.db
|
|
35
|
+
|
|
36
|
+
**/Dockerfile*
|
|
37
|
+
**/docker-compose*.yml
|
|
38
|
+
**/.dockerignore
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# API service Dockerfile for {{projectName}}'s Node-based api apps.
|
|
2
|
+
#
|
|
3
|
+
# Build context = project root (where pnpm-workspace.yaml lives).
|
|
4
|
+
# The `.dockerignore` next to this file aggressively excludes noise.
|
|
5
|
+
#
|
|
6
|
+
# Build args:
|
|
7
|
+
# APP_PATH — path relative to context where the api lives.
|
|
8
|
+
# e.g. apps/{{projectName}}/api
|
|
9
|
+
#
|
|
10
|
+
# Targets:
|
|
11
|
+
# prod — production image (this file's only target; dev uses
|
|
12
|
+
# node:24-alpine directly via docker-compose.dev.yml so
|
|
13
|
+
# code mounts work without an image-build step).
|
|
14
|
+
#
|
|
15
|
+
# Build:
|
|
16
|
+
# docker build \
|
|
17
|
+
# -f docker/api.Dockerfile \
|
|
18
|
+
# --build-arg APP_PATH=apps/{{projectName}}/api \
|
|
19
|
+
# -t {{projectName}}-api:latest \
|
|
20
|
+
# .
|
|
21
|
+
|
|
22
|
+
ARG NODE_VERSION=24-alpine
|
|
23
|
+
ARG PNPM_VERSION=10.25.0
|
|
24
|
+
ARG APP_PATH=apps/{{projectName}}/api
|
|
25
|
+
|
|
26
|
+
# ---------- deps stage ----------
|
|
27
|
+
FROM node:${NODE_VERSION} AS deps
|
|
28
|
+
ARG PNPM_VERSION
|
|
29
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
30
|
+
WORKDIR /workspace
|
|
31
|
+
|
|
32
|
+
# Copy ONLY what pnpm install needs — lockfile + workspace manifests.
|
|
33
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
|
34
|
+
COPY apps apps
|
|
35
|
+
COPY packages packages
|
|
36
|
+
|
|
37
|
+
RUN pnpm install --frozen-lockfile
|
|
38
|
+
|
|
39
|
+
# ---------- builder stage ----------
|
|
40
|
+
FROM deps AS builder
|
|
41
|
+
ARG APP_PATH
|
|
42
|
+
WORKDIR /workspace/${APP_PATH}
|
|
43
|
+
RUN pnpm voltro codegen . || true
|
|
44
|
+
|
|
45
|
+
# ---------- prod runner ----------
|
|
46
|
+
FROM node:${NODE_VERSION} AS prod
|
|
47
|
+
ARG PNPM_VERSION
|
|
48
|
+
ARG APP_PATH
|
|
49
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
50
|
+
WORKDIR /workspace
|
|
51
|
+
|
|
52
|
+
COPY --from=builder /workspace /workspace
|
|
53
|
+
|
|
54
|
+
WORKDIR /workspace/${APP_PATH}
|
|
55
|
+
EXPOSE 4000
|
|
56
|
+
ENV NODE_ENV=production
|
|
57
|
+
CMD ["pnpm", "voltro", "start", "."]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dev runtime image for {{projectName}}'s node/vite services.
|
|
2
|
+
#
|
|
3
|
+
# Why this exists (vs `image: node:24-alpine` directly in compose):
|
|
4
|
+
#
|
|
5
|
+
# Compose's `user: "${HOST_UID}:${HOST_GID}"` directive runs the
|
|
6
|
+
# container process as the host's UID/GID so files written into the
|
|
7
|
+
# bind-mounted workspace land owned by the host user, not root.
|
|
8
|
+
# That kills the "root-owned .framework/.vite/deps blocks native vite"
|
|
9
|
+
# bug that bites every dev who alternates between full-docker and
|
|
10
|
+
# native pnpm dev.
|
|
11
|
+
#
|
|
12
|
+
# But it also means:
|
|
13
|
+
# - The container has no `/etc/passwd` entry for that numeric UID,
|
|
14
|
+
# so HOME resolves to `/` (read-only for non-root).
|
|
15
|
+
# - `corepack enable` writes to `/usr/local/bin/` (root-owned in the
|
|
16
|
+
# stock node image), which a non-root container can't do.
|
|
17
|
+
#
|
|
18
|
+
# So we PREBAKE pnpm here as root at build time. /usr/local/bin/pnpm
|
|
19
|
+
# becomes world-executable (mode 755) → the non-root runtime user can
|
|
20
|
+
# exec it. HOME=/tmp gives pnpm/npm a writable home for state files.
|
|
21
|
+
#
|
|
22
|
+
# Build:
|
|
23
|
+
# docker build -f docker/dev.Dockerfile -t {{projectName}}-dev .
|
|
24
|
+
# (compose's `build:` does this automatically on first `up`)
|
|
25
|
+
|
|
26
|
+
FROM node:24-alpine
|
|
27
|
+
|
|
28
|
+
RUN corepack enable && corepack prepare pnpm@10.25.0 --activate
|
|
29
|
+
|
|
30
|
+
ENV HOME=/tmp
|
|
31
|
+
ENV PATH=/tmp/.local/bin:$PATH
|
|
32
|
+
|
|
33
|
+
# Don't pin a USER directive here — that would FREEZE the image to a
|
|
34
|
+
# specific UID. Compose's `user: "${HOST_UID}:${HOST_GID}"` is the
|
|
35
|
+
# right place to do that, dynamic per-host.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- Runs once on first DB init (mounted into /docker-entrypoint-initdb.d/).
|
|
2
|
+
-- The MARIADB_USER ('app') is created by the image with full grants on the
|
|
3
|
+
-- app database; Voltro's binlog CDC reader ALSO needs replication grants to
|
|
4
|
+
-- tail the binary log.
|
|
5
|
+
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'app'@'%';
|
|
6
|
+
FLUSH PRIVILEGES;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Web (Vite) Dockerfile for {{projectName}}'s React apps.
|
|
2
|
+
#
|
|
3
|
+
# Build context = project root (where pnpm-workspace.yaml lives).
|
|
4
|
+
# The `.dockerignore` next to this file aggressively excludes noise.
|
|
5
|
+
#
|
|
6
|
+
# Build args:
|
|
7
|
+
# APP_PATH — path relative to context where the web app lives.
|
|
8
|
+
# e.g. apps/{{projectName}}/web
|
|
9
|
+
# APP_PORT — the port the app's `voltro start` listens on.
|
|
10
|
+
# Must match the app's app.config.ts `port` field.
|
|
11
|
+
#
|
|
12
|
+
# Targets:
|
|
13
|
+
# prod — production image (`voltro build .` then `voltro start .`)
|
|
14
|
+
#
|
|
15
|
+
# Build:
|
|
16
|
+
# docker build \
|
|
17
|
+
# -f docker/web.Dockerfile \
|
|
18
|
+
# --build-arg APP_PATH=apps/{{projectName}}/web \
|
|
19
|
+
# --build-arg APP_PORT=5173 \
|
|
20
|
+
# -t {{projectName}}-web:latest \
|
|
21
|
+
# .
|
|
22
|
+
|
|
23
|
+
ARG NODE_VERSION=24-alpine
|
|
24
|
+
ARG PNPM_VERSION=10.25.0
|
|
25
|
+
ARG APP_PATH=apps/{{projectName}}/web
|
|
26
|
+
ARG APP_PORT=5173
|
|
27
|
+
|
|
28
|
+
# ---------- deps stage ----------
|
|
29
|
+
FROM node:${NODE_VERSION} AS deps
|
|
30
|
+
ARG PNPM_VERSION
|
|
31
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
32
|
+
WORKDIR /workspace
|
|
33
|
+
|
|
34
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
|
35
|
+
COPY apps apps
|
|
36
|
+
COPY packages packages
|
|
37
|
+
|
|
38
|
+
RUN pnpm install --frozen-lockfile
|
|
39
|
+
|
|
40
|
+
# ---------- builder stage ----------
|
|
41
|
+
FROM deps AS builder
|
|
42
|
+
ARG APP_PATH
|
|
43
|
+
WORKDIR /workspace/${APP_PATH}
|
|
44
|
+
RUN pnpm voltro build .
|
|
45
|
+
|
|
46
|
+
# ---------- prod runner ----------
|
|
47
|
+
FROM node:${NODE_VERSION} AS prod
|
|
48
|
+
ARG PNPM_VERSION
|
|
49
|
+
ARG APP_PATH
|
|
50
|
+
ARG APP_PORT
|
|
51
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
52
|
+
WORKDIR /workspace
|
|
53
|
+
|
|
54
|
+
COPY --from=builder /workspace /workspace
|
|
55
|
+
|
|
56
|
+
WORKDIR /workspace/${APP_PATH}
|
|
57
|
+
EXPOSE ${APP_PORT}
|
|
58
|
+
ENV NODE_ENV=production
|
|
59
|
+
CMD ["pnpm", "voltro", "start", "."]
|