Problem
vctl service up/down manages all services as a single unit via lifecycle.start/stop. There's no way to restart an individual service (e.g., restart a crashed pipecat worker without restarting the inference server).
When a service crashes (e.g., pipecat worker dies from a GStreamer bug), the only recovery is to restart everything or manually SSH in and run the start command.
Proposed
Add per-service lifecycle commands:
vctl service restart <service-name>
vctl service logs <service-name>
This requires velocity.yml services to declare their own start/stop commands:
services:
atoms-worker:
path: ./atoms
start: $VENV/python main.py --worker-mode warm
stop: pkill -f "main.py --worker-mode"
inference:
path: ./inference
port: 8100
start: $VENV/uvicorn app.main:app --host 0.0.0.0 --port 8100 --workers 2
Currently services only declares path, port, and routes — the actual process management is embedded in the monolithic lifecycle.start shell script.
Context
- Pipecat worker crashed during audio mixing (GStreamer stack smash), leaving all subsequent calls with no available worker
- Recovery required manually SSH-ing and running the exact start command with correct paths
- atoms-platform uses turbo which manages child processes, but pipecat uses nohup background processes with no supervision
Problem
vctl service up/downmanages all services as a single unit vialifecycle.start/stop. There's no way to restart an individual service (e.g., restart a crashed pipecat worker without restarting the inference server).When a service crashes (e.g., pipecat worker dies from a GStreamer bug), the only recovery is to restart everything or manually SSH in and run the start command.
Proposed
Add per-service lifecycle commands:
This requires velocity.yml services to declare their own start/stop commands:
Currently
servicesonly declarespath,port, androutes— the actual process management is embedded in the monolithiclifecycle.startshell script.Context