Nodes/ComfyUI Ino Nodes/Ino S3 Upload Video
ComfyUI Node

Ino S3 Upload Video

Get videos off the local disk and into object storage, without leaving the graph

By nobandegani·Created about a year ago·Updated 2 months ago· 6
Ino S3 Upload Video
  • video
  • video
  • success
  • message
  • file_name
  • s3_video_path
enabledtrue
s3_path_key
s3_config{"access_key_id": "", "access_key_secret": "", "bucket_name": "", "endpoint_url": "", "region_name": ""}
video_format
video_codec
unique_file_nametrue
filename
delete_localtrue

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_name on (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 in filename instead.
  • delete_local defaults 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.

CategoryInoS3Helper

Inputs (9)

NameTypeDefaultDescription
enabledBOOLEANtrue
videoVIDEO
s3_path_keySTRING
s3_configoptSTRING{"access_key_id": "", "access_key_secret": "", "bucket_name": "", "endpoint_url": "", "region_name": ""}you can leave it empty and pass it with env vars
video_formatoptCOMBO2 options: mp4, auto
video_codecoptCOMBO2 options: h264, auto
unique_file_nameoptBOOLEANtrue
filenameoptSTRING
delete_localoptBOOLEANtrueDelete the locally saved video after a successful S3 upload.

Outputs (5)

NameTypeDescription
videoVIDEO
successBOOLEAN
messageSTRING
file_nameSTRING
s3_video_pathSTRING