refactor(A2): replace blender-renderer HTTP service with render-worker Celery container
- Create render-worker/ with Dockerfile (Ubuntu + cadquery + Blender via host mount) - Add render-worker/check_version.py: verifies Blender >= 5.0.1 at startup, Exit 1 on failure - Add render-worker/scripts/: blender_render.py, still_render.py, turntable_render.py - Create backend/app/services/render_blender.py: direct subprocess rendering - convert_step_to_stl() and export_per_part_stls() using cadquery - render_still(): STEP → STL → PNG via Blender subprocess - is_blender_available(): detects BLENDER_BIN env for render-worker context - Create backend/app/domains/rendering/tasks.py: render_still_task + render_turntable_task - Update step_processor.py: use subprocess path when BLENDER_BIN env is set (render-worker) - Update step_tasks.py: generate_stl_cache uses direct cadquery instead of HTTP - Remove blender-renderer and threejs-renderer from docker-compose.yml - Replace worker-thumbnail with render-worker (Ubuntu + cadquery + Blender mount) - Remove Docker SDK from backend Dockerfile (was only for flamenco scaling) - Update .env.example: BLENDER_VERSION=5.0.1 documented - Update celery_app.py: include domains.rendering.tasks in autodiscover Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -359,24 +359,20 @@ async def generate_missing_stls(
|
||||
async def renderer_status(
|
||||
admin: User = Depends(require_admin),
|
||||
):
|
||||
"""Check health of external renderer services."""
|
||||
import httpx
|
||||
services = {
|
||||
"pillow": {"url": None, "available": True, "note": "Built-in (always available)"},
|
||||
"blender": {"url": "http://blender-renderer:8100/health", "available": False, "note": ""},
|
||||
"""Check health of renderer services."""
|
||||
from app.services.render_blender import find_blender, is_blender_available
|
||||
blender_available = is_blender_available()
|
||||
blender_bin = find_blender()
|
||||
return {
|
||||
"pillow": {"available": True, "note": "Built-in (always available)"},
|
||||
"blender": {
|
||||
"available": blender_available,
|
||||
"note": (
|
||||
f"render-worker subprocess ({blender_bin})"
|
||||
if blender_available
|
||||
else "Blender not found — check render-worker container and BLENDER_BIN"
|
||||
),
|
||||
},
|
||||
}
|
||||
async with httpx.AsyncClient(timeout=3.0) as client:
|
||||
for name, info in services.items():
|
||||
if info["url"] is None:
|
||||
continue
|
||||
try:
|
||||
resp = await client.get(info["url"])
|
||||
if resp.status_code == 200:
|
||||
data = resp.json()
|
||||
services[name]["available"] = True
|
||||
services[name]["note"] = data.get("renderer", name)
|
||||
except Exception as e:
|
||||
services[name]["note"] = str(e)[:100]
|
||||
return services
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user