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.
Files changed (335) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -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
- # Logs directory
109
- - LOGS_DIR=/insforge-logs
110
- # Storage directory (for local file storage when S3 is not configured)
111
- - STORAGE_DIR=/insforge-storage
112
- # Auth app URL for development proxy
113
- - AUTH_APP_URL=${AUTH_APP_URL:-http://localhost:7132}
114
- volumes:
115
- - ./package.json:/app/package.json
116
- - ./backend:/app/backend
117
- - ./frontend:/app/frontend
118
- - ./auth:/app/auth
119
- - ./shared-schemas:/app/shared-schemas
120
- - ./docs:/app/docs
121
- - node_modules:/app/node_modules
122
- - backend_node_modules:/app/backend/node_modules
123
- - frontend_node_modules:/app/frontend/node_modules
124
- - auth_node_modules:/app/auth/node_modules
125
- - shared_schemas_node_modules:/app/shared-schemas/node_modules
126
- - shared-logs:/insforge-logs
127
- - storage-data:/insforge-storage
128
- command: sh -c "npm install && cd backend && npm run migrate:up && cd .. && npm run dev"
129
- restart: unless-stopped
130
- networks:
131
- - insforge-network
132
-
133
- # Deno serverless runtime for edge functions
134
- deno:
135
- image: denoland/deno:alpine-2.0.6
136
- container_name: insforge-deno
137
- working_dir: /app
138
- depends_on:
139
- - postgres
140
- - postgrest
141
- ports:
142
- - "7133:7133"
143
- environment:
144
- - PORT=7133
145
- - DENO_ENV=${DENO_ENV:-development}
146
- - DENO_DIR=/deno-dir
147
- # PostgreSQL connection
148
- - POSTGRES_HOST=postgres
149
- - POSTGRES_PORT=5432
150
- - POSTGRES_DB=${POSTGRES_DB:-insforge}
151
- - POSTGRES_USER=${POSTGRES_USER:-postgres}
152
- - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
153
- - POSTGREST_BASE_URL=http://postgrest:3000
154
- # Worker timeout (30 seconds default)
155
- - WORKER_TIMEOUT_MS=${WORKER_TIMEOUT_MS:-30000}
156
- # Encryption keys for decrypting function secrets
157
- - ENCRYPTION_KEY=${ENCRYPTION_KEY}
158
- - JWT_SECRET=${JWT_SECRET:-dev-secret-please-change-in-production}
159
- volumes:
160
- - ./functions:/app/functions
161
- - deno_cache:/deno-dir
162
- command: >
163
- sh -c "
164
- echo 'Downloading Deno dependencies...' &&
165
- deno cache functions/server.ts &&
166
- echo 'Starting Deno server on port 7133...' &&
167
- deno run --allow-net --allow-env --allow-read=./functions/worker-template.js --watch functions/server.ts
168
- "
169
- restart: unless-stopped
170
- networks:
171
- - insforge-network
172
-
173
- # Vector.dev for log collection and shipping
174
- vector:
175
- container_name: insforge-vector
176
- image: timberio/vector:0.28.1-alpine
177
- restart: unless-stopped
178
- depends_on:
179
- postgres:
180
- condition: service_healthy
181
- postgrest:
182
- condition: service_started
183
- insforge:
184
- condition: service_started
185
- deno:
186
- condition: service_started
187
- volumes:
188
- - ./docker-init/logs/vector.yml:/etc/vector/vector.yml:ro
189
- - /var/run/docker.sock:/var/run/docker.sock:ro
190
- - shared-logs:/insforge-logs
191
- healthcheck:
192
- test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7135/health"]
193
- timeout: 5s
194
- interval: 5s
195
- retries: 3
196
- environment:
197
- - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
198
- - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
199
- - AWS_REGION=${AWS_REGION:-skip}
200
- - PROJECT_ID=${PROJECT_ID:-}
201
- - HOSTNAME_OVERRIDE=${HOSTNAME_OVERRIDE:-}
202
- command: ["--config", "/etc/vector/vector.yml"]
203
- networks:
204
- - insforge-network
205
-
206
- volumes:
207
- postgres-data:
208
- driver: local
209
- node_modules:
210
- driver: local
211
- backend_node_modules:
212
- driver: local
213
- frontend_node_modules:
214
- driver: local
215
- auth_node_modules:
216
- driver: local
217
- shared_schemas_node_modules:
218
- driver: local
219
- deno_cache:
220
- driver: local
221
- shared-logs:
222
- driver: local
223
- storage-data:
224
- driver: local
225
-
226
- networks:
227
- insforge-network:
228
- driver: bridge
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();