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,313 +1,313 @@
1
- # 📖 Deploying InsForge to Azure Virtual Machines (Extended Guide)
2
-
3
- This guide provides comprehensive, step-by-step instructions for deploying, managing, and securing InsForge on an Azure Virtual Machine (VM) using Docker Compose.
4
-
5
- ### ## Prerequisites
6
-
7
- * An active **Azure account**.
8
- * An **SSH client** to connect to the virtual machine.
9
- * Basic familiarity with the **Linux command line**.
10
-
11
- ---
12
-
13
- ### ## Step 1: 🖥️ Create an Azure Virtual Machine
14
-
15
- 1. **Log in to the [Azure Portal](https://portal.azure.com/)** and navigate to **Virtual machines**.
16
- 2. Click **+ Create** > **Azure virtual machine**.
17
- 3. **Basics Tab:**
18
- * **Resource Group:** Create a new one (e.g., `insforge-rg`).
19
- * **Virtual machine name:** `insforge-vm`.
20
- * **Image:** **Ubuntu Server 20.04 LTS** or newer.
21
- * **Size:** `Standard_B2s` (2 vCPUs, 4 GiB memory) is a good start. For production, consider `Standard_B4ms` (4 vCPUs, 16 GiB memory).
22
- * **Authentication type:** **SSH public key**.
23
- * **SSH public key source:** **Generate new key pair**. Name it `insforge-key`.
24
- 4. **Networking Tab:**
25
- * In the **Network security group** section, click **Create new**.
26
- * Add the following **inbound port rules** to allow traffic:
27
- * `22` (SSH)
28
- * `80` (HTTP for Nginx)
29
- * `443` (HTTPS for Nginx/SSL)
30
- * `7130` (InsForge Backend API)
31
- * `7131` (InsForge Frontend Dashboard)
32
- 5. **Review and Create:**
33
- * Click **Review + create**, then **Create**.
34
- * When prompted, **Download private key and create resource**. Save the `.pem` file securely.
35
- * Once deployed, find and copy your VM's **Public IP address**.
36
-
37
- ---
38
-
39
- ### ## Step 2: ⚙️ Connect and Set Up the Server
40
-
41
- 1. **Connect via SSH:**
42
- Open your terminal, give your key the correct permissions, and connect to the VM.
43
-
44
- ```bash
45
- chmod 400 /path/to/your/insforge-key.pem
46
- ssh -i /path/to/your/insforge-key.pem azureuser@<your-vm-public-ip>
47
- ```
48
-
49
- 2. **Update System Packages:**
50
- ```bash
51
- sudo apt update && sudo apt upgrade -y
52
- ```
53
-
54
- 3. **Install Docker:**
55
- Follow the official, up-to-date instructions on the Docker website to install Docker Engine on Ubuntu:
56
- **[https://docs.docker.com/engine/install/ubuntu/](https://docs.docker.com/engine/install/ubuntu/)**
57
-
58
- 4. **Add Your User to the Docker Group:**
59
- This step allows you to run Docker commands without `sudo`.
60
-
61
- ```bash
62
- # Add your user to the docker group
63
- sudo usermod -aG docker $USER
64
-
65
- # Apply the group changes
66
- newgrp docker
67
- ```
68
- Verify it works. This command should now run without `sudo`:
69
- ```bash
70
- docker ps
71
- ```
72
- > 💡 **Note:** If `docker ps` doesn't work, log out of your SSH session and log back in, then try again.
73
- >
74
- > ⚠️ **Security Note:** Adding a user to the `docker` group grants them root-equivalent privileges. This is acceptable for a single-user VM but be cautious on shared systems.
75
-
76
- 5. **Install Git:**
77
- ```bash
78
- sudo apt install git -y
79
- ```
80
-
81
- ---
82
-
83
- ### ## Step 3: 🚀 Deploy InsForge
84
-
85
- 1. **Clone the Repository:**
86
- Navigate to your home directory and clone the InsForge project.
87
- ```bash
88
- cd ~
89
- git clone https://github.com/InsForge/InsForge.git
90
- cd InsForge
91
- ```
92
-
93
- 2. **Create Environment Configuration:**
94
- Create your `.env` file from the example and open it for editing.
95
- ```bash
96
- cp .env.example .env
97
- nano .env
98
- ```
99
- Paste the following configuration and **customize the values**, especially the secrets and `API_BASE_URL`.
100
-
101
- ```ini
102
- # ============================================
103
- # Server Configuration
104
- # ============================================
105
- PORT=7130
106
-
107
- # ============================================
108
- # Database Configuration
109
- # ============================================
110
- POSTGRES_USER=postgres
111
- POSTGRES_PASSWORD=postgres
112
- POSTGRES_DB=insforge
113
-
114
- # ============================================
115
- # Security & Authentication
116
- # ============================================
117
- # IMPORTANT: Generate strong random secrets for production
118
- JWT_SECRET=your-secret-key-here-must-be-32-char-or-above
119
- ENCRYPTION_KEY=your-encryption-key-here-must-be-32-char
120
-
121
- # Admin Account (used for initial setup)
122
- ADMIN_EMAIL=admin@example.com
123
- ADMIN_PASSWORD=change-this-password
124
-
125
- # ============================================
126
- # API Configuration
127
- # ============================================
128
- # Replace with your VM public IP or domain
129
- API_BASE_URL=http://<your-vm-public-ip>:7130
130
- VITE_API_BASE_URL=http://<your-vm-public-ip>:7130
131
- ```
132
- > **Generate Secure Secrets:** Use these commands on your VM to generate strong secrets and paste them into your `.env` file:
133
- > ```bash
134
- > # Generate JWT_SECRET (32+ characters)
135
- > openssl rand -base64 32
136
- >
137
- > # Generate ENCRYPTION_KEY (must be exactly 32 characters)
138
- > openssl rand -base64 24
139
- > ```
140
-
141
- 3. **Start InsForge Services:**
142
- Pull the Docker images and start all services in the background.
143
- ```bash
144
- docker compose up -d
145
- ```
146
-
147
- 4. **Verify Services:**
148
- Check that all five containers are running.
149
- ```bash
150
- docker compose ps
151
- ```
152
- You should see `insforge-postgres`, `insforge-postgrest`, `insforge`, `insforge-deno`, and `insforge-vector` services running.
153
-
154
- ---
155
-
156
- ### ## Step 4: 🔑 Access Your InsForge Instance
157
-
158
- 1. **Test Backend API:**
159
- Use `curl` to check the health endpoint.
160
- ```bash
161
- curl http://<your-vm-public-ip>:7130/api/health
162
- ```
163
- You should see a response like: `{"status":"ok", ...}`
164
-
165
- 2. **Access Dashboard:**
166
- Open your browser and navigate to: `http://<your-vm-public-ip>:7131`
167
-
168
- 3. **⚠️ Important: Custom Admin Credentials Configuration**
169
- > 🚧 **Active Development Notice:** The credential management system is being developed. If you customize `ADMIN_EMAIL` and `ADMIN_PASSWORD` in your `.env` file (which is recommended), you must **also manually update the frontend login page** to match. This is a temporary workaround.
170
- >
171
- > **Step 1:** Update your `.env` file.
172
- >
173
- > **Step 2:** Manually edit the login page file:
174
- > ```bash
175
- > nano ~/InsForge/frontend/src/features/login/page/LoginPage.tsx
176
- > ```
177
- > **Step 3:** Find and update the `defaultValues` to match your `.env` credentials.
178
-
179
- ---
180
-
181
- ### ## Step 5: 🌐 Configure Domain (Optional but Recommended)
182
-
183
- 1. **Update DNS Records:**
184
- In your domain provider's DNS settings, add two **A records** pointing to your VM's Public IP address:
185
- * `api.yourdomain.com` → `<your-vm-public-ip>`
186
- * `app.yourdomain.com` → `<your-vm-public-ip>`
187
-
188
- 2. **Install and Configure Nginx as a Reverse Proxy:**
189
- ```bash
190
- sudo apt install nginx -y
191
- sudo nano /etc/nginx/sites-available/insforge
192
- ```
193
- Paste the following configuration:
194
- ```nginx
195
- # Backend API
196
- server {
197
- listen 80;
198
- server_name api.yourdomain.com;
199
- location / {
200
- proxy_pass http://localhost:7130;
201
- proxy_set_header Host $host;
202
- proxy_set_header X-Real-IP $remote_addr;
203
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
204
- proxy_set_header X-Forwarded-Proto $scheme;
205
- }
206
- }
207
- # Frontend Dashboard
208
- server {
209
- listen 80;
210
- server_name app.yourdomain.com;
211
- location / {
212
- proxy_pass http://localhost:7131;
213
- proxy_http_version 1.1;
214
- proxy_set_header Upgrade $http_upgrade;
215
- proxy_set_header Connection 'upgrade';
216
- proxy_set_header Host $host;
217
- }
218
- }
219
- ```
220
- Enable the configuration and reload Nginx:
221
- ```bash
222
- sudo ln -s /etc/nginx/sites-available/insforge /etc/nginx/sites-enabled/
223
- sudo nginx -t
224
- sudo systemctl reload nginx
225
- ```
226
-
227
- 3. **Install SSL Certificate with Certbot:**
228
- ```bash
229
- # Install Certbot for Nginx
230
- sudo apt install certbot python3-certbot-nginx -y
231
- # Obtain SSL certificates and configure Nginx automatically
232
- sudo certbot --nginx -d api.yourdomain.com -d app.yourdomain.com
233
- ```
234
- Follow the prompts. Certbot will handle the rest.
235
-
236
- 4. **Update `.env` with HTTPS URLs:**
237
- Edit your `.env` file and update the URLs.
238
- ```bash
239
- cd ~/InsForge
240
- nano .env
241
- ```
242
- Change the URLs to `https`:
243
- ```ini
244
- API_BASE_URL=[https://api.yourdomain.com](https://api.yourdomain.com)
245
- VITE_API_BASE_URL=[https://api.yourdomain.com](https://api.yourdomain.com)
246
- ```
247
- Restart the services for the changes to take effect:
248
- ```bash
249
- docker compose down && docker compose up -d
250
- ```
251
-
252
- ---
253
-
254
- ### ## 🔧 Management & Maintenance
255
-
256
- * **View Logs:** `docker compose logs -f` (all services) or `docker compose logs -f insforge` (specific service).
257
- * **Stop Services:** `docker compose down`
258
- * **Restart Services:** `docker compose restart`
259
- * **Update InsForge:**
260
- ```bash
261
- cd ~/InsForge
262
- git pull origin main
263
- docker compose up -d --build
264
- ```
265
- * **Backup Database:**
266
- ```bash
267
- docker exec insforge-postgres pg_dump -U postgres insforge > backup_$(date +%Y%m%d_%H%M%S).sql
268
- ```
269
-
270
- ### ## 🐛 Troubleshooting
271
-
272
- * **Services Won't Start:** Check `docker compose logs` for errors. Ensure you have enough disk space (`df -h`) and memory (`free -h`).
273
- * **Port Already in Use:** Check which process is using the port with `sudo netstat -tulpn | grep :7130`.
274
- * **Out of Memory:** Consider upgrading your Azure VM to a size with more RAM.
275
-
276
- ### ## 📊 Cost Estimation
277
-
278
- > **Disclaimer:** Prices are estimates based on Pay-As-You-Go rates in a common region (e.g., East US) and can vary. Always check the official [Azure Pricing Calculator](https://azure.microsoft.com/en-us/pricing/calculator/) for the most accurate information. On Azure, you pay for the VM's resources (CPU, RAM, Storage), which are shared by all the Docker services you run on it.
279
-
280
- #### ### Free Tier (for Testing)
281
- * **Cost:** **~$0/month** for the first 12 months.
282
- * **Resources:** Azure provides a free tier that includes 750 hours/month of a `B1s` burstable VM.
283
- * **Limitations:** This VM has very limited resources (1 vCPU, 1 GiB RAM) and may run slowly. It's suitable only for basic testing and familiarization, not for active development or production.
284
-
285
- #### ### Starter Setup (for Development & Small Projects)
286
- * **Cost:** **~$30 - $40/month**
287
- * **Resources:** This estimate is for a `Standard_B2s` VM (2 vCPU, 4 GiB RAM) running all the InsForge Docker containers.
288
- * **Breakdown:** The cost primarily consists of the VM compute hours. It also includes the OS disk storage and a static public IP address. This single VM runs your database, backend, Deno, and all other services.
289
-
290
- #### ### Production Setup (for Scalability & Reliability)
291
- For production, you can choose between an all-in-one, larger VM or a more robust setup using managed services.
292
-
293
- * **Option A: All-in-One Larger VM**
294
- * **Cost:** **~$150 - $170/month**
295
- * **Resources:** A more powerful `Standard_B4ms` VM (4 vCPU, 16 GiB RAM) to handle higher traffic and all services, including a potential Redis container.
296
- * **Pros:** Simple to manage, consolidated cost.
297
- * **Cons:** Database and application share resources, which can create performance bottlenecks. Scaling requires upgrading the entire VM.
298
-
299
- * **Option B: Managed Services (Recommended for Production)**
300
- * **Cost:** **~$120+/month** (highly variable)
301
- * **Resources:**
302
- * **Application VM:** A `Standard_B2s` VM for the app services (InsForge, PostgREST, Deno). `(~$30/month)`
303
- * **Managed Database:** Use **Azure Database for PostgreSQL** for reliability, automated backups, and scaling. `(~$40+/month for a starter tier)`
304
- * **Managed Cache (Optional):** Use **Azure Cache for Redis** if needed. `(~$50+/month)`
305
- * **Pros:** Highly reliable and scalable. Database performance is isolated and guaranteed. Managed backups and security.
306
- * **Cons:** More complex setup, costs are distributed across multiple services.
307
-
308
- ### ## 🔒 Security Best Practices
309
-
310
- * **Change Default Passwords:** Always update admin and database passwords.
311
- * **Enable Firewall:** Use Azure **Network Security Groups (NSGs)** to restrict access to necessary ports and IP addresses.
312
- * **Regular Updates:** Periodically run `sudo apt update && sudo apt upgrade -y` and update InsForge.
1
+ # 📖 Deploying InsForge to Azure Virtual Machines (Extended Guide)
2
+
3
+ This guide provides comprehensive, step-by-step instructions for deploying, managing, and securing InsForge on an Azure Virtual Machine (VM) using Docker Compose.
4
+
5
+ ### ## Prerequisites
6
+
7
+ * An active **Azure account**.
8
+ * An **SSH client** to connect to the virtual machine.
9
+ * Basic familiarity with the **Linux command line**.
10
+
11
+ ---
12
+
13
+ ### ## Step 1: 🖥️ Create an Azure Virtual Machine
14
+
15
+ 1. **Log in to the [Azure Portal](https://portal.azure.com/)** and navigate to **Virtual machines**.
16
+ 2. Click **+ Create** > **Azure virtual machine**.
17
+ 3. **Basics Tab:**
18
+ * **Resource Group:** Create a new one (e.g., `insforge-rg`).
19
+ * **Virtual machine name:** `insforge-vm`.
20
+ * **Image:** **Ubuntu Server 20.04 LTS** or newer.
21
+ * **Size:** `Standard_B2s` (2 vCPUs, 4 GiB memory) is a good start. For production, consider `Standard_B4ms` (4 vCPUs, 16 GiB memory).
22
+ * **Authentication type:** **SSH public key**.
23
+ * **SSH public key source:** **Generate new key pair**. Name it `insforge-key`.
24
+ 4. **Networking Tab:**
25
+ * In the **Network security group** section, click **Create new**.
26
+ * Add the following **inbound port rules** to allow traffic:
27
+ * `22` (SSH)
28
+ * `80` (HTTP for Nginx)
29
+ * `443` (HTTPS for Nginx/SSL)
30
+ * `7130` (InsForge Backend API)
31
+ * `7131` (InsForge Frontend Dashboard)
32
+ 5. **Review and Create:**
33
+ * Click **Review + create**, then **Create**.
34
+ * When prompted, **Download private key and create resource**. Save the `.pem` file securely.
35
+ * Once deployed, find and copy your VM's **Public IP address**.
36
+
37
+ ---
38
+
39
+ ### ## Step 2: ⚙️ Connect and Set Up the Server
40
+
41
+ 1. **Connect via SSH:**
42
+ Open your terminal, give your key the correct permissions, and connect to the VM.
43
+
44
+ ```bash
45
+ chmod 400 /path/to/your/insforge-key.pem
46
+ ssh -i /path/to/your/insforge-key.pem azureuser@<your-vm-public-ip>
47
+ ```
48
+
49
+ 2. **Update System Packages:**
50
+ ```bash
51
+ sudo apt update && sudo apt upgrade -y
52
+ ```
53
+
54
+ 3. **Install Docker:**
55
+ Follow the official, up-to-date instructions on the Docker website to install Docker Engine on Ubuntu:
56
+ **[https://docs.docker.com/engine/install/ubuntu/](https://docs.docker.com/engine/install/ubuntu/)**
57
+
58
+ 4. **Add Your User to the Docker Group:**
59
+ This step allows you to run Docker commands without `sudo`.
60
+
61
+ ```bash
62
+ # Add your user to the docker group
63
+ sudo usermod -aG docker $USER
64
+
65
+ # Apply the group changes
66
+ newgrp docker
67
+ ```
68
+ Verify it works. This command should now run without `sudo`:
69
+ ```bash
70
+ docker ps
71
+ ```
72
+ > 💡 **Note:** If `docker ps` doesn't work, log out of your SSH session and log back in, then try again.
73
+ >
74
+ > ⚠️ **Security Note:** Adding a user to the `docker` group grants them root-equivalent privileges. This is acceptable for a single-user VM but be cautious on shared systems.
75
+
76
+ 5. **Install Git:**
77
+ ```bash
78
+ sudo apt install git -y
79
+ ```
80
+
81
+ ---
82
+
83
+ ### ## Step 3: 🚀 Deploy InsForge
84
+
85
+ 1. **Clone the Repository:**
86
+ Navigate to your home directory and clone the InsForge project.
87
+ ```bash
88
+ cd ~
89
+ git clone https://github.com/InsForge/InsForge.git
90
+ cd InsForge
91
+ ```
92
+
93
+ 2. **Create Environment Configuration:**
94
+ Create your `.env` file from the example and open it for editing.
95
+ ```bash
96
+ cp .env.example .env
97
+ nano .env
98
+ ```
99
+ Paste the following configuration and **customize the values**, especially the secrets and `API_BASE_URL`.
100
+
101
+ ```ini
102
+ # ============================================
103
+ # Server Configuration
104
+ # ============================================
105
+ PORT=7130
106
+
107
+ # ============================================
108
+ # Database Configuration
109
+ # ============================================
110
+ POSTGRES_USER=postgres
111
+ POSTGRES_PASSWORD=postgres
112
+ POSTGRES_DB=insforge
113
+
114
+ # ============================================
115
+ # Security & Authentication
116
+ # ============================================
117
+ # IMPORTANT: Generate strong random secrets for production
118
+ JWT_SECRET=your-secret-key-here-must-be-32-char-or-above
119
+ ENCRYPTION_KEY=your-encryption-key-here-must-be-32-char
120
+
121
+ # Admin Account (used for initial setup)
122
+ ADMIN_EMAIL=admin@example.com
123
+ ADMIN_PASSWORD=change-this-password
124
+
125
+ # ============================================
126
+ # API Configuration
127
+ # ============================================
128
+ # Replace with your VM public IP or domain
129
+ API_BASE_URL=http://<your-vm-public-ip>:7130
130
+ VITE_API_BASE_URL=http://<your-vm-public-ip>:7130
131
+ ```
132
+ > **Generate Secure Secrets:** Use these commands on your VM to generate strong secrets and paste them into your `.env` file:
133
+ > ```bash
134
+ > # Generate JWT_SECRET (32+ characters)
135
+ > openssl rand -base64 32
136
+ >
137
+ > # Generate ENCRYPTION_KEY (must be exactly 32 characters)
138
+ > openssl rand -base64 24
139
+ > ```
140
+
141
+ 3. **Start InsForge Services:**
142
+ Pull the Docker images and start all services in the background.
143
+ ```bash
144
+ docker compose up -d
145
+ ```
146
+
147
+ 4. **Verify Services:**
148
+ Check that all five containers are running.
149
+ ```bash
150
+ docker compose ps
151
+ ```
152
+ You should see `insforge-postgres`, `insforge-postgrest`, `insforge`, `insforge-deno`, and `insforge-vector` services running.
153
+
154
+ ---
155
+
156
+ ### ## Step 4: 🔑 Access Your InsForge Instance
157
+
158
+ 1. **Test Backend API:**
159
+ Use `curl` to check the health endpoint.
160
+ ```bash
161
+ curl http://<your-vm-public-ip>:7130/api/health
162
+ ```
163
+ You should see a response like: `{"status":"ok", ...}`
164
+
165
+ 2. **Access Dashboard:**
166
+ Open your browser and navigate to: `http://<your-vm-public-ip>:7131`
167
+
168
+ 3. **⚠️ Important: Custom Admin Credentials Configuration**
169
+ > 🚧 **Active Development Notice:** The credential management system is being developed. If you customize `ADMIN_EMAIL` and `ADMIN_PASSWORD` in your `.env` file (which is recommended), you must **also manually update the frontend login page** to match. This is a temporary workaround.
170
+ >
171
+ > **Step 1:** Update your `.env` file.
172
+ >
173
+ > **Step 2:** Manually edit the login page file:
174
+ > ```bash
175
+ > nano ~/InsForge/frontend/src/features/login/page/LoginPage.tsx
176
+ > ```
177
+ > **Step 3:** Find and update the `defaultValues` to match your `.env` credentials.
178
+
179
+ ---
180
+
181
+ ### ## Step 5: 🌐 Configure Domain (Optional but Recommended)
182
+
183
+ 1. **Update DNS Records:**
184
+ In your domain provider's DNS settings, add two **A records** pointing to your VM's Public IP address:
185
+ * `api.yourdomain.com` → `<your-vm-public-ip>`
186
+ * `app.yourdomain.com` → `<your-vm-public-ip>`
187
+
188
+ 2. **Install and Configure Nginx as a Reverse Proxy:**
189
+ ```bash
190
+ sudo apt install nginx -y
191
+ sudo nano /etc/nginx/sites-available/insforge
192
+ ```
193
+ Paste the following configuration:
194
+ ```nginx
195
+ # Backend API
196
+ server {
197
+ listen 80;
198
+ server_name api.yourdomain.com;
199
+ location / {
200
+ proxy_pass http://localhost:7130;
201
+ proxy_set_header Host $host;
202
+ proxy_set_header X-Real-IP $remote_addr;
203
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
204
+ proxy_set_header X-Forwarded-Proto $scheme;
205
+ }
206
+ }
207
+ # Frontend Dashboard
208
+ server {
209
+ listen 80;
210
+ server_name app.yourdomain.com;
211
+ location / {
212
+ proxy_pass http://localhost:7131;
213
+ proxy_http_version 1.1;
214
+ proxy_set_header Upgrade $http_upgrade;
215
+ proxy_set_header Connection 'upgrade';
216
+ proxy_set_header Host $host;
217
+ }
218
+ }
219
+ ```
220
+ Enable the configuration and reload Nginx:
221
+ ```bash
222
+ sudo ln -s /etc/nginx/sites-available/insforge /etc/nginx/sites-enabled/
223
+ sudo nginx -t
224
+ sudo systemctl reload nginx
225
+ ```
226
+
227
+ 3. **Install SSL Certificate with Certbot:**
228
+ ```bash
229
+ # Install Certbot for Nginx
230
+ sudo apt install certbot python3-certbot-nginx -y
231
+ # Obtain SSL certificates and configure Nginx automatically
232
+ sudo certbot --nginx -d api.yourdomain.com -d app.yourdomain.com
233
+ ```
234
+ Follow the prompts. Certbot will handle the rest.
235
+
236
+ 4. **Update `.env` with HTTPS URLs:**
237
+ Edit your `.env` file and update the URLs.
238
+ ```bash
239
+ cd ~/InsForge
240
+ nano .env
241
+ ```
242
+ Change the URLs to `https`:
243
+ ```ini
244
+ API_BASE_URL=[https://api.yourdomain.com](https://api.yourdomain.com)
245
+ VITE_API_BASE_URL=[https://api.yourdomain.com](https://api.yourdomain.com)
246
+ ```
247
+ Restart the services for the changes to take effect:
248
+ ```bash
249
+ docker compose down && docker compose up -d
250
+ ```
251
+
252
+ ---
253
+
254
+ ### ## 🔧 Management & Maintenance
255
+
256
+ * **View Logs:** `docker compose logs -f` (all services) or `docker compose logs -f insforge` (specific service).
257
+ * **Stop Services:** `docker compose down`
258
+ * **Restart Services:** `docker compose restart`
259
+ * **Update InsForge:**
260
+ ```bash
261
+ cd ~/InsForge
262
+ git pull origin main
263
+ docker compose up -d --build
264
+ ```
265
+ * **Backup Database:**
266
+ ```bash
267
+ docker exec insforge-postgres pg_dump -U postgres insforge > backup_$(date +%Y%m%d_%H%M%S).sql
268
+ ```
269
+
270
+ ### ## 🐛 Troubleshooting
271
+
272
+ * **Services Won't Start:** Check `docker compose logs` for errors. Ensure you have enough disk space (`df -h`) and memory (`free -h`).
273
+ * **Port Already in Use:** Check which process is using the port with `sudo netstat -tulpn | grep :7130`.
274
+ * **Out of Memory:** Consider upgrading your Azure VM to a size with more RAM.
275
+
276
+ ### ## 📊 Cost Estimation
277
+
278
+ > **Disclaimer:** Prices are estimates based on Pay-As-You-Go rates in a common region (e.g., East US) and can vary. Always check the official [Azure Pricing Calculator](https://azure.microsoft.com/en-us/pricing/calculator/) for the most accurate information. On Azure, you pay for the VM's resources (CPU, RAM, Storage), which are shared by all the Docker services you run on it.
279
+
280
+ #### ### Free Tier (for Testing)
281
+ * **Cost:** **~$0/month** for the first 12 months.
282
+ * **Resources:** Azure provides a free tier that includes 750 hours/month of a `B1s` burstable VM.
283
+ * **Limitations:** This VM has very limited resources (1 vCPU, 1 GiB RAM) and may run slowly. It's suitable only for basic testing and familiarization, not for active development or production.
284
+
285
+ #### ### Starter Setup (for Development & Small Projects)
286
+ * **Cost:** **~$30 - $40/month**
287
+ * **Resources:** This estimate is for a `Standard_B2s` VM (2 vCPU, 4 GiB RAM) running all the InsForge Docker containers.
288
+ * **Breakdown:** The cost primarily consists of the VM compute hours. It also includes the OS disk storage and a static public IP address. This single VM runs your database, backend, Deno, and all other services.
289
+
290
+ #### ### Production Setup (for Scalability & Reliability)
291
+ For production, you can choose between an all-in-one, larger VM or a more robust setup using managed services.
292
+
293
+ * **Option A: All-in-One Larger VM**
294
+ * **Cost:** **~$150 - $170/month**
295
+ * **Resources:** A more powerful `Standard_B4ms` VM (4 vCPU, 16 GiB RAM) to handle higher traffic and all services, including a potential Redis container.
296
+ * **Pros:** Simple to manage, consolidated cost.
297
+ * **Cons:** Database and application share resources, which can create performance bottlenecks. Scaling requires upgrading the entire VM.
298
+
299
+ * **Option B: Managed Services (Recommended for Production)**
300
+ * **Cost:** **~$120+/month** (highly variable)
301
+ * **Resources:**
302
+ * **Application VM:** A `Standard_B2s` VM for the app services (InsForge, PostgREST, Deno). `(~$30/month)`
303
+ * **Managed Database:** Use **Azure Database for PostgreSQL** for reliability, automated backups, and scaling. `(~$40+/month for a starter tier)`
304
+ * **Managed Cache (Optional):** Use **Azure Cache for Redis** if needed. `(~$50+/month)`
305
+ * **Pros:** Highly reliable and scalable. Database performance is isolated and guaranteed. Managed backups and security.
306
+ * **Cons:** More complex setup, costs are distributed across multiple services.
307
+
308
+ ### ## 🔒 Security Best Practices
309
+
310
+ * **Change Default Passwords:** Always update admin and database passwords.
311
+ * **Enable Firewall:** Use Azure **Network Security Groups (NSGs)** to restrict access to necessary ports and IP addresses.
312
+ * **Regular Updates:** Periodically run `sudo apt update && sudo apt upgrade -y` and update InsForge.
313
313
  * **Backup Regularly:** Automate database and configuration backups.