insforge 1.2.10 → 1.3.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-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
package/docker-compose.yml
CHANGED
|
@@ -1,228 +1,232 @@
|
|
|
1
|
-
version: '3.8'
|
|
2
|
-
|
|
3
|
-
services:
|
|
4
|
-
postgres:
|
|
5
|
-
image: postgres:15.13
|
|
6
|
-
container_name: insforge-postgres
|
|
7
|
-
command: postgres -c config_file=/etc/postgresql/postgresql.conf
|
|
8
|
-
environment:
|
|
9
|
-
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
10
|
-
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
11
|
-
- POSTGRES_DB=${POSTGRES_DB:-insforge}
|
|
12
|
-
volumes:
|
|
13
|
-
- postgres-data:/var/lib/postgresql/data
|
|
14
|
-
- ./docker-init/db/db-init.sql:/docker-entrypoint-initdb.d/01-init.sql
|
|
15
|
-
- ./docker-init/db/jwt.sql:/docker-entrypoint-initdb.d/02-jwt.sql
|
|
16
|
-
- ./docker-init/db/postgresql.conf:/etc/postgresql/postgresql.conf
|
|
17
|
-
ports:
|
|
18
|
-
- "5432:5432"
|
|
19
|
-
networks:
|
|
20
|
-
- insforge-network
|
|
21
|
-
healthcheck:
|
|
22
|
-
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
23
|
-
interval: 5s
|
|
24
|
-
timeout: 5s
|
|
25
|
-
retries: 5
|
|
26
|
-
|
|
27
|
-
postgrest:
|
|
28
|
-
image: postgrest/postgrest:v12.2.12
|
|
29
|
-
container_name: insforge-postgrest
|
|
30
|
-
restart: unless-stopped
|
|
31
|
-
environment:
|
|
32
|
-
# POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
33
|
-
# POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
34
|
-
# POSTGRES_DB: ${POSTGRES_DB:-insforge}
|
|
35
|
-
PGRST_DB_URI: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
|
|
36
|
-
PGRST_OPENAPI_SERVER_PROXY_URI: http://localhost:3000
|
|
37
|
-
PGRST_DB_SCHEMA: public
|
|
38
|
-
PGRST_DB_ANON_ROLE: anon
|
|
39
|
-
PGRST_JWT_SECRET: ${JWT_SECRET:-dev-secret-please-change-in-production}
|
|
40
|
-
# Enable schema reloading via NOTIFY
|
|
41
|
-
PGRST_DB_CHANNEL_ENABLED: true
|
|
42
|
-
PGRST_DB_CHANNEL: pgrst
|
|
43
|
-
ports:
|
|
44
|
-
- "5430:3000"
|
|
45
|
-
depends_on:
|
|
46
|
-
postgres:
|
|
47
|
-
condition: service_healthy
|
|
48
|
-
networks:
|
|
49
|
-
- insforge-network
|
|
50
|
-
|
|
51
|
-
insforge:
|
|
52
|
-
image: node:20-alpine
|
|
53
|
-
container_name: insforge
|
|
54
|
-
working_dir: /app
|
|
55
|
-
depends_on:
|
|
56
|
-
postgres:
|
|
57
|
-
condition: service_healthy
|
|
58
|
-
ports:
|
|
59
|
-
- "7130:7130"
|
|
60
|
-
- "7131:7131"
|
|
61
|
-
- "7132:7132"
|
|
62
|
-
environment:
|
|
63
|
-
- PORT=7130
|
|
64
|
-
- PROJECT_ROOT=/app
|
|
65
|
-
- API_BASE_URL=${API_BASE_URL:-}
|
|
66
|
-
- VITE_API_BASE_URL=${VITE_API_BASE_URL:-}
|
|
67
|
-
- JWT_SECRET=${JWT_SECRET:-dev-secret-please-change-in-production}
|
|
68
|
-
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
|
|
69
|
-
- ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
|
|
70
|
-
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-change-this-password}
|
|
71
|
-
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
|
|
72
|
-
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
|
|
73
|
-
# PostgreSQL connection
|
|
74
|
-
- POSTGRES_HOST=postgres
|
|
75
|
-
- POSTGRES_PORT=5432
|
|
76
|
-
- POSTGRES_DB=${POSTGRES_DB:-insforge}
|
|
77
|
-
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
78
|
-
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
79
|
-
- DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
|
|
80
|
-
- POSTGREST_BASE_URL=http://postgrest:3000
|
|
81
|
-
# Deno Runtime URL for serverless functions
|
|
82
|
-
- DENO_RUNTIME_URL=http://deno:7133
|
|
83
|
-
# Storage Configuration
|
|
84
|
-
- AWS_S3_BUCKET=${AWS_S3_BUCKET:-}
|
|
85
|
-
- AWS_REGION=${AWS_REGION:-}
|
|
86
|
-
- AWS_CLOUDFRONT_URL=${AWS_CLOUDFRONT_URL:-}
|
|
87
|
-
- AWS_CLOUDFRONT_KEY_PAIR_ID=${AWS_CLOUDFRONT_KEY_PAIR_ID:-}
|
|
88
|
-
- AWS_CLOUDFRONT_PRIVATE_KEY=${AWS_CLOUDFRONT_PRIVATE_KEY:-}
|
|
89
|
-
# Multi-tenant Cloud Configuration
|
|
90
|
-
- DEPLOYMENT_ID=${DEPLOYMENT_ID:-}
|
|
91
|
-
- PROJECT_ID=${PROJECT_ID:-}
|
|
92
|
-
- APP_KEY=${APP_KEY:-}
|
|
93
|
-
- ACCESS_API_KEY=${ACCESS_API_KEY:-}
|
|
94
|
-
- CLOUD_API_HOST=${CLOUD_API_HOST:-}
|
|
95
|
-
# LLM Model API keys
|
|
96
|
-
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}
|
|
97
|
-
# OAuth Configuration
|
|
98
|
-
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
|
|
99
|
-
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
|
|
100
|
-
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID:-}
|
|
101
|
-
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET:-}
|
|
102
|
-
- DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID:-}
|
|
103
|
-
- DISCORD_CLIENT_SECRET=${DISCORD_CLIENT_SECRET:-}
|
|
104
|
-
- MICROSOFT_CLIENT_ID=${MICROSOFT_CLIENT_ID:-}
|
|
105
|
-
- MICROSOFT_CLIENT_SECRET=${MICROSOFT_CLIENT_SECRET:-}
|
|
106
|
-
- LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID:-}
|
|
107
|
-
- LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET:-}
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
#
|
|
113
|
-
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
- ./
|
|
120
|
-
- ./
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
- insforge-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
-
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
|
|
155
|
-
-
|
|
156
|
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
condition:
|
|
185
|
-
|
|
186
|
-
condition: service_started
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
driver: local
|
|
213
|
-
|
|
214
|
-
driver: local
|
|
215
|
-
|
|
216
|
-
driver: local
|
|
217
|
-
|
|
218
|
-
driver: local
|
|
219
|
-
|
|
220
|
-
driver: local
|
|
221
|
-
|
|
222
|
-
driver: local
|
|
223
|
-
|
|
224
|
-
driver: local
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
driver:
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
postgres:
|
|
5
|
+
image: postgres:15.13
|
|
6
|
+
container_name: insforge-postgres
|
|
7
|
+
command: postgres -c config_file=/etc/postgresql/postgresql.conf
|
|
8
|
+
environment:
|
|
9
|
+
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
10
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
11
|
+
- POSTGRES_DB=${POSTGRES_DB:-insforge}
|
|
12
|
+
volumes:
|
|
13
|
+
- postgres-data:/var/lib/postgresql/data
|
|
14
|
+
- ./docker-init/db/db-init.sql:/docker-entrypoint-initdb.d/01-init.sql
|
|
15
|
+
- ./docker-init/db/jwt.sql:/docker-entrypoint-initdb.d/02-jwt.sql
|
|
16
|
+
- ./docker-init/db/postgresql.conf:/etc/postgresql/postgresql.conf
|
|
17
|
+
ports:
|
|
18
|
+
- "5432:5432"
|
|
19
|
+
networks:
|
|
20
|
+
- insforge-network
|
|
21
|
+
healthcheck:
|
|
22
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
23
|
+
interval: 5s
|
|
24
|
+
timeout: 5s
|
|
25
|
+
retries: 5
|
|
26
|
+
|
|
27
|
+
postgrest:
|
|
28
|
+
image: postgrest/postgrest:v12.2.12
|
|
29
|
+
container_name: insforge-postgrest
|
|
30
|
+
restart: unless-stopped
|
|
31
|
+
environment:
|
|
32
|
+
# POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
33
|
+
# POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
34
|
+
# POSTGRES_DB: ${POSTGRES_DB:-insforge}
|
|
35
|
+
PGRST_DB_URI: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
|
|
36
|
+
PGRST_OPENAPI_SERVER_PROXY_URI: http://localhost:3000
|
|
37
|
+
PGRST_DB_SCHEMA: public
|
|
38
|
+
PGRST_DB_ANON_ROLE: anon
|
|
39
|
+
PGRST_JWT_SECRET: ${JWT_SECRET:-dev-secret-please-change-in-production}
|
|
40
|
+
# Enable schema reloading via NOTIFY
|
|
41
|
+
PGRST_DB_CHANNEL_ENABLED: true
|
|
42
|
+
PGRST_DB_CHANNEL: pgrst
|
|
43
|
+
ports:
|
|
44
|
+
- "5430:3000"
|
|
45
|
+
depends_on:
|
|
46
|
+
postgres:
|
|
47
|
+
condition: service_healthy
|
|
48
|
+
networks:
|
|
49
|
+
- insforge-network
|
|
50
|
+
|
|
51
|
+
insforge:
|
|
52
|
+
image: node:20-alpine
|
|
53
|
+
container_name: insforge
|
|
54
|
+
working_dir: /app
|
|
55
|
+
depends_on:
|
|
56
|
+
postgres:
|
|
57
|
+
condition: service_healthy
|
|
58
|
+
ports:
|
|
59
|
+
- "7130:7130"
|
|
60
|
+
- "7131:7131"
|
|
61
|
+
- "7132:7132"
|
|
62
|
+
environment:
|
|
63
|
+
- PORT=7130
|
|
64
|
+
- PROJECT_ROOT=/app
|
|
65
|
+
- API_BASE_URL=${API_BASE_URL:-}
|
|
66
|
+
- VITE_API_BASE_URL=${VITE_API_BASE_URL:-}
|
|
67
|
+
- JWT_SECRET=${JWT_SECRET:-dev-secret-please-change-in-production}
|
|
68
|
+
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
|
|
69
|
+
- ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
|
|
70
|
+
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-change-this-password}
|
|
71
|
+
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
|
|
72
|
+
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
|
|
73
|
+
# PostgreSQL connection
|
|
74
|
+
- POSTGRES_HOST=postgres
|
|
75
|
+
- POSTGRES_PORT=5432
|
|
76
|
+
- POSTGRES_DB=${POSTGRES_DB:-insforge}
|
|
77
|
+
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
78
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
79
|
+
- DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
|
|
80
|
+
- POSTGREST_BASE_URL=http://postgrest:3000
|
|
81
|
+
# Deno Runtime URL for serverless functions
|
|
82
|
+
- DENO_RUNTIME_URL=http://deno:7133
|
|
83
|
+
# Storage Configuration
|
|
84
|
+
- AWS_S3_BUCKET=${AWS_S3_BUCKET:-}
|
|
85
|
+
- AWS_REGION=${AWS_REGION:-}
|
|
86
|
+
- AWS_CLOUDFRONT_URL=${AWS_CLOUDFRONT_URL:-}
|
|
87
|
+
- AWS_CLOUDFRONT_KEY_PAIR_ID=${AWS_CLOUDFRONT_KEY_PAIR_ID:-}
|
|
88
|
+
- AWS_CLOUDFRONT_PRIVATE_KEY=${AWS_CLOUDFRONT_PRIVATE_KEY:-}
|
|
89
|
+
# Multi-tenant Cloud Configuration
|
|
90
|
+
- DEPLOYMENT_ID=${DEPLOYMENT_ID:-}
|
|
91
|
+
- PROJECT_ID=${PROJECT_ID:-}
|
|
92
|
+
- APP_KEY=${APP_KEY:-}
|
|
93
|
+
- ACCESS_API_KEY=${ACCESS_API_KEY:-}
|
|
94
|
+
- CLOUD_API_HOST=${CLOUD_API_HOST:-}
|
|
95
|
+
# LLM Model API keys
|
|
96
|
+
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}
|
|
97
|
+
# OAuth Configuration
|
|
98
|
+
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
|
|
99
|
+
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
|
|
100
|
+
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID:-}
|
|
101
|
+
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET:-}
|
|
102
|
+
- DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID:-}
|
|
103
|
+
- DISCORD_CLIENT_SECRET=${DISCORD_CLIENT_SECRET:-}
|
|
104
|
+
- MICROSOFT_CLIENT_ID=${MICROSOFT_CLIENT_ID:-}
|
|
105
|
+
- MICROSOFT_CLIENT_SECRET=${MICROSOFT_CLIENT_SECRET:-}
|
|
106
|
+
- LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID:-}
|
|
107
|
+
- LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET:-}
|
|
108
|
+
- X_CLIENT_ID=${X_CLIENT_ID:-}
|
|
109
|
+
- X_CLIENT_SECRET=${X_CLIENT_SECRET:-}
|
|
110
|
+
- APPLE_CLIENT_ID=${APPLE_CLIENT_ID:-}
|
|
111
|
+
- APPLE_CLIENT_SECRET=${APPLE_CLIENT_SECRET:-}
|
|
112
|
+
# Logs directory
|
|
113
|
+
- LOGS_DIR=/insforge-logs
|
|
114
|
+
# Storage directory (for local file storage when S3 is not configured)
|
|
115
|
+
- STORAGE_DIR=/insforge-storage
|
|
116
|
+
# Auth app URL for development proxy
|
|
117
|
+
- AUTH_APP_URL=${AUTH_APP_URL:-http://localhost:7132}
|
|
118
|
+
volumes:
|
|
119
|
+
- ./package.json:/app/package.json
|
|
120
|
+
- ./backend:/app/backend
|
|
121
|
+
- ./frontend:/app/frontend
|
|
122
|
+
- ./auth:/app/auth
|
|
123
|
+
- ./shared-schemas:/app/shared-schemas
|
|
124
|
+
- ./docs:/app/docs
|
|
125
|
+
- node_modules:/app/node_modules
|
|
126
|
+
- backend_node_modules:/app/backend/node_modules
|
|
127
|
+
- frontend_node_modules:/app/frontend/node_modules
|
|
128
|
+
- auth_node_modules:/app/auth/node_modules
|
|
129
|
+
- shared_schemas_node_modules:/app/shared-schemas/node_modules
|
|
130
|
+
- shared-logs:/insforge-logs
|
|
131
|
+
- storage-data:/insforge-storage
|
|
132
|
+
command: sh -c "npm install && cd backend && npm run migrate:up && cd .. && npm run dev"
|
|
133
|
+
restart: unless-stopped
|
|
134
|
+
networks:
|
|
135
|
+
- insforge-network
|
|
136
|
+
|
|
137
|
+
# Deno serverless runtime for edge functions
|
|
138
|
+
deno:
|
|
139
|
+
image: denoland/deno:alpine-2.0.6
|
|
140
|
+
container_name: insforge-deno
|
|
141
|
+
working_dir: /app
|
|
142
|
+
depends_on:
|
|
143
|
+
- postgres
|
|
144
|
+
- postgrest
|
|
145
|
+
ports:
|
|
146
|
+
- "7133:7133"
|
|
147
|
+
environment:
|
|
148
|
+
- PORT=7133
|
|
149
|
+
- DENO_ENV=${DENO_ENV:-development}
|
|
150
|
+
- DENO_DIR=/deno-dir
|
|
151
|
+
# PostgreSQL connection
|
|
152
|
+
- POSTGRES_HOST=postgres
|
|
153
|
+
- POSTGRES_PORT=5432
|
|
154
|
+
- POSTGRES_DB=${POSTGRES_DB:-insforge}
|
|
155
|
+
- POSTGRES_USER=${POSTGRES_USER:-postgres}
|
|
156
|
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
|
|
157
|
+
- POSTGREST_BASE_URL=http://postgrest:3000
|
|
158
|
+
# Worker timeout (60 seconds default)
|
|
159
|
+
- WORKER_TIMEOUT_MS=${WORKER_TIMEOUT_MS:-60000}
|
|
160
|
+
# Encryption keys for decrypting function secrets
|
|
161
|
+
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
|
162
|
+
- JWT_SECRET=${JWT_SECRET:-dev-secret-please-change-in-production}
|
|
163
|
+
volumes:
|
|
164
|
+
- ./functions:/app/functions
|
|
165
|
+
- deno_cache:/deno-dir
|
|
166
|
+
command: >
|
|
167
|
+
sh -c "
|
|
168
|
+
echo 'Downloading Deno dependencies...' &&
|
|
169
|
+
deno cache functions/server.ts &&
|
|
170
|
+
echo 'Starting Deno server on port 7133...' &&
|
|
171
|
+
deno run --allow-net --allow-env --allow-read=./functions/worker-template.js --watch functions/server.ts
|
|
172
|
+
"
|
|
173
|
+
restart: unless-stopped
|
|
174
|
+
networks:
|
|
175
|
+
- insforge-network
|
|
176
|
+
|
|
177
|
+
# Vector.dev for log collection and shipping
|
|
178
|
+
vector:
|
|
179
|
+
container_name: insforge-vector
|
|
180
|
+
image: timberio/vector:0.28.1-alpine
|
|
181
|
+
restart: unless-stopped
|
|
182
|
+
depends_on:
|
|
183
|
+
postgres:
|
|
184
|
+
condition: service_healthy
|
|
185
|
+
postgrest:
|
|
186
|
+
condition: service_started
|
|
187
|
+
insforge:
|
|
188
|
+
condition: service_started
|
|
189
|
+
deno:
|
|
190
|
+
condition: service_started
|
|
191
|
+
volumes:
|
|
192
|
+
- ./docker-init/logs/vector.yml:/etc/vector/vector.yml:ro
|
|
193
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
194
|
+
- shared-logs:/insforge-logs
|
|
195
|
+
healthcheck:
|
|
196
|
+
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7135/health"]
|
|
197
|
+
timeout: 5s
|
|
198
|
+
interval: 5s
|
|
199
|
+
retries: 3
|
|
200
|
+
environment:
|
|
201
|
+
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
|
|
202
|
+
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
|
|
203
|
+
- AWS_REGION=${AWS_REGION:-skip}
|
|
204
|
+
- PROJECT_ID=${PROJECT_ID:-}
|
|
205
|
+
- HOSTNAME_OVERRIDE=${HOSTNAME_OVERRIDE:-}
|
|
206
|
+
command: ["--config", "/etc/vector/vector.yml"]
|
|
207
|
+
networks:
|
|
208
|
+
- insforge-network
|
|
209
|
+
|
|
210
|
+
volumes:
|
|
211
|
+
postgres-data:
|
|
212
|
+
driver: local
|
|
213
|
+
node_modules:
|
|
214
|
+
driver: local
|
|
215
|
+
backend_node_modules:
|
|
216
|
+
driver: local
|
|
217
|
+
frontend_node_modules:
|
|
218
|
+
driver: local
|
|
219
|
+
auth_node_modules:
|
|
220
|
+
driver: local
|
|
221
|
+
shared_schemas_node_modules:
|
|
222
|
+
driver: local
|
|
223
|
+
deno_cache:
|
|
224
|
+
driver: local
|
|
225
|
+
shared-logs:
|
|
226
|
+
driver: local
|
|
227
|
+
storage-data:
|
|
228
|
+
driver: local
|
|
229
|
+
|
|
230
|
+
networks:
|
|
231
|
+
insforge-network:
|
|
232
|
+
driver: bridge
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
-- init.sql
|
|
2
|
-
-- Create role for anonymous user
|
|
3
|
-
CREATE ROLE anon NOLOGIN;
|
|
4
|
-
|
|
5
|
-
-- Create role for authenticator
|
|
6
|
-
CREATE ROLE authenticated NOLOGIN;
|
|
7
|
-
|
|
8
|
-
-- Create project admin role for admin users
|
|
9
|
-
CREATE ROLE project_admin NOLOGIN;
|
|
10
|
-
|
|
11
|
-
GRANT USAGE ON SCHEMA public TO anon;
|
|
12
|
-
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
|
|
13
|
-
GRANT USAGE ON SCHEMA public TO authenticated;
|
|
14
|
-
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO authenticated;
|
|
15
|
-
GRANT USAGE ON SCHEMA public TO project_admin;
|
|
16
|
-
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO project_admin;
|
|
17
|
-
|
|
18
|
-
-- Grant permissions to roles
|
|
19
|
-
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO anon, authenticated, project_admin;
|
|
20
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO anon, authenticated, project_admin;
|
|
21
|
-
-- Create function to automatically create RLS policies for new tables
|
|
22
|
-
CREATE OR REPLACE FUNCTION public.create_default_policies()
|
|
23
|
-
RETURNS event_trigger AS $$
|
|
24
|
-
DECLARE
|
|
25
|
-
obj record;
|
|
26
|
-
table_schema text;
|
|
27
|
-
table_name text;
|
|
28
|
-
has_rls boolean;
|
|
29
|
-
BEGIN
|
|
30
|
-
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'CREATE TABLE'
|
|
31
|
-
LOOP
|
|
32
|
-
-- Extract schema and table name from object_identity
|
|
33
|
-
-- Handle quoted identifiers by removing quotes
|
|
34
|
-
SELECT INTO table_schema, table_name
|
|
35
|
-
split_part(obj.object_identity, '.', 1),
|
|
36
|
-
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
37
|
-
-- Check if RLS is enabled on the table
|
|
38
|
-
SELECT INTO has_rls
|
|
39
|
-
rowsecurity
|
|
40
|
-
FROM pg_tables
|
|
41
|
-
WHERE schemaname = table_schema
|
|
42
|
-
AND tablename = table_name;
|
|
43
|
-
-- Only create policies if RLS is enabled
|
|
44
|
-
IF has_rls THEN
|
|
45
|
-
-- Create policy for project_admin role only
|
|
46
|
-
-- Users must define their own policies for anon and authenticated roles
|
|
47
|
-
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
48
|
-
END IF;
|
|
49
|
-
END LOOP;
|
|
50
|
-
END;
|
|
51
|
-
$$ LANGUAGE plpgsql;
|
|
52
|
-
|
|
53
|
-
-- Create event trigger to run the function when new tables are created
|
|
54
|
-
CREATE EVENT TRIGGER create_policies_on_table_create
|
|
55
|
-
ON ddl_command_end
|
|
56
|
-
WHEN TAG IN ('CREATE TABLE')
|
|
57
|
-
EXECUTE FUNCTION public.create_default_policies();
|
|
58
|
-
|
|
59
|
-
-- Create function to handle RLS enablement
|
|
60
|
-
CREATE OR REPLACE FUNCTION public.create_policies_after_rls()
|
|
61
|
-
RETURNS event_trigger AS $$
|
|
62
|
-
DECLARE
|
|
63
|
-
obj record;
|
|
64
|
-
table_schema text;
|
|
65
|
-
table_name text;
|
|
66
|
-
BEGIN
|
|
67
|
-
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'ALTER TABLE'
|
|
68
|
-
LOOP
|
|
69
|
-
-- Extract schema and table name
|
|
70
|
-
-- Handle quoted identifiers by removing quotes
|
|
71
|
-
SELECT INTO table_schema, table_name
|
|
72
|
-
split_part(obj.object_identity, '.', 1),
|
|
73
|
-
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
74
|
-
-- Check if table has RLS enabled and no policies yet
|
|
75
|
-
IF EXISTS (
|
|
76
|
-
SELECT 1 FROM pg_tables
|
|
77
|
-
WHERE schemaname = table_schema
|
|
78
|
-
AND tablename = table_name
|
|
79
|
-
AND rowsecurity = true
|
|
80
|
-
) AND NOT EXISTS (
|
|
81
|
-
SELECT 1 FROM pg_policies
|
|
82
|
-
WHERE schemaname = table_schema
|
|
83
|
-
AND tablename = table_name
|
|
84
|
-
) THEN
|
|
85
|
-
-- Create policy for project_admin role only
|
|
86
|
-
-- Users must define their own policies for anon and authenticated roles
|
|
87
|
-
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
88
|
-
END IF;
|
|
89
|
-
END LOOP;
|
|
90
|
-
END;
|
|
91
|
-
$$ LANGUAGE plpgsql;
|
|
92
|
-
|
|
93
|
-
-- Create event trigger for ALTER TABLE commands
|
|
94
|
-
CREATE EVENT TRIGGER create_policies_on_rls_enable
|
|
95
|
-
ON ddl_command_end
|
|
96
|
-
WHEN TAG IN ('ALTER TABLE')
|
|
97
|
-
EXECUTE FUNCTION public.create_policies_after_rls();
|
|
1
|
+
-- init.sql
|
|
2
|
+
-- Create role for anonymous user
|
|
3
|
+
CREATE ROLE anon NOLOGIN;
|
|
4
|
+
|
|
5
|
+
-- Create role for authenticator
|
|
6
|
+
CREATE ROLE authenticated NOLOGIN;
|
|
7
|
+
|
|
8
|
+
-- Create project admin role for admin users
|
|
9
|
+
CREATE ROLE project_admin NOLOGIN;
|
|
10
|
+
|
|
11
|
+
GRANT USAGE ON SCHEMA public TO anon;
|
|
12
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
|
|
13
|
+
GRANT USAGE ON SCHEMA public TO authenticated;
|
|
14
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO authenticated;
|
|
15
|
+
GRANT USAGE ON SCHEMA public TO project_admin;
|
|
16
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO project_admin;
|
|
17
|
+
|
|
18
|
+
-- Grant permissions to roles
|
|
19
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO anon, authenticated, project_admin;
|
|
20
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO anon, authenticated, project_admin;
|
|
21
|
+
-- Create function to automatically create RLS policies for new tables
|
|
22
|
+
CREATE OR REPLACE FUNCTION public.create_default_policies()
|
|
23
|
+
RETURNS event_trigger AS $$
|
|
24
|
+
DECLARE
|
|
25
|
+
obj record;
|
|
26
|
+
table_schema text;
|
|
27
|
+
table_name text;
|
|
28
|
+
has_rls boolean;
|
|
29
|
+
BEGIN
|
|
30
|
+
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'CREATE TABLE'
|
|
31
|
+
LOOP
|
|
32
|
+
-- Extract schema and table name from object_identity
|
|
33
|
+
-- Handle quoted identifiers by removing quotes
|
|
34
|
+
SELECT INTO table_schema, table_name
|
|
35
|
+
split_part(obj.object_identity, '.', 1),
|
|
36
|
+
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
37
|
+
-- Check if RLS is enabled on the table
|
|
38
|
+
SELECT INTO has_rls
|
|
39
|
+
rowsecurity
|
|
40
|
+
FROM pg_tables
|
|
41
|
+
WHERE schemaname = table_schema
|
|
42
|
+
AND tablename = table_name;
|
|
43
|
+
-- Only create policies if RLS is enabled
|
|
44
|
+
IF has_rls THEN
|
|
45
|
+
-- Create policy for project_admin role only
|
|
46
|
+
-- Users must define their own policies for anon and authenticated roles
|
|
47
|
+
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
48
|
+
END IF;
|
|
49
|
+
END LOOP;
|
|
50
|
+
END;
|
|
51
|
+
$$ LANGUAGE plpgsql;
|
|
52
|
+
|
|
53
|
+
-- Create event trigger to run the function when new tables are created
|
|
54
|
+
CREATE EVENT TRIGGER create_policies_on_table_create
|
|
55
|
+
ON ddl_command_end
|
|
56
|
+
WHEN TAG IN ('CREATE TABLE')
|
|
57
|
+
EXECUTE FUNCTION public.create_default_policies();
|
|
58
|
+
|
|
59
|
+
-- Create function to handle RLS enablement
|
|
60
|
+
CREATE OR REPLACE FUNCTION public.create_policies_after_rls()
|
|
61
|
+
RETURNS event_trigger AS $$
|
|
62
|
+
DECLARE
|
|
63
|
+
obj record;
|
|
64
|
+
table_schema text;
|
|
65
|
+
table_name text;
|
|
66
|
+
BEGIN
|
|
67
|
+
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'ALTER TABLE'
|
|
68
|
+
LOOP
|
|
69
|
+
-- Extract schema and table name
|
|
70
|
+
-- Handle quoted identifiers by removing quotes
|
|
71
|
+
SELECT INTO table_schema, table_name
|
|
72
|
+
split_part(obj.object_identity, '.', 1),
|
|
73
|
+
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
74
|
+
-- Check if table has RLS enabled and no policies yet
|
|
75
|
+
IF EXISTS (
|
|
76
|
+
SELECT 1 FROM pg_tables
|
|
77
|
+
WHERE schemaname = table_schema
|
|
78
|
+
AND tablename = table_name
|
|
79
|
+
AND rowsecurity = true
|
|
80
|
+
) AND NOT EXISTS (
|
|
81
|
+
SELECT 1 FROM pg_policies
|
|
82
|
+
WHERE schemaname = table_schema
|
|
83
|
+
AND tablename = table_name
|
|
84
|
+
) THEN
|
|
85
|
+
-- Create policy for project_admin role only
|
|
86
|
+
-- Users must define their own policies for anon and authenticated roles
|
|
87
|
+
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
88
|
+
END IF;
|
|
89
|
+
END LOOP;
|
|
90
|
+
END;
|
|
91
|
+
$$ LANGUAGE plpgsql;
|
|
92
|
+
|
|
93
|
+
-- Create event trigger for ALTER TABLE commands
|
|
94
|
+
CREATE EVENT TRIGGER create_policies_on_rls_enable
|
|
95
|
+
ON ddl_command_end
|
|
96
|
+
WHEN TAG IN ('ALTER TABLE')
|
|
97
|
+
EXECUTE FUNCTION public.create_policies_after_rls();
|