diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 878f4c9b..a94d5460 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -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"] diff --git a/server/app.py b/server/app.py index 46f39ebb..f178d996 100644 --- a/server/app.py +++ b/server/app.py @@ -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"] = {} @@ -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) diff --git a/server/byoc.py b/server/byoc.py index 7a941815..879ac287 100644 --- a/server/byoc.py +++ b/server/byoc.py @@ -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", @@ -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, @@ -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 ) @@ -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 @@ -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) diff --git a/server/frame_processor.py b/server/frame_processor.py index 39272313..8051105a 100644 --- a/server/frame_processor.py +++ b/server/frame_processor.py @@ -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):