Skip to content
Merged
5 changes: 5 additions & 0 deletions docker/Dockerfile.base
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,8 @@ RUN conda config --set auto_activate_base false && \
RUN echo "conda activate comfystream" >> ~/.bashrc

WORKDIR /workspace/comfystream

# Run ComfyStream BYOC server from /workspace/ComfyUI within the comfystream conda env
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "comfystream", "--cwd", "/workspace/ComfyUI", "python", "/workspace/comfystream/server/byoc.py"]
# Default args; can be overridden/appended at runtime
CMD ["--workspace", "/workspace/ComfyUI", "--host", "0.0.0.0", "--port", "8000"]
12 changes: 6 additions & 6 deletions server/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,12 +556,12 @@ async def on_startup(app: web.Application):
app["pipeline"] = Pipeline(
width=512,
height=512,
cwd=app["workspace"],
disable_cuda_malloc=True,
gpu_only=True,
cwd=app["workspace"],
disable_cuda_malloc=True,
gpu_only=True,
preview_method='none',
comfyui_inference_log_level=app.get("comfui_inference_log_level", None),
blacklist_nodes=["ComfyUI-Manager"]
comfyui_inference_log_level=app.get("comfyui_inference_log_level", None),
blacklist_custom_nodes=["ComfyUI-Manager"],
)
app["pcs"] = set()
app["video_tracks"] = {}
Expand Down Expand Up @@ -671,6 +671,6 @@ def force_print(*args, **kwargs):
# Add ComfyStream timeout filter to suppress verbose execution logging
logging.getLogger("comfy.cmd.execution").addFilter(ComfyStreamTimeoutFilter())
if args.comfyui_inference_log_level:
app["comfui_inference_log_level"] = args.comfyui_inference_log_level
app["comfyui_inference_log_level"] = args.comfyui_inference_log_level

web.run_app(app, host=args.host, port=int(args.port), print=force_print)
44 changes: 18 additions & 26 deletions server/byoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ def main():
parser = argparse.ArgumentParser(
description="Run comfystream server in BYOC (Bring Your Own Compute) mode using pytrickle."
)
parser.add_argument("--port", default=8889, help="Set the server port")
parser.add_argument("--host", default="127.0.0.1", help="Set the host")
parser.add_argument("--port", default=8000, help="Set the server port")
parser.add_argument("--host", default="0.0.0.0", help="Set the host")
parser.add_argument(
"--workspace", default=None, required=True, help="Set Comfy workspace"
"--workspace", default=os.getcwd() + "/../ComfyUI", help="Set Comfy workspace (Default: ../ComfyUI)"
)
parser.add_argument(
"--log-level",
Expand All @@ -46,21 +46,6 @@ def main():
choices=logging._nameToLevel.keys(),
help="Set the logging level for ComfyUI inference",
)
parser.add_argument(
"--orch-url",
default=None,
help="Orchestrator URL for capability registration",
)
parser.add_argument(
"--orch-secret",
default=None,
help="Orchestrator secret for capability registration",
)
parser.add_argument(
"--capability-name",
default="comfystream",
help="Name for this capability (default: comfystream)",
)
parser.add_argument(
"--disable-frame-skip",
default=False,
Expand Down Expand Up @@ -109,6 +94,8 @@ def force_print(*args, **kwargs):
disable_cuda_malloc=True,
gpu_only=True,
preview_method='none',
blacklist_custom_nodes=["ComfyUI-Manager"],
logging_level=args.comfyui_log_level,
comfyui_inference_log_level=args.comfyui_inference_log_level
)

Expand All @@ -128,12 +115,14 @@ def force_print(*args, **kwargs):
param_updater=frame_processor.update_params,
on_stream_stop=frame_processor.on_stream_stop,
# Align processor name with capability for consistent logs
name=(args.capability_name or os.getenv("CAPABILITY_NAME") or "comfystream"),
name=(os.getenv("CAPABILITY_NAME") or "comfystream"),
port=int(args.port),
host=args.host,
frame_skip_config=frame_skip_config,
# Ensure server metadata reflects the desired capability name
capability_name=(args.capability_name or os.getenv("CAPABILITY_NAME") or "comfystream")
capability_name=(os.getenv("CAPABILITY_NAME") or "comfystream"),
#server_kwargs...
route_prefix="/",
)

# Set the stream processor reference for text data publishing
Expand All @@ -146,30 +135,33 @@ async def load_model_on_startup(app):
# Create async startup function for orchestrator registration
async def register_orchestrator_startup(app):
try:
orch_url = args.orch_url or os.getenv("ORCH_URL")
orch_secret = args.orch_secret or os.getenv("ORCH_SECRET")
orch_url = os.getenv("ORCH_URL")

if orch_url and orch_secret:
if orch_url and os.getenv("ORCH_SECRET", None):
# CAPABILITY_URL always overrides host:port from args
capability_url = os.getenv("CAPABILITY_URL") or f"http://{args.host}:{args.port}"

os.environ.update({
"CAPABILITY_NAME": args.capability_name or os.getenv("CAPABILITY_NAME") or "comfystream",
"CAPABILITY_NAME": os.getenv("CAPABILITY_NAME") or "comfystream",
"CAPABILITY_DESCRIPTION": "ComfyUI streaming processor",
"CAPABILITY_URL": capability_url,
"CAPABILITY_CAPACITY": "1",
"ORCH_URL": orch_url,
"ORCH_SECRET": orch_secret
"ORCH_SECRET": os.getenv("ORCH_SECRET", None)
})

result = await RegisterCapability.register(
logger=logger,
capability_name=args.capability_name
capability_name=os.getenv("CAPABILITY_NAME") or "comfystream"
)
if result:
logger.info(f"Registered capability: {result.geturl()}")
# Clear ORCH_SECRET from environment after use for security
os.environ.pop("ORCH_SECRET", None)
except Exception as e:
logger.error(f"Orchestrator registration failed: {e}")
# Clear ORCH_SECRET from environment even on error
os.environ.pop("ORCH_SECRET", None)

# Add model loading and registration to startup hooks
processor.server.app.on_startup.append(load_model_on_startup)
Expand Down
5 changes: 3 additions & 2 deletions server/frame_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,9 @@ async def load_model(self, **kwargs):
disable_cuda_malloc=params.get('disable_cuda_malloc', True),
gpu_only=params.get('gpu_only', True),
preview_method=params.get('preview_method', 'none'),
comfyui_inference_log_level=params.get('comfyui_inference_log_level'),
blacklist_nodes=["ComfyUI-Manager"]
comfyui_inference_log_level=params.get('comfyui_inference_log_level', "INFO"),
logging_level=params.get('comfyui_inference_log_level', "INFO"),
blacklist_custom_nodes=["ComfyUI-Manager"],
)

async def warmup(self):
Expand Down