Ino S3 Upload Video
Get videos off the local disk and into object storage, without leaving the graph
- video
- video
- success
- message
- file_name
- s3_video_path
If you run ComfyUI on a rented box or inside an automated pipeline, you know the drill: generation finishes, and now you have to get the result somewhere durable before the instance vanishes. Ino S3 Upload Video is the "ship it to object storage" step for video. It takes whatever VIDEO tensor is on the wire, renders it to a file, and uploads that file to S3 - or to anything that speaks the S3 API, like MinIO, Cloudflare R2, or Backblaze B2. No local disk juggling, no shell scripts, no downloading the file and re-uploading it yourself.
Running ComfyUI with an S3 bucket as your output sink is a real niche, not a hypothetical - people building agent-style pipelines and headless servers keep coming back to it. This node is that pattern, packaged as a terminal node you wire the end of a video workflow into.
How it works
The mechanism matters here, because there's more going on than a dumb upload. The node first saves the incoming video to ComfyUI's temp directory (under temp/s3_upload_video/) using FFmpeg, with a video_format choice of mp4 or auto and a video_codec choice of h264 or auto. It then uploads that local file to {s3_path_key}/{filename} on your bucket. Two details are worth knowing:
- Unique filenames by default. With
unique_file_nameon (the default), the local file and the S3 key use a timestamp-based name, so re-runs never collide. Flip it off and it uses whatever you put infilenameinstead. delete_localdefaults to true. After a successful upload, the temp file is removed. If you want a local copy, turn that off first - the node does not keep one otherwise.
The inputs you actually set: video (the VIDEO you're uploading), s3_path_key (the folder/prefix in the bucket, like renders/mydemo), and s3_config. That last one is where people get confused. It's a JSON blob of credentials - access_key_id, access_key_secret, bucket_name, endpoint_url, region_name - but the tooltip says it plainly: you can leave it empty and pass everything with environment variables instead. Set S3_ACCESS_KEY, S3_ACCESS_SECRET, S3_BUCKET_NAME (plus S3_ENDPOINT_URL and S3_REGION_NAME for anything that isn't AWS proper) in the environment ComfyUI runs under, and the node picks them up. Env vars override the JSON when both are set.
The outputs are the pack's standard upload report: success (bool), message, file_name, and s3_video_path (the full key, handy for feeding a presigned-URL node or logging). It also passes the original video through, so you can chain a local save or a preview after it.
Installing Ino Nodes
Install once for the whole pack. ComfyUI Manager is easiest - search for "ComfyUI Ino Nodes" and install, then restart. Terminal route:
cd ComfyUI/custom_nodes
git clone https://github.com/nobandegani/ComfyUI-InoNodes.git
cd comfyui_ino_nodes
pip install -r requirements.txt
This is a V3-schema pack with a dependency (inopyutils, pinned in requirements.txt) that must land in the same Python environment ComfyUI runs in - the classic custom-node trip-up. No model files are involved.
Where people get burned
Mostly credentials. A blank or malformed s3_config returns a "missing access_key_id" failure, and if you're on a non-AWS endpoint and forget S3_ENDPOINT_URL, nothing will connect. The other trap is s3_path_key - it's the prefix, not the full path, and the node appends the filename itself. Think folder, not file.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | — |
| video | VIDEO | — | |
| s3_path_key | STRING | — | |
| 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 |
| video_formatopt | COMBO | 2 options: mp4, auto | |
| video_codecopt | COMBO | 2 options: h264, auto | |
| unique_file_nameopt | BOOLEAN | true | — |
| filenameopt | STRING | — | |
| delete_localopt | BOOLEAN | true | Delete the locally saved video after a successful S3 upload. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| success | BOOLEAN | — |
| message | STRING | — |
| file_name | STRING | — |
| s3_video_path | STRING | — |