Ino S3 Upload Folder
Sync a whole results folder to S3 — concurrent uploads plus a verification pass
- success
- message
- rel_path
- abs_path
- total_files
- uploaded_successfully
- failed_uploads
- errors
When a batch finishes, the artifacts don't usually come out one file at a time - they come out as a folder full of renders, logs, and metadata. InoS3UploadFolder pushes an entire local folder up to S3 with concurrent uploads (default 8 threads), and it's the piece that makes "run a big batch locally, archive everything to the bucket, delete the local copy" a single graph. delete_local defaults to True, so a successful run doubles as disk cleanup - which is exactly what you want on a rented cloud box where disk is billed like it's gold.
The verification option is what separates it from a naive loop. verify_with_s3 (default False) does a post-upload check against the bucket, and the outputs give you a proper accounting: how many files, how many uploaded successfully, how many failed, and the error strings. For an overnight batch, that report is your proof of what actually made it to the cloud.
How it works
Required inputs: enabled, s3_key (the destination prefix in the bucket), parent_folder, folder (the local folder to upload), and delete_local (default True). Optional: s3_config, max_concurrent (1–16, default 8), and verify_with_s3 (default False).
Outputs: success, message, rel_path/abs_path, then the report: total_files, uploaded_successfully, failed_uploads, and errors.
Credentials via s3_config JSON or the env vars (S3_ACCESS_KEY, S3_ACCESS_SECRET, S3_BUCKET_NAME, S3_ENDPOINT_URL, S3_REGION_NAME).
Installing it
Part of the 125+-node ComfyUI-InoNodes pack by nobandegani:
cd ComfyUI/custom_nodes
git clone https://github.com/nobandegani/comfyui_ino_nodes
cd comfyui_ino_nodes
pip install -r requirements.txt
Or search "ComfyUI Ino Nodes" in ComfyUI Manager, install, restart. Needs inopyutils and a current V3-schema ComfyUI.
Common issues
delete_local: True plus a verification mismatch is the nightmare scenario to think through: deletion happens on upload success, so if you flip on verify_with_s3 and it flags a discrepancy after local files are gone, you've lost your only local copy of anything that failed verification. On anything you care about, run the first upload with delete_local: False and verify_with_s3: True, check failed_uploads and errors, and only then let it clean up. Also watch the prefix semantics: s3_key should end with a trailing slash if you want a clean folder-like prefix (results/), and objects keep their relative paths under it. And note the verification is a sync check, not a byte-for-byte re-upload - files that match are simply confirmed, which is the efficient behavior you want.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | — |
| s3_key | STRING | — | |
| parent_folder | COMBO | 3 options: input, output, temp | |
| folder | STRING | — | |
| delete_local | BOOLEAN | true | — |
| s3_configopt | STRING | {"access_key_id": "", "access_key_secret": "", "bucket_name": "", "endpoint_url": "", "region_name": ""} | you can leave it empty and pass it with env vars |
| max_concurrentopt | INT | 81–16 | — |
| verify_with_s3opt | BOOLEAN | false | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| success | BOOLEAN | — |
| message | STRING | — |
| rel_path | STRING | — |
| abs_path | STRING | — |
| total_files | INT | — |
| uploaded_successfully | INT | — |
| failed_uploads | INT | — |
| errors | STRING | — |