SHELL := /bin/bash OS := $(shell uname -s) # ====================== # Local (DEV) - python # ====================== VENV ?= .venv PY ?= $(VENV)/bin/python BOOTSTRAP_PY ?= SRC ?= app PYTHONPATH_HOST ?= $(CURDIR)/src PYTHONPATH_CONT ?= /app/src AGENT_FILE ?= $(SRC).agent_entry BRIDGE_MODULE ?= $(SRC).bridge_entry RUN_DIR ?= .run AGENT_PID_FILE ?= $(RUN_DIR)/agent.pid BRIDGE_PID_FILE ?= $(RUN_DIR)/bridge.pid AGENT_LOG_FILE ?= $(RUN_DIR)/agent.log BRIDGE_LOG_FILE ?= $(RUN_DIR)/bridge.log WS_HOST ?= 0.0.0.0 DEV_WS_PORT ?= 8000 AGENT_SERVER_PORT ?= 18081 # envs ENV_DEV ?= .env.dev ENV_PROD ?= .env.prod # ====================== # Podman (PROD) - host network # ====================== IMAGE ?= api-tia-lk:latest POD_NAME ?= api-tia-pod PROD_WS_PORT ?= 8000 EXPORT_DIR_HOST ?= /RemoteChannelsOutBound EXPORT_DIR_CONT ?= /RemoteChannelsOutBound # HuggingFace cache (turn-detector models) HF_CACHE_VOL ?= lk-hf-cache HF_HOME_CONT ?= /hf HF_HUB_CACHE_CONT ?= /hf/hub # ====================== # LiveKit (build/run) - host network # ====================== LIVEKIT_IMAGE ?= livekit/livekit-server:latest LIVEKIT_NAME ?= livekit-prod LIVEKIT_CFG ?= $(CURDIR)/livekit.yaml LIVEKIT_PORT_HTTP ?= 7880 LIVEKIT_PORT_TCP ?= 7881 .PHONY: help \ setup check-venv \ agent agent-models bridge test \ agent-up agent-down agent-status agent-logs \ bridge-up bridge-down bridge-status bridge-logs \ local-up local-down local-status local-logs local-stresstest \ docker-build docker-models docker-up docker-down docker-status docker-logs docker-logs-bridge \ livekit livekit-stop livekit-logs livekit-status livekit-config-check \ copy-logs download-call-segments download-entire-calls help: @echo "Targets (DEV local):" @echo " make setup - cria $(VENV), instala dependencias e prepara $(ENV_DEV)" @echo " make local-up - sobe livekit + bridge + agent em background" @echo " make local-down - derruba bridge + agent locais e para o livekit" @echo " make local-status - mostra status do livekit + pids locais" @echo " make local-logs - informa onde estao os logs locais" @echo " make local-stresstest - valida STT/TTS/Bridge/LiveKit reais e gera report.md" @echo " make agent - roda agent (usa $(ENV_DEV))" @echo " make agent-up - sobe agent em background" @echo " make agent-down - derruba agent local em background" @echo " make agent-logs - tail do log local do agent" @echo " make agent-models - baixa modelos locais do turn-detector (usa $(ENV_DEV))" @echo " make bridge - roda bridge (usa $(ENV_DEV)) na porta $(DEV_WS_PORT)" @echo " make bridge-up - sobe bridge em background" @echo " make bridge-down - derruba bridge local em background" @echo " make bridge-logs - tail do log local do bridge" @echo " make download-call-segments DATE=AAAA-MM-DD SESSION_ID=id [BUCKET=nome]" @echo " make download-entire-calls DATE=AAAA-MM-DD [BUCKET=nome]" @echo " make test - roda a suite pytest com PYTHONPATH=src" @echo @echo "Targets (PROD podman / host network):" @echo " make docker-build - build imagem (usa PROD por padrão)" @echo " make docker-models - baixa modelos do turn-detector no volume $(HF_CACHE_VOL)" @echo " make docker-up - sobe agent+bridge no pod (host network), bridge na porta $(PROD_WS_PORT)" @echo " make docker-logs - logs do agent" @echo " make docker-logs-bridge - logs do bridge" @echo " make docker-down - derruba pod" @echo @echo "Targets (LiveKit host network):" @echo " make livekit - sobe LiveKit (host network)" @echo " make livekit-logs - logs LiveKit" @echo " make livekit-stop - remove container LiveKit" # ====================== # DEV (local) # ====================== setup: @if [ -x "$(PY)" ]; then \ if $(PY) -c 'import sys; raise SystemExit(0 if (sys.version_info.major == 3 and 9 <= sys.version_info.minor <= 13) else 1)' >/dev/null 2>&1; then \ echo "[make] usando virtualenv existente em $(VENV)"; \ else \ echo "ERRO: $(VENV) usa uma versao de Python nao suportada por este projeto."; \ echo "Remova $(VENV) e rode 'make BOOTSTRAP_PY=python3.12 setup'."; \ exit 1; \ fi; \ else \ bootstrap_py="$(BOOTSTRAP_PY)"; \ if [ -n "$$bootstrap_py" ]; then \ if ! command -v "$$bootstrap_py" >/dev/null 2>&1; then \ echo "ERRO: interpretador '$$bootstrap_py' nao encontrado no PATH."; \ exit 1; \ fi; \ if ! "$$bootstrap_py" -c 'import sys; raise SystemExit(0 if (sys.version_info.major == 3 and 9 <= sys.version_info.minor <= 13) else 1)' >/dev/null 2>&1; then \ echo "ERRO: '$$bootstrap_py' nao eh compativel. Use Python 3.9-3.13."; \ exit 1; \ fi; \ else \ for candidate in python3.13 python3.12 python3.11 python3.10 python3.9 python3 python; do \ if command -v "$$candidate" >/dev/null 2>&1 && "$$candidate" -c 'import sys; raise SystemExit(0 if (sys.version_info.major == 3 and 9 <= sys.version_info.minor <= 13) else 1)' >/dev/null 2>&1; then \ bootstrap_py="$$candidate"; \ break; \ fi; \ done; \ fi; \ if [ -n "$$bootstrap_py" ]; then \ echo "[make] criando virtualenv com $$bootstrap_py"; \ "$$bootstrap_py" -m venv "$(VENV)"; \ elif command -v uv >/dev/null 2>&1; then \ echo "ERRO: nenhum Python compativel encontrado no PATH."; \ echo "Instale Python 3.9-3.13 ou rode 'make BOOTSTRAP_PY=python3.12 setup'."; \ exit 1; \ else \ echo "ERRO: nenhum interpretador encontrado. Instale Python 3.9-3.13 e rode 'make setup' novamente."; \ exit 1; \ fi; \ fi @$(PY) -m pip install --upgrade pip @$(PY) -m pip install -r requirements.txt @if [ ! -f "$(ENV_DEV)" ]; then \ cp .env.example "$(ENV_DEV)"; \ echo "[make] criado $(ENV_DEV) a partir de .env.example"; \ fi @echo "[make] ambiente pronto. Para rodar os testes: make test" check-venv: @if [ ! -x "$(PY)" ]; then \ echo "ERRO: virtualenv nao encontrado em $(PY). Rode 'make setup' antes."; \ exit 1; \ fi @if ! $(PY) -c 'import sys; raise SystemExit(0 if (sys.version_info.major == 3 and 9 <= sys.version_info.minor <= 13) else 1)' >/dev/null 2>&1; then \ echo "ERRO: o virtualenv em $(VENV) nao usa um Python suportado."; \ echo "Remova $(VENV) e rode 'make BOOTSTRAP_PY=python3.12 setup'."; \ exit 1; \ fi agent: check-venv @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ AGENT_SERVER_PORT="$(AGENT_SERVER_PORT)" \ STT_DUMP_DIR="$${AGENT_DIAG_STT_DUMP_DIR:-$${STT_DUMP_DIR:-}}" \ FLOW_LOG_VAD_DECISIONS="$${AGENT_DIAG_FLOW_LOG_VAD_DECISIONS:-$${FLOW_LOG_VAD_DECISIONS:-0}}" \ FLOW_LOG_VAD_ACTIVITY="$${AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY:-$${FLOW_LOG_VAD_ACTIVITY:-0}}" \ FLOW_LOG_VAD_ACTIVITY_MIN_PROB="$${AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-$${FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-0.03}}" \ PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" \ $(PY) -m $(AGENT_FILE) start --log-level info agent-models: check-venv @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ AGENT_SERVER_PORT="$(AGENT_SERVER_PORT)" PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" $(PY) -m $(AGENT_FILE) download-files bridge: check-venv @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" $(PY) -m $(BRIDGE_MODULE) --host $(WS_HOST) --port $(DEV_WS_PORT) --log-level info download-call-segments: check-venv @test -n "$(DATE)" || (echo "ERRO: informe DATE=AAAA-MM-DD"; exit 2) @test -n "$(SESSION_ID)" || (echo "ERRO: informe SESSION_ID="; exit 2) @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" \ $(PY) -m app.tools.oci_audio_download \ $(if $(BUCKET),--bucket "$(BUCKET)",) \ segments --date "$(DATE)" --session-id "$(SESSION_ID)" download-entire-calls: check-venv @test -n "$(DATE)" || (echo "ERRO: informe DATE=AAAA-MM-DD"; exit 2) @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" \ $(PY) -m app.tools.oci_audio_download \ $(if $(BUCKET),--bucket "$(BUCKET)",) \ entire-calls --date "$(DATE)" test: check-venv PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" $(PY) -m pytest agent-up: check-venv @mkdir -p "$(RUN_DIR)" @if [ -f "$(AGENT_PID_FILE)" ] && kill -0 "$$(cat "$(AGENT_PID_FILE)")" >/dev/null 2>&1; then \ echo "[make] agent ja esta rodando com pid $$(cat "$(AGENT_PID_FILE)")"; \ exit 0; \ fi @port_pids="$$(lsof -t -iTCP:$(AGENT_SERVER_PORT) -sTCP:LISTEN 2>/dev/null || true)"; \ if [ -n "$$port_pids" ]; then \ echo "ERRO: a porta $(AGENT_SERVER_PORT) ja esta em uso pelos pid(s): $$port_pids"; \ echo "Rode 'make agent-down' para limpar o worker local antigo ou finalize o processo manualmente."; \ exit 1; \ fi @nohup /bin/bash -lc 'set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; AGENT_SERVER_PORT="$(AGENT_SERVER_PORT)" STT_DUMP_DIR="$${AGENT_DIAG_STT_DUMP_DIR:-$${STT_DUMP_DIR:-}}" FLOW_LOG_VAD_DECISIONS="$${AGENT_DIAG_FLOW_LOG_VAD_DECISIONS:-$${FLOW_LOG_VAD_DECISIONS:-0}}" FLOW_LOG_VAD_ACTIVITY="$${AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY:-$${FLOW_LOG_VAD_ACTIVITY:-0}}" FLOW_LOG_VAD_ACTIVITY_MIN_PROB="$${AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-$${FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-0.03}}" PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" exec "$(PY)" -m $(AGENT_FILE) start --log-level info' >"$(AGENT_LOG_FILE)" 2>&1 & echo $$! >"$(AGENT_PID_FILE)" @sleep 1 @if kill -0 "$$(cat "$(AGENT_PID_FILE)")" >/dev/null 2>&1; then \ echo "[make] agent iniciado em background (pid $$(cat "$(AGENT_PID_FILE)"))"; \ echo "[make] log: $(AGENT_LOG_FILE)"; \ else \ echo "ERRO: agent falhou ao iniciar. Veja $(AGENT_LOG_FILE)"; \ rm -f "$(AGENT_PID_FILE)"; \ exit 1; \ fi agent-down: @if [ -f "$(AGENT_PID_FILE)" ]; then \ pid="$$(cat "$(AGENT_PID_FILE)")"; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill "$$pid" >/dev/null 2>&1 || true; \ sleep 1; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill -9 "$$pid" >/dev/null 2>&1 || true; \ echo "[make] agent encerrado com SIGKILL (pid $$pid)"; \ else \ echo "[make] agent encerrado (pid $$pid)"; \ fi; \ else \ echo "[make] agent nao estava rodando, removendo pid stale"; \ fi; \ rm -f "$(AGENT_PID_FILE)"; \ else \ echo "[make] agent nao esta rodando"; \ fi @port_pids="$$(lsof -t -iTCP:$(AGENT_SERVER_PORT) -sTCP:LISTEN 2>/dev/null || true)"; \ if [ -n "$$port_pids" ]; then \ for pid in $$port_pids; do \ kill "$$pid" >/dev/null 2>&1 || true; \ sleep 1; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill -9 "$$pid" >/dev/null 2>&1 || true; \ echo "[make] worker do agent encerrado com SIGKILL na porta $(AGENT_SERVER_PORT) (pid $$pid)"; \ else \ echo "[make] worker do agent encerrado na porta $(AGENT_SERVER_PORT) (pid $$pid)"; \ fi; \ done; \ fi agent-status: @if [ -f "$(AGENT_PID_FILE)" ] && kill -0 "$$(cat "$(AGENT_PID_FILE)")" >/dev/null 2>&1; then \ echo "agent: running (pid $$(cat "$(AGENT_PID_FILE)"))"; \ elif [ -n "$$(lsof -t -iTCP:$(AGENT_SERVER_PORT) -sTCP:LISTEN 2>/dev/null || true)" ]; then \ echo "agent: running (listener na porta $(AGENT_SERVER_PORT) sem pid file)"; \ else \ echo "agent: stopped"; \ fi agent-logs: @if [ ! -f "$(AGENT_LOG_FILE)" ]; then \ echo "ERRO: log do agent nao encontrado em $(AGENT_LOG_FILE)"; \ exit 1; \ fi @tail -f "$(AGENT_LOG_FILE)" bridge-up: check-venv @mkdir -p "$(RUN_DIR)" @if [ -f "$(BRIDGE_PID_FILE)" ] && kill -0 "$$(cat "$(BRIDGE_PID_FILE)")" >/dev/null 2>&1; then \ echo "[make] bridge ja esta rodando com pid $$(cat "$(BRIDGE_PID_FILE)")"; \ exit 0; \ fi @port_pids="$$(lsof -t -iTCP:$(DEV_WS_PORT) -sTCP:LISTEN 2>/dev/null || true)"; \ if [ -n "$$port_pids" ]; then \ echo "ERRO: a porta $(DEV_WS_PORT) ja esta em uso pelos pid(s): $$port_pids"; \ echo "Rode 'make bridge-down' para limpar o bridge local antigo ou finalize o processo manualmente."; \ exit 1; \ fi @nohup /bin/bash -lc 'set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" exec "$(PY)" -m $(BRIDGE_MODULE) --host "$(WS_HOST)" --port "$(DEV_WS_PORT)" --log-level info' >"$(BRIDGE_LOG_FILE)" 2>&1 & echo $$! >"$(BRIDGE_PID_FILE)" @sleep 1 @if kill -0 "$$(cat "$(BRIDGE_PID_FILE)")" >/dev/null 2>&1; then \ echo "[make] bridge iniciado em background (pid $$(cat "$(BRIDGE_PID_FILE)"))"; \ echo "[make] log: $(BRIDGE_LOG_FILE)"; \ else \ echo "ERRO: bridge falhou ao iniciar. Veja $(BRIDGE_LOG_FILE)"; \ rm -f "$(BRIDGE_PID_FILE)"; \ exit 1; \ fi bridge-down: @if [ -f "$(BRIDGE_PID_FILE)" ]; then \ pid="$$(cat "$(BRIDGE_PID_FILE)")"; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill "$$pid" >/dev/null 2>&1 || true; \ sleep 1; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill -9 "$$pid" >/dev/null 2>&1 || true; \ echo "[make] bridge encerrado com SIGKILL (pid $$pid)"; \ else \ echo "[make] bridge encerrado (pid $$pid)"; \ fi; \ else \ echo "[make] bridge nao estava rodando, removendo pid stale"; \ fi; \ rm -f "$(BRIDGE_PID_FILE)"; \ else \ echo "[make] bridge nao esta rodando"; \ fi @port_pids="$$(lsof -t -iTCP:$(DEV_WS_PORT) -sTCP:LISTEN 2>/dev/null || true)"; \ if [ -n "$$port_pids" ]; then \ for pid in $$port_pids; do \ kill "$$pid" >/dev/null 2>&1 || true; \ sleep 1; \ if kill -0 "$$pid" >/dev/null 2>&1; then \ kill -9 "$$pid" >/dev/null 2>&1 || true; \ echo "[make] worker do bridge encerrado com SIGKILL na porta $(DEV_WS_PORT) (pid $$pid)"; \ else \ echo "[make] worker do bridge encerrado na porta $(DEV_WS_PORT) (pid $$pid)"; \ fi; \ done; \ fi bridge-status: @if [ -f "$(BRIDGE_PID_FILE)" ] && kill -0 "$$(cat "$(BRIDGE_PID_FILE)")" >/dev/null 2>&1; then \ echo "bridge: running (pid $$(cat "$(BRIDGE_PID_FILE)"))"; \ elif [ -n "$$(lsof -t -iTCP:$(DEV_WS_PORT) -sTCP:LISTEN 2>/dev/null || true)" ]; then \ echo "bridge: running (listener na porta $(DEV_WS_PORT) sem pid file)"; \ else \ echo "bridge: stopped"; \ fi bridge-logs: @if [ ! -f "$(BRIDGE_LOG_FILE)" ]; then \ echo "ERRO: log do bridge nao encontrado em $(BRIDGE_LOG_FILE)"; \ exit 1; \ fi @tail -f "$(BRIDGE_LOG_FILE)" local-up: livekit bridge-up agent-up @echo "[make] ambiente local iniciado" @echo "[make] bridge: http://127.0.0.1:$(DEV_WS_PORT)/voice-client" @echo "[make] livekit: ws://127.0.0.1:$(LIVEKIT_PORT_HTTP)" @echo "[make] logs: $(RUN_DIR)" local-down: @$(MAKE) --no-print-directory agent-down @$(MAKE) --no-print-directory bridge-down @$(MAKE) --no-print-directory livekit-stop local-status: @$(MAKE) --no-print-directory bridge-status @$(MAKE) --no-print-directory agent-status @$(MAKE) --no-print-directory livekit-status local-logs: @echo "bridge log: $(BRIDGE_LOG_FILE)" @echo "agent log: $(AGENT_LOG_FILE)" local-stresstest: check-venv @diag_dump_dir="$${STT_DUMP_DIR:-$${STRESS_REPORT_DIR:-$(RUN_DIR)/local-stresstest}/stt_dumps}"; \ mkdir -p "$$diag_dump_dir"; \ if [ "$${STRESS_RESTART_AGENT_FOR_DIAGNOSTICS:-1}" = "1" ]; then \ $(MAKE) --no-print-directory agent-down; \ fi; \ AGENT_DIAG_STT_DUMP_DIR="$$diag_dump_dir" \ AGENT_DIAG_FLOW_LOG_VAD_DECISIONS="$${FLOW_LOG_VAD_DECISIONS:-1}" \ AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY="$${FLOW_LOG_VAD_ACTIVITY:-1}" \ AGENT_DIAG_FLOW_LOG_VAD_ACTIVITY_MIN_PROB="$${FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-0.03}" \ $(MAKE) --no-print-directory local-up @set -a; [ -f "$(ENV_DEV)" ] && source "$(ENV_DEV)"; set +a; \ STT_DUMP_DIR="$${STT_DUMP_DIR:-$${STRESS_REPORT_DIR:-$(RUN_DIR)/local-stresstest}/stt_dumps}" \ FLOW_LOG_VAD_DECISIONS="$${FLOW_LOG_VAD_DECISIONS:-1}" \ FLOW_LOG_VAD_ACTIVITY="$${FLOW_LOG_VAD_ACTIVITY:-1}" \ FLOW_LOG_VAD_ACTIVITY_MIN_PROB="$${FLOW_LOG_VAD_ACTIVITY_MIN_PROB:-0.03}" \ STRESS_ENV_FILE="$(ENV_DEV)" \ STRESS_BRIDGE_URL="$${STRESS_BRIDGE_URL:-ws://127.0.0.1:$(DEV_WS_PORT)/ws/agent}" \ STRESS_BRIDGE_HEALTH_URL="$${STRESS_BRIDGE_HEALTH_URL:-http://127.0.0.1:$(DEV_WS_PORT)/health}" \ STRESS_AGENT_HEALTH_URL="$${STRESS_AGENT_HEALTH_URL:-http://127.0.0.1:$(AGENT_SERVER_PORT)/}" \ PYTHONPATH="$(PYTHONPATH_HOST):$$PYTHONPATH" \ $(PY) -m app.tools.local_stresstest # ====================== # PROD (podman): build + models + up # ====================== docker-build: # build sempre mirando PROD (env file usado no run) e bridge exposto em 8000 podman build --no-cache -t $(IMAGE) . docker-models: docker-build @podman volume create $(HF_CACHE_VOL) >/dev/null 2>&1 || true @echo "[make] downloading turn-detector models into volume $(HF_CACHE_VOL)..." podman run --rm --network host \ --env-file $(ENV_PROD) \ -v $(HF_CACHE_VOL):$(HF_HOME_CONT):Z \ -e HF_HOME=$(HF_HOME_CONT) \ -e HF_HUB_CACHE=$(HF_HUB_CACHE_CONT) \ -e PYTHONPATH=$(PYTHONPATH_CONT) \ $(IMAGE) \ python -m $(AGENT_FILE) download-files docker-up: docker-build docker-models @podman pod rm -f $(POD_NAME) >/dev/null 2>&1 || true podman pod create --name $(POD_NAME) --network host # AGENT (PROD) - host network podman run -d --replace --name $(POD_NAME)-agent --pod $(POD_NAME) \ --env-file $(ENV_PROD) \ -v $(EXPORT_DIR_HOST):$(EXPORT_DIR_CONT):Z \ -v $(HF_CACHE_VOL):$(HF_HOME_CONT):Z \ -e EXPORT_DIR=$(EXPORT_DIR_CONT) \ -e HF_HOME=$(HF_HOME_CONT) \ -e HF_HUB_CACHE=$(HF_HUB_CACHE_CONT) \ -e LIVEKIT_URL=ws://127.0.0.1:$(LIVEKIT_PORT_HTTP) \ -e PYTHONPATH=$(PYTHONPATH_CONT) \ $(IMAGE) \ python -m $(AGENT_FILE) start --log-level info # BRIDGE (PROD) - expõe na porta 8000 (host) podman run -d --replace --name $(POD_NAME)-bridge --pod $(POD_NAME) \ --env-file $(ENV_PROD) \ -v $(HF_CACHE_VOL):$(HF_HOME_CONT):Z \ -e HF_HOME=$(HF_HOME_CONT) \ -e HF_HUB_CACHE=$(HF_HUB_CACHE_CONT) \ -e WS_HOST=0.0.0.0 \ -e WS_PORT=$(PROD_WS_PORT) \ -e PYTHONPATH=$(PYTHONPATH_CONT) \ $(IMAGE) \ python -m $(BRIDGE_MODULE) --host 0.0.0.0 --port $(PROD_WS_PORT) --log-level info docker-down: @podman pod rm -f $(POD_NAME) >/dev/null 2>&1 || true docker-status: @podman pod ps --filter "name=$(POD_NAME)" || true @podman ps --filter "name=$(POD_NAME)-" || true docker-logs: @podman logs -f $(POD_NAME)-agent docker-logs-bridge: @podman logs -f $(POD_NAME)-bridge # ====================== # LiveKit (host network) # ====================== livekit-stop: @podman rm -f $(LIVEKIT_NAME) >/dev/null 2>&1 || true livekit-config-check: @test -f "$(LIVEKIT_CFG)" || (echo "ERRO: arquivo $(LIVEKIT_CFG) nao existe"; exit 1) livekit: livekit-stop livekit-config-check ifeq ($(OS),Darwin) podman run -d --name $(LIVEKIT_NAME) \ -p $(LIVEKIT_PORT_HTTP):7880 \ -p $(LIVEKIT_PORT_TCP):7881 \ -v "$(LIVEKIT_CFG):/etc/livekit.yaml:ro" \ $(LIVEKIT_IMAGE) \ --config /etc/livekit.yaml @echo "LiveKit subiu (macOS/Podman: portas publicadas)." @echo "Signal URL: ws://127.0.0.1:$(LIVEKIT_PORT_HTTP)" @echo "RTC TCP URL: 127.0.0.1:$(LIVEKIT_PORT_TCP)" else podman run -d --name $(LIVEKIT_NAME) \ --network host \ -v "$(LIVEKIT_CFG):/etc/livekit.yaml:ro" \ $(LIVEKIT_IMAGE) \ --config /etc/livekit.yaml @echo "LiveKit subiu (host network)." @echo "Signal URL: ws://127.0.0.1:$(LIVEKIT_PORT_HTTP)" endif livekit-logs: podman logs -f $(LIVEKIT_NAME) livekit-status: @podman ps --filter "name=$(LIVEKIT_NAME)" CONTAINER=api-tia-pod-agent SHELL_IN=sh BACKUP_DIR=backup_logs DATE=$(shell date +%Y%m%d_%H%M%S) copy-logs: @DEST="backup_logs_$$(date +%Y%m%d_%H%M%S)" && \ mkdir -p "$$DEST" && \ podman cp api-tia-pod-agent:/app/logs "$$DEST/logs" || true && \ podman cp api-tia-pod-agent:/app/timeline "$$DEST/timeline" || true && \ podman cp api-tia-pod-agent:/app/log_agent "$$DEST/log_agent" || true && \ echo "Copiado para $$DEST"