Extensions/ComfyUI S3 Save Node
ComfyUI Extension

ComfyUI S3 Save Node

A custom ComfyUI node for saving generated images directly to Cloudflare R2 (or S3-compatible) buckets using boto3, with secure random filename generation and public URL…

By georgitsenov·Created about a year ago·Updated about a year ago· 1
georgitsenov/ComfyUI-R2
Nodes1
On cloudLocal install
Categoryimage/s3
Stars1
Updatedabout a year ago
Readme

ComfyUI S3 Save Node

A custom ComfyUI node for saving generated images directly to Cloudflare R2 (or S3-compatible) buckets using boto3, with secure random filename generation and public URL return.

Features

  • Save images to Cloudflare R2/S3 using direct boto3 uploads
  • Unique, random 20-character filename generation for each image
  • Batch processing of multiple images
  • Error handling and status reporting
  • WebP format conversion for efficient storage
  • Returns JSON with public URLs and status

Installation

  1. Copy this folder to your ComfyUI custom_nodes directory:

    cp -r comfy-s3 /path/to/ComfyUI/custom_nodes/
    
  2. Install the required dependencies:

    pip install -r requirements.txt
    
  3. Restart ComfyUI

Configuration

The node is configured via environment variables for maximum flexibility. You can set these in your shell or in a .env file (if using a loader):

CLOUDFLARE_R2_ENDPOINT_URL= # e.g. https://<account>.r2.cloudflarestorage.com
CLOUDFLARE_ACCESS_KEY_ID=
CLOUDFLARE_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_URL=https://img-dev.fantasy.ai/  # Public base URL for images
CLOUDFLARE_R2_BUCKET=fan-dev
CLOUDFLARE_R2_PREFIX=vik_tests/
  • CLOUDFLARE_R2_ENDPOINT_URL: The endpoint for your R2/S3 storage
  • CLOUDFLARE_ACCESS_KEY_ID: Your R2/S3 access key
  • CLOUDFLARE_SECRET_ACCESS_KEY: Your R2/S3 secret key
  • CLOUDFLARE_R2_URL: The public base URL for accessing images
  • CLOUDFLARE_R2_BUCKET: The bucket name
  • CLOUDFLARE_R2_PREFIX: The prefix/path inside the bucket

Usage

Node Inputs

  • images: The image tensor(s) from your ComfyUI workflow

Node Outputs

  • STRING: JSON string containing upload results with URLs and status

Example Workflow

  1. Connect your image generation node to the "images" input
  2. Run the workflow
  3. Get JSON output with public URLs

Output Format

The node returns a JSON string with the following structure:

[
  {
    "url": "https://img-dev.fantasy.ai/vik_tests/ZFUSJbDRJb2d2ikevexX.webp",
    "status": "success"
  },
  {
    "url": null,
    "status": "failed"
  }
]
  • Filenames are unique, random 20-character alphanumeric strings (e.g., ZFUSJbDRJb2d2ikevexX.webp).
  • The URL is constructed from the public base URL, prefix, and filename.

Security Notes

  • All credentials and configuration are handled via environment variables.
  • No local image saving is performed; all uploads are in-memory and direct to R2/S3.
  • Monitor upload logs for any issues.

Troubleshooting

Common Issues

  1. Import errors: Make sure all dependencies in requirements.txt are installed.
  2. Upload failures: Check your environment variables, credentials, endpoint, and bucket permissions.
  3. JSON parsing errors: Verify the output format and ensure the node ran successfully.

Debug Mode

Enable debug logging by setting the COMFYUI_DEBUG environment variable:

export COMFYUI_DEBUG=1

Node Registration

This node is registered in __init__.py using the NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS dictionaries for ComfyUI.

License

MIT License - feel free to use and modify as needed.