insforge 1.2.10 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
|
@@ -1,243 +1,243 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Architecture
|
|
3
|
-
description: Enterprise-grade storage system powered by AWS S3
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
InsForge provides a high-performance, scalable storage system built on AWS S3, delivering enterprise-grade reliability with 99.999999999% (11 9's) durability.
|
|
9
|
-
|
|
10
|
-
## Technology Stack
|
|
11
|
-
|
|
12
|
-
```mermaid
|
|
13
|
-
graph TB
|
|
14
|
-
Client[Client Application] --> SDK[InsForge SDK]
|
|
15
|
-
SDK --> StorageAPI[Storage API]
|
|
16
|
-
|
|
17
|
-
StorageAPI --> S3[AWS S3]
|
|
18
|
-
|
|
19
|
-
StorageAPI --> DB[(PostgreSQL)]
|
|
20
|
-
DB --> Metadata[File Metadata]
|
|
21
|
-
DB --> Buckets[Bucket Configuration]
|
|
22
|
-
|
|
23
|
-
S3 --> DirectUpload[Presigned URLs]
|
|
24
|
-
S3 --> SecureAccess[IAM Policies]
|
|
25
|
-
|
|
26
|
-
style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
|
|
27
|
-
style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
28
|
-
style StorageAPI fill:#166534,stroke:#22c55e,color:#dcfce7
|
|
29
|
-
style S3 fill:#ea580c,stroke:#f97316,color:#fed7aa
|
|
30
|
-
style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
|
|
31
|
-
style Metadata fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
32
|
-
style Buckets fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
33
|
-
style DirectUpload fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
34
|
-
style SecureAccess fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Core Components
|
|
38
|
-
|
|
39
|
-
| Component | Technology | Purpose |
|
|
40
|
-
|-----------|------------|---------|
|
|
41
|
-
| **Storage Backend** | AWS S3 | Enterprise-grade object storage |
|
|
42
|
-
| **Metadata Store** | PostgreSQL | File metadata, bucket configuration |
|
|
43
|
-
| **Upload Handler** | Multer | Multipart form data parsing (both backends) |
|
|
44
|
-
| **URL Strategy** | Presigned URLs | Secure direct uploads/downloads (S3 only) |
|
|
45
|
-
| **Access Control** | JWT + Bucket visibility | Public/private bucket permissions |
|
|
46
|
-
|
|
47
|
-
## AWS S3 Architecture
|
|
48
|
-
|
|
49
|
-
### Enterprise Features
|
|
50
|
-
|
|
51
|
-
- **Direct Uploads**: Presigned URLs bypass API server for unlimited scale
|
|
52
|
-
- **IAM Security**: Role-based authentication without credential management
|
|
53
|
-
- **Multi-Tenancy**: Secure isolation between projects using app key prefix
|
|
54
|
-
- **Bucket Policies**: Public and private bucket configurations
|
|
55
|
-
- **Automatic Cleanup**: Configurable lifecycle policies
|
|
56
|
-
- **Metadata Tracking**: Rich file metadata stored in PostgreSQL
|
|
57
|
-
|
|
58
|
-
## Upload Strategies
|
|
59
|
-
|
|
60
|
-
### Direct Upload to S3
|
|
61
|
-
|
|
62
|
-
```mermaid
|
|
63
|
-
sequenceDiagram
|
|
64
|
-
participant Client
|
|
65
|
-
participant API
|
|
66
|
-
participant S3
|
|
67
|
-
participant DB
|
|
68
|
-
|
|
69
|
-
Client->>API: POST/PUT with multipart/form-data
|
|
70
|
-
API->>S3: Upload file
|
|
71
|
-
S3-->>API: Success
|
|
72
|
-
API->>DB: Store metadata
|
|
73
|
-
API-->>Client: {url, key, size}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Presigned URL Upload (Recommended)
|
|
77
|
-
|
|
78
|
-
```mermaid
|
|
79
|
-
sequenceDiagram
|
|
80
|
-
participant Client
|
|
81
|
-
participant API
|
|
82
|
-
participant S3
|
|
83
|
-
participant DB
|
|
84
|
-
|
|
85
|
-
Client->>API: GET upload strategy
|
|
86
|
-
API->>S3: Generate presigned URL
|
|
87
|
-
S3-->>API: Presigned URL
|
|
88
|
-
API-->>Client: {uploadUrl, key}
|
|
89
|
-
Client->>S3: Direct upload
|
|
90
|
-
Client->>API: Confirm upload
|
|
91
|
-
API->>DB: Store metadata
|
|
92
|
-
API-->>Client: {url, key, size}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Bucket Configuration
|
|
96
|
-
|
|
97
|
-
### Bucket Types
|
|
98
|
-
|
|
99
|
-
| Type | Access | Use Case |
|
|
100
|
-
|------|--------|----------|
|
|
101
|
-
| **Public** | No auth required for downloads | Public assets, images, static files |
|
|
102
|
-
| **Private** | Auth required for all operations | User files, sensitive documents |
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
## File Operations
|
|
106
|
-
|
|
107
|
-
### Upload Flow
|
|
108
|
-
|
|
109
|
-
1. **Request Upload**: Client requests upload permission
|
|
110
|
-
2. **Validation**: Check auth, bucket permissions, file size
|
|
111
|
-
3. **Strategy Selection**: Choose direct or presigned upload
|
|
112
|
-
4. **Upload**: Client uploads via selected method
|
|
113
|
-
5. **Confirmation**: Verify upload and store metadata
|
|
114
|
-
6. **Response**: Return file URL and metadata
|
|
115
|
-
|
|
116
|
-
### Download Flow
|
|
117
|
-
|
|
118
|
-
1. **Request File**: Client requests file access
|
|
119
|
-
2. **Permission Check**: Verify bucket/object permissions
|
|
120
|
-
3. **Strategy Selection**: Direct serve or presigned URL
|
|
121
|
-
4. **Delivery**: Stream file or redirect to URL
|
|
122
|
-
|
|
123
|
-
## Security Features
|
|
124
|
-
|
|
125
|
-
<CardGroup cols={2}>
|
|
126
|
-
<Card title="Bucket Policies" icon="shield">
|
|
127
|
-
Public, private, or protected bucket access control
|
|
128
|
-
</Card>
|
|
129
|
-
|
|
130
|
-
<Card title="JWT Authentication" icon="key">
|
|
131
|
-
Token-based access for private resources
|
|
132
|
-
</Card>
|
|
133
|
-
|
|
134
|
-
<Card title="Presigned URLs" icon="link">
|
|
135
|
-
Time-limited URLs for secure S3 access
|
|
136
|
-
</Card>
|
|
137
|
-
|
|
138
|
-
<Card title="MIME Type Validation" icon="file-check">
|
|
139
|
-
Restrict uploads to allowed file types
|
|
140
|
-
</Card>
|
|
141
|
-
|
|
142
|
-
<Card title="Size Limits" icon="weight">
|
|
143
|
-
10MB default, configurable via MAX_FILE_SIZE
|
|
144
|
-
</Card>
|
|
145
|
-
|
|
146
|
-
<Card title="App Key Isolation" icon="key">
|
|
147
|
-
Multi-tenant isolation using app key prefix in S3
|
|
148
|
-
</Card>
|
|
149
|
-
</CardGroup>
|
|
150
|
-
|
|
151
|
-
## Intelligent Metadata Management
|
|
152
|
-
|
|
153
|
-
InsForge maintains optimized metadata in PostgreSQL for instant queries:
|
|
154
|
-
|
|
155
|
-
- **Fast Search**: Indexed metadata for sub-millisecond lookups
|
|
156
|
-
- **Rich Metadata**: MIME types, sizes, timestamps, custom tags
|
|
157
|
-
- **Usage Analytics**: Track downloads, bandwidth, popular files
|
|
158
|
-
- **Access Control**: Fine-grained permissions per file or bucket
|
|
159
|
-
|
|
160
|
-
### Secure URL Generation
|
|
161
|
-
|
|
162
|
-
| Type | Use Case | Security |
|
|
163
|
-
|------|----------|----------|
|
|
164
|
-
| **Public Access** | Static assets, images | Direct S3 URLs |
|
|
165
|
-
| **Presigned GET** | Private file access | Time-limited, single-use |
|
|
166
|
-
| **Presigned POST** | Direct uploads | Validated, size-limited |
|
|
167
|
-
|
|
168
|
-
## Performance Optimizations
|
|
169
|
-
|
|
170
|
-
### Performance Features
|
|
171
|
-
|
|
172
|
-
- **Direct S3 Access**: Bypass API server for uploads/downloads
|
|
173
|
-
- **Browser Caching**: Cache-Control headers
|
|
174
|
-
- **ETag Support**: Conditional requests for S3
|
|
175
|
-
- **Parallel Uploads**: Support for multipart uploads
|
|
176
|
-
|
|
177
|
-
### Upload Methods
|
|
178
|
-
|
|
179
|
-
**1. Direct Upload through API Server:**
|
|
180
|
-
- Client sends file to `/api/storage/buckets/{bucket}/objects`
|
|
181
|
-
- File passes through API server memory
|
|
182
|
-
- Server uploads to S3
|
|
183
|
-
- Limited by server memory (10MB default)
|
|
184
|
-
|
|
185
|
-
**2. Presigned URL Upload (Recommended):**
|
|
186
|
-
- Client requests upload URL from `/api/storage/buckets/{bucket}/upload-strategy`
|
|
187
|
-
- Server returns presigned POST URL
|
|
188
|
-
- Client uploads directly to S3 (bypasses API server)
|
|
189
|
-
- No server memory constraints
|
|
190
|
-
- Client confirms upload via `/api/storage/buckets/{bucket}/objects/{key}/confirm-upload`
|
|
191
|
-
|
|
192
|
-
## Configuration
|
|
193
|
-
|
|
194
|
-
### Environment Variables
|
|
195
|
-
|
|
196
|
-
| Variable | Description | Example |
|
|
197
|
-
|----------|-------------|---------|
|
|
198
|
-
| `AWS_S3_BUCKET` | S3 bucket name | `my-app-storage` |
|
|
199
|
-
| `AWS_REGION` | AWS region | `us-east-2` |
|
|
200
|
-
| `APP_KEY` | App key for S3 multi-tenancy | `my-app-key` |
|
|
201
|
-
|
|
202
|
-
### S3 Configuration
|
|
203
|
-
|
|
204
|
-
```javascript
|
|
205
|
-
// S3 client configuration
|
|
206
|
-
const s3Client = new S3Client({
|
|
207
|
-
region: this.region, // e.g., 'us-east-2'
|
|
208
|
-
// IAM role credentials are automatically used on EC2
|
|
209
|
-
// No explicit credentials needed in production
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// File paths use app key prefix for multi-tenancy
|
|
213
|
-
const s3Key = `${this.appKey}/${bucket}/${key}`;
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
## Best Practices
|
|
217
|
-
|
|
218
|
-
<CardGroup cols={2}>
|
|
219
|
-
<Card title="Use Buckets" icon="folder">
|
|
220
|
-
Organize files logically in buckets
|
|
221
|
-
</Card>
|
|
222
|
-
|
|
223
|
-
<Card title="Set Limits" icon="gauge">
|
|
224
|
-
Configure appropriate size/type limits
|
|
225
|
-
</Card>
|
|
226
|
-
|
|
227
|
-
<Card title="Clean URLs" icon="link">
|
|
228
|
-
Use consistent, SEO-friendly key naming
|
|
229
|
-
</Card>
|
|
230
|
-
|
|
231
|
-
<Card title="Metadata" icon="tags">
|
|
232
|
-
Store searchable metadata in database
|
|
233
|
-
</Card>
|
|
234
|
-
|
|
235
|
-
<Card title="Backup Strategy" icon="cloud-arrow-up">
|
|
236
|
-
Implement regular backups for production
|
|
237
|
-
</Card>
|
|
238
|
-
|
|
239
|
-
<Card title="Monitor Usage" icon="chart-line">
|
|
240
|
-
Track storage costs and usage patterns
|
|
241
|
-
</Card>
|
|
242
|
-
</CardGroup>
|
|
243
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
description: Enterprise-grade storage system powered by AWS S3
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
InsForge provides a high-performance, scalable storage system built on AWS S3, delivering enterprise-grade reliability with 99.999999999% (11 9's) durability.
|
|
9
|
+
|
|
10
|
+
## Technology Stack
|
|
11
|
+
|
|
12
|
+
```mermaid
|
|
13
|
+
graph TB
|
|
14
|
+
Client[Client Application] --> SDK[InsForge SDK]
|
|
15
|
+
SDK --> StorageAPI[Storage API]
|
|
16
|
+
|
|
17
|
+
StorageAPI --> S3[AWS S3]
|
|
18
|
+
|
|
19
|
+
StorageAPI --> DB[(PostgreSQL)]
|
|
20
|
+
DB --> Metadata[File Metadata]
|
|
21
|
+
DB --> Buckets[Bucket Configuration]
|
|
22
|
+
|
|
23
|
+
S3 --> DirectUpload[Presigned URLs]
|
|
24
|
+
S3 --> SecureAccess[IAM Policies]
|
|
25
|
+
|
|
26
|
+
style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
|
|
27
|
+
style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
28
|
+
style StorageAPI fill:#166534,stroke:#22c55e,color:#dcfce7
|
|
29
|
+
style S3 fill:#ea580c,stroke:#f97316,color:#fed7aa
|
|
30
|
+
style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
|
|
31
|
+
style Metadata fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
32
|
+
style Buckets fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
33
|
+
style DirectUpload fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
34
|
+
style SecureAccess fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Core Components
|
|
38
|
+
|
|
39
|
+
| Component | Technology | Purpose |
|
|
40
|
+
|-----------|------------|---------|
|
|
41
|
+
| **Storage Backend** | AWS S3 | Enterprise-grade object storage |
|
|
42
|
+
| **Metadata Store** | PostgreSQL | File metadata, bucket configuration |
|
|
43
|
+
| **Upload Handler** | Multer | Multipart form data parsing (both backends) |
|
|
44
|
+
| **URL Strategy** | Presigned URLs | Secure direct uploads/downloads (S3 only) |
|
|
45
|
+
| **Access Control** | JWT + Bucket visibility | Public/private bucket permissions |
|
|
46
|
+
|
|
47
|
+
## AWS S3 Architecture
|
|
48
|
+
|
|
49
|
+
### Enterprise Features
|
|
50
|
+
|
|
51
|
+
- **Direct Uploads**: Presigned URLs bypass API server for unlimited scale
|
|
52
|
+
- **IAM Security**: Role-based authentication without credential management
|
|
53
|
+
- **Multi-Tenancy**: Secure isolation between projects using app key prefix
|
|
54
|
+
- **Bucket Policies**: Public and private bucket configurations
|
|
55
|
+
- **Automatic Cleanup**: Configurable lifecycle policies
|
|
56
|
+
- **Metadata Tracking**: Rich file metadata stored in PostgreSQL
|
|
57
|
+
|
|
58
|
+
## Upload Strategies
|
|
59
|
+
|
|
60
|
+
### Direct Upload to S3
|
|
61
|
+
|
|
62
|
+
```mermaid
|
|
63
|
+
sequenceDiagram
|
|
64
|
+
participant Client
|
|
65
|
+
participant API
|
|
66
|
+
participant S3
|
|
67
|
+
participant DB
|
|
68
|
+
|
|
69
|
+
Client->>API: POST/PUT with multipart/form-data
|
|
70
|
+
API->>S3: Upload file
|
|
71
|
+
S3-->>API: Success
|
|
72
|
+
API->>DB: Store metadata
|
|
73
|
+
API-->>Client: {url, key, size}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Presigned URL Upload (Recommended)
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
sequenceDiagram
|
|
80
|
+
participant Client
|
|
81
|
+
participant API
|
|
82
|
+
participant S3
|
|
83
|
+
participant DB
|
|
84
|
+
|
|
85
|
+
Client->>API: GET upload strategy
|
|
86
|
+
API->>S3: Generate presigned URL
|
|
87
|
+
S3-->>API: Presigned URL
|
|
88
|
+
API-->>Client: {uploadUrl, key}
|
|
89
|
+
Client->>S3: Direct upload
|
|
90
|
+
Client->>API: Confirm upload
|
|
91
|
+
API->>DB: Store metadata
|
|
92
|
+
API-->>Client: {url, key, size}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Bucket Configuration
|
|
96
|
+
|
|
97
|
+
### Bucket Types
|
|
98
|
+
|
|
99
|
+
| Type | Access | Use Case |
|
|
100
|
+
|------|--------|----------|
|
|
101
|
+
| **Public** | No auth required for downloads | Public assets, images, static files |
|
|
102
|
+
| **Private** | Auth required for all operations | User files, sensitive documents |
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
## File Operations
|
|
106
|
+
|
|
107
|
+
### Upload Flow
|
|
108
|
+
|
|
109
|
+
1. **Request Upload**: Client requests upload permission
|
|
110
|
+
2. **Validation**: Check auth, bucket permissions, file size
|
|
111
|
+
3. **Strategy Selection**: Choose direct or presigned upload
|
|
112
|
+
4. **Upload**: Client uploads via selected method
|
|
113
|
+
5. **Confirmation**: Verify upload and store metadata
|
|
114
|
+
6. **Response**: Return file URL and metadata
|
|
115
|
+
|
|
116
|
+
### Download Flow
|
|
117
|
+
|
|
118
|
+
1. **Request File**: Client requests file access
|
|
119
|
+
2. **Permission Check**: Verify bucket/object permissions
|
|
120
|
+
3. **Strategy Selection**: Direct serve or presigned URL
|
|
121
|
+
4. **Delivery**: Stream file or redirect to URL
|
|
122
|
+
|
|
123
|
+
## Security Features
|
|
124
|
+
|
|
125
|
+
<CardGroup cols={2}>
|
|
126
|
+
<Card title="Bucket Policies" icon="shield">
|
|
127
|
+
Public, private, or protected bucket access control
|
|
128
|
+
</Card>
|
|
129
|
+
|
|
130
|
+
<Card title="JWT Authentication" icon="key">
|
|
131
|
+
Token-based access for private resources
|
|
132
|
+
</Card>
|
|
133
|
+
|
|
134
|
+
<Card title="Presigned URLs" icon="link">
|
|
135
|
+
Time-limited URLs for secure S3 access
|
|
136
|
+
</Card>
|
|
137
|
+
|
|
138
|
+
<Card title="MIME Type Validation" icon="file-check">
|
|
139
|
+
Restrict uploads to allowed file types
|
|
140
|
+
</Card>
|
|
141
|
+
|
|
142
|
+
<Card title="Size Limits" icon="weight">
|
|
143
|
+
10MB default, configurable via MAX_FILE_SIZE
|
|
144
|
+
</Card>
|
|
145
|
+
|
|
146
|
+
<Card title="App Key Isolation" icon="key">
|
|
147
|
+
Multi-tenant isolation using app key prefix in S3
|
|
148
|
+
</Card>
|
|
149
|
+
</CardGroup>
|
|
150
|
+
|
|
151
|
+
## Intelligent Metadata Management
|
|
152
|
+
|
|
153
|
+
InsForge maintains optimized metadata in PostgreSQL for instant queries:
|
|
154
|
+
|
|
155
|
+
- **Fast Search**: Indexed metadata for sub-millisecond lookups
|
|
156
|
+
- **Rich Metadata**: MIME types, sizes, timestamps, custom tags
|
|
157
|
+
- **Usage Analytics**: Track downloads, bandwidth, popular files
|
|
158
|
+
- **Access Control**: Fine-grained permissions per file or bucket
|
|
159
|
+
|
|
160
|
+
### Secure URL Generation
|
|
161
|
+
|
|
162
|
+
| Type | Use Case | Security |
|
|
163
|
+
|------|----------|----------|
|
|
164
|
+
| **Public Access** | Static assets, images | Direct S3 URLs |
|
|
165
|
+
| **Presigned GET** | Private file access | Time-limited, single-use |
|
|
166
|
+
| **Presigned POST** | Direct uploads | Validated, size-limited |
|
|
167
|
+
|
|
168
|
+
## Performance Optimizations
|
|
169
|
+
|
|
170
|
+
### Performance Features
|
|
171
|
+
|
|
172
|
+
- **Direct S3 Access**: Bypass API server for uploads/downloads
|
|
173
|
+
- **Browser Caching**: Cache-Control headers
|
|
174
|
+
- **ETag Support**: Conditional requests for S3
|
|
175
|
+
- **Parallel Uploads**: Support for multipart uploads
|
|
176
|
+
|
|
177
|
+
### Upload Methods
|
|
178
|
+
|
|
179
|
+
**1. Direct Upload through API Server:**
|
|
180
|
+
- Client sends file to `/api/storage/buckets/{bucket}/objects`
|
|
181
|
+
- File passes through API server memory
|
|
182
|
+
- Server uploads to S3
|
|
183
|
+
- Limited by server memory (10MB default)
|
|
184
|
+
|
|
185
|
+
**2. Presigned URL Upload (Recommended):**
|
|
186
|
+
- Client requests upload URL from `/api/storage/buckets/{bucket}/upload-strategy`
|
|
187
|
+
- Server returns presigned POST URL
|
|
188
|
+
- Client uploads directly to S3 (bypasses API server)
|
|
189
|
+
- No server memory constraints
|
|
190
|
+
- Client confirms upload via `/api/storage/buckets/{bucket}/objects/{key}/confirm-upload`
|
|
191
|
+
|
|
192
|
+
## Configuration
|
|
193
|
+
|
|
194
|
+
### Environment Variables
|
|
195
|
+
|
|
196
|
+
| Variable | Description | Example |
|
|
197
|
+
|----------|-------------|---------|
|
|
198
|
+
| `AWS_S3_BUCKET` | S3 bucket name | `my-app-storage` |
|
|
199
|
+
| `AWS_REGION` | AWS region | `us-east-2` |
|
|
200
|
+
| `APP_KEY` | App key for S3 multi-tenancy | `my-app-key` |
|
|
201
|
+
|
|
202
|
+
### S3 Configuration
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
// S3 client configuration
|
|
206
|
+
const s3Client = new S3Client({
|
|
207
|
+
region: this.region, // e.g., 'us-east-2'
|
|
208
|
+
// IAM role credentials are automatically used on EC2
|
|
209
|
+
// No explicit credentials needed in production
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// File paths use app key prefix for multi-tenancy
|
|
213
|
+
const s3Key = `${this.appKey}/${bucket}/${key}`;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Best Practices
|
|
217
|
+
|
|
218
|
+
<CardGroup cols={2}>
|
|
219
|
+
<Card title="Use Buckets" icon="folder">
|
|
220
|
+
Organize files logically in buckets
|
|
221
|
+
</Card>
|
|
222
|
+
|
|
223
|
+
<Card title="Set Limits" icon="gauge">
|
|
224
|
+
Configure appropriate size/type limits
|
|
225
|
+
</Card>
|
|
226
|
+
|
|
227
|
+
<Card title="Clean URLs" icon="link">
|
|
228
|
+
Use consistent, SEO-friendly key naming
|
|
229
|
+
</Card>
|
|
230
|
+
|
|
231
|
+
<Card title="Metadata" icon="tags">
|
|
232
|
+
Store searchable metadata in database
|
|
233
|
+
</Card>
|
|
234
|
+
|
|
235
|
+
<Card title="Backup Strategy" icon="cloud-arrow-up">
|
|
236
|
+
Implement regular backups for production
|
|
237
|
+
</Card>
|
|
238
|
+
|
|
239
|
+
<Card title="Monitor Usage" icon="chart-line">
|
|
240
|
+
Track storage costs and usage patterns
|
|
241
|
+
</Card>
|
|
242
|
+
</CardGroup>
|
|
243
|
+
|