Overview
InsForge Storage speaks the AWS S3 protocol at/storage/v1/s3. Point
any SigV4-signing client — the aws CLI, AWS SDKs, rclone, Terraform,
custom scripts — at that endpoint with a project access key and you can
read/write the same buckets you use through the REST API and the Dashboard.
Cloud only. The S3 gateway is available on InsForge Cloud projects. Self-hosted deployments
can achieve the same capability by running the platform against a MinIO or AWS S3 bucket and
exposing
/storage/v1/s3 behind their own ingress.When to use it
- Push build artifacts from CI with
aws s3 cporrclone sync. - Migrate existing S3-based tooling without rewriting it — Terraform’s
aws_s3_object, backup scripts, log shippers, etc. all work unchanged. - Upload from servers or workers where pulling in our SDK is overkill.
Endpoint & Region
Both values are shown in the Dashboard under Storage → Settings → S3 Configuration, or fetched viaGET /api/storage/s3/config.
| Field | Value |
|---|---|
| Endpoint | https://{project-ref}.{region}.insforge.app/storage/v1/s3 |
| Region | us-east-2 (or the value set via AWS_REGION) |
forcePathStyle: true). Virtual-hosted
style ({bucket}.endpoint/...) is not supported.
Access Keys
Generate credentials from Storage → Settings → S3 Configuration → New access key in the Dashboard, or via the admin API:public/private flag. There’s a hard cap of
50 keys per project. Revoke a key with:
InvalidAccessKeyId at once.
Client Examples
AWS SDK for JavaScript v3
AWS CLI & shared credentials file
boto3 (Python)
rclone
Supported Operations
The gateway implements the operations needed by common workloads:| Category | Operations |
|---|---|
| Bucket | ListBuckets, CreateBucket, DeleteBucket, HeadBucket, ListObjectsV2 |
| Object | PutObject, GetObject (incl. Range), HeadObject, DeleteObject, DeleteObjects, CopyObject |
| Multipart | CreateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload, ListParts |
| Probe stubs | GetBucketLocation, GetBucketVersioning (for SDK startup checks) |
STREAMING-AWS4-HMAC-SHA256-PAYLOAD format and the newer
STREAMING-UNSIGNED-PAYLOAD-TRAILER /
STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER formats produced by AWS SDKs
with “default integrity protections” enabled. So aws s3 cp with large
files and aws s3 sync work without any client-side configuration
changes. Trailing CRC32 / CRC32C / CRC64NVME / SHA1 / SHA256 checksums
sent by the client are accepted but not re-verified by the gateway.
Not supported
- Presigned URLs (query-string SigV4). For browser direct uploads,
use the REST helper
POST /api/storage/buckets/:bucket/upload-strategy. - Session tokens (
X-Amz-Security-Token/ user-JWT-scoped access). The gateway only accepts the long-lived access keys described above. - S3 governance features: versioning, SSE-C / SSE-KMS, bucket policies,
ACLs, object lock, tagging, lifecycle, replication, CORS config. These
return
NotImplemented(501). - Virtual-hosted-style URLs. Path-style only.
Shared Namespace with REST
An object uploaded via the S3 gateway appears immediately in the REST API and the Dashboard — and vice versa. There’s no separate S3 bucket namespace to reconcile.Limits & Errors
| Limit | Value |
|---|---|
Single PutObject body | 5 GB (AWS S3 cap; deployment may lower via S3_PROTOCOL_MAX_OBJECT_SIZE_GB) |
| Multipart part | 5 MB min (except last), 5 GB max, parts 1–10 000 |
| Multipart object total | 5 TB |
| Access keys per project | 50 |
| Clock skew tolerance | 15 minutes |
| Access-key admin API rate limit | 20 requests / 15 min / IP |
SignatureDoesNotMatch, InvalidAccessKeyId,
RequestTimeTooSkewed, AuthorizationHeaderMalformed, NoSuchBucket,
NoSuchKey, EntityTooLarge, BucketAlreadyOwnedByYou, BucketNotEmpty.
Troubleshooting
SignatureDoesNotMatch
SignatureDoesNotMatch
Most commonly caused by one of:
- Wrong region in the client — it must match the server’s
AWS_REGION(shown in the Dashboard). - Clock skew on the client. SigV4 signatures expire after 15 minutes; check
date -umatches wall clock. - Using virtual-hosted-style URLs. Set
forcePathStyle: true(SDK) ors3.addressing_style = path(aws-cli / boto3). - A proxy that rewrites or strips headers in the
SignedHeaderslist.
InvalidAccessKeyId
InvalidAccessKeyId
The key was revoked, never existed, or was mistyped. Check the Dashboard’s access-keys list and
regenerate if needed.
NotImplemented on client startup
NotImplemented on client startup
Some SDKs probe
GetBucketVersioning / GetBucketLocation on first use; the gateway stubs these.
If you see NotImplemented it’s more likely because the backend isn’t configured with
AWS_S3_BUCKET (self-hosted without an S3-compatible backend).Large uploads hang or fail
Large uploads hang or fail
Make sure your client uses the default streaming signing
(
STREAMING-AWS4-HMAC-SHA256-PAYLOAD). A custom config forcing
UNSIGNED-PAYLOAD will buffer the entire body in memory on the
server and can hit the single-object cap.See Also
Storage Architecture
How Storage is built on top of S3-compatible backends.
TypeScript SDK
Higher-level client for app code — presigned uploads, public URLs, bucket visibility.