Files
B2BCall-dialer/infrastructure/freeswitch/Dockerfile
Matheus 6628578c42 feat: implement Call Center queues (mod_callcenter)
- Investigated the real callcenter_config command surface via
  'help callcenter_config' on the running FreeSWITCH before writing any
  code: queues only have load/unload/reload (static XML + reload, no
  'queue add' exists), while agents and tiers are fully dynamic via ESL
  commands (agent add, tier add) -- no file involved. This shapes the next
  phase (Agents/Tiers) differently from this one.
- queues table (tenant-scoped, RLS): strategy, moh/announce, wait times,
  tier rules, discard/abandoned handling, skip-agents-with-external-calls,
  recording_enabled
- packages/telephony: buildQueueXml()
- infrastructure/freeswitch: our own callcenter.conf.xml override (empties
  the vanilla static agents/tiers -- those become fully dynamic in the next
  phase) that includes callcenter_queues.conf.d/*.xml via X-PRE-PROCESS,
  same pattern as the Sofia gateway directory
- apps/api/src/queues: CRUD (POST/GET/GET:id/DELETE) using the queues.view/
  .manage permissions already in the seed
- b2bcall-fs-config (queue-sync.ts): one XML file per queue on a shared
  volume, synced via Redis pub/sub (b2bcall:queues:sync) on create/delete
  and once at boot -- same shape as trunk-sync.ts
- confirmed manually against the real FreeSWITCH, before coding the sync
  logic: 'queue load <name>' fails ('Invalid Queue not found!') for a file
  added after boot -- needs 'reloadxml' first to repopulate the in-memory
  XML tree from disk; after that, 'queue reload <name>' alone handles both
  create and update, no need to distinguish load vs reload
- verified end-to-end: created a queue (ROUND_ROBIN, maxWaitTime=120,
  discardAbandonedAfter=90), 'callcenter_config queue list' showed the
  correct values on the FreeSWITCH side; deleted it, list went back empty

docs/QUEUES.md
2026-08-28 09:15:11 -03:00

67 lines
3.3 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1.7
#
# Imagem própria/controlada do FreeSWITCH (agente.md secao 19), usando os
# pacotes pré-compilados do SignalWire em vez de compilar da fonte — build
# de C/C++ e´ pesado demais pra VM de laboratorio (1.9GB RAM).
FROM debian:trixie-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates gnupg curl \
&& rm -rf /var/lib/apt/lists/*
# FREESWITCH_PAT só existe durante este RUN (BuildKit secret, nunca vira
# camada da imagem) e o arquivo de credenciais do apt é apagado antes do fim
# do MESMO RUN — agente.md secao 11: "a credencial nao devera permanecer na
# imagem runtime".
RUN --mount=type=secret,id=freeswitch_pat,required=true \
set -eu; \
FS_PAT="$(cat /run/secrets/freeswitch_pat)"; \
curl -fsSL -u "signalwire:${FS_PAT}" \
https://freeswitch.signalwire.com/repo/deb/debian-release/signalwire-freeswitch-repo.gpg \
-o /usr/share/keyrings/signalwire-freeswitch-repo.gpg; \
install -d -m 700 /etc/apt/auth.conf.d; \
printf 'machine freeswitch.signalwire.com\nlogin signalwire\npassword %s\n' "${FS_PAT}" \
> /etc/apt/auth.conf.d/freeswitch.conf; \
chmod 600 /etc/apt/auth.conf.d/freeswitch.conf; \
echo "deb [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ trixie main" \
> /etc/apt/sources.list.d/freeswitch.list; \
apt-get update; \
apt-get install -y --no-install-recommends \
freeswitch-meta-vanilla \
freeswitch-conf-vanilla \
freeswitch-mod-xml-curl \
freeswitch-mod-callcenter \
freeswitch-mod-avmd \
freeswitch-mod-curl; \
rm -f /etc/apt/auth.conf.d/freeswitch.conf /etc/apt/sources.list.d/freeswitch.list; \
rm -rf /var/lib/apt/lists/*
# Overrides mínimos por cima da config vanilla (agente.md secao 15: "carregar
# somente o necessário"). Directory/dialplan/sip_profiles ficam na config
# vanilla padrão por enquanto — serão substituídos por mod_xml_curl na fase
# "Extensions/Trunks/Dialplan" (ver docs/FREESWITCH.md).
COPY overrides/autoload_configs/modules.conf.xml /etc/freeswitch/autoload_configs/modules.conf.xml
COPY overrides/autoload_configs/event_socket.conf.xml /etc/freeswitch/autoload_configs/event_socket.conf.xml
COPY overrides/autoload_configs/acl.conf.xml /etc/freeswitch/autoload_configs/acl.conf.xml
COPY overrides/autoload_configs/xml_curl.conf.xml /etc/freeswitch/autoload_configs/xml_curl.conf.xml
COPY overrides/autoload_configs/callcenter.conf.xml /etc/freeswitch/autoload_configs/callcenter.conf.xml
RUN mkdir -p /etc/freeswitch/autoload_configs/callcenter_queues.conf.d
# Pino $${domain} num valor estavel em vez do IP dinamico do container
# (vars.xml vanilla usa "domain=$${local_ip_v4}", que muda a cada restart e
# nunca bateria com Tenant.telephonyDomain). Ver docs/EXTENSIONS.md.
ARG DEFAULT_SIP_DOMAIN=b2bcall.local
RUN sed -i "s/data=\"domain=\$\${local_ip_v4}\"/data=\"domain=${DEFAULT_SIP_DOMAIN}\"/" \
/etc/freeswitch/vars.xml \
&& grep -q "domain=${DEFAULT_SIP_DOMAIN}" /etc/freeswitch/vars.xml
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
EXPOSE 8021
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["/usr/bin/freeswitch", "-nonat"]