Pular para o conteúdo principal

Docker

O repositório já traz um docker-compose.yml completo, subindo de uma vez a aplicação e toda a infraestrutura descrita nas próximas páginas: PHP/Apache, MySQL, Redis, Janus e FreeSWITCH. É a forma mais rápida de rodar o Rouxinol para desenvolvimento ou teste, sem instalar cada peça manualmente.

dica

Se você quer instalar cada serviço direto no servidor (sem Docker), pule para PHP e siga a sequência de páginas desta seção.

Pré-requisitos

Docker Engine e o plugin do Docker Compose:

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Saia e entre na sessão novamente para o grupo docker ter efeito, ou rode os comandos abaixo com sudo.

Serviços do docker-compose.yml

ServiçoImagem/BuildPorta no hostFunção
rouxinolDockerfile (PHP 8.3 + Apache)8000 → 80A aplicação Laravel.
mysqlmysql:8.03306Banco de dados.
phpmyadminphpmyadmin/phpmyadmin8081 → 80Interface web para o MySQL.
redisredis:7-alpine6379Filas, cache e sessão.
janusdocker/janus/Dockerfile— (rede do host)Janus, compilado a partir do código-fonte.
freeswitchdocker/freeswitch/Dockerfile— (rede do host)FreeSWITCH, para chamadas de telefonia.

Preparando o .env

cp .env.example .env

Esse mesmo arquivo cumpre dois papéis: o Docker Compose o lê para resolver variáveis como ${DB_DATABASE} dentro do docker-compose.yml, e ele também é montado dentro do container rouxinol (env_file: .env) como o .env da aplicação Laravel.

Algumas variáveis já vêm sobrescritas diretamente no docker-compose.yml para apontar para os outros containers (DB_HOST=mysql, REDIS_HOST=redis, etc.) — não é necessário repeti-las no .env.

Subindo os serviços

docker compose build
docker compose up -d

Acompanhe os logs da aplicação:

docker compose logs -f rouxinol

Rede: Janus e FreeSWITCH usam a rede do host

Os serviços janus e freeswitch rodam com network_mode: host — não entram na rede interna rouxinol como os demais. Isso é necessário para o SIP/RTP funcionar corretamente, sem NAT entre containers.

Por isso, o container rouxinol fala com o Janus pelo endereço especial host.docker.internal (mapeado via extra_hosts no compose), e não pelo nome do serviço janus:

JANUS_BASE_URL: http://host.docker.internal:8088/janus
JANUS_WS_URL: ws://host.docker.internal:8188/janus

Migrations automáticas

O entrypoint do container rouxinol roda php artisan migrate --force automaticamente quando a variável RUN_MIGRATIONS está definida como "true" (já configurado por padrão no docker-compose.yml). Ele também gera as chaves do Passport e roda os caches de config/rotas/views a cada subida.

Primeiro acesso

  • Aplicação: http://localhost:8000
  • phpMyAdmin: http://localhost:8081

Workers e listeners não sobem automaticamente

O docker-compose.yml do repositório sobe apenas o servidor web (apache2-foreground) no container rouxinol — os processos de fila e os listeners do Janus (os mesmos do Supervisor) não são iniciados por padrão:

php artisan queue:work
php artisan queue:work --queue=realtime-calls
php artisan janus:listen
php artisan janus:whatsapp-listen

Para rodá-los durante testes, use docker compose exec em um terminal separado para cada um:

docker compose exec rouxinol php artisan queue:work
docker compose exec rouxinol php artisan janus:listen

Para um ambiente mais permanente, adicione serviços extras ao docker-compose.yml reaproveitando a mesma imagem, só trocando o command:

rouxinol-queue:
build:
context: .
dockerfile: Dockerfile
command: php artisan queue:work
env_file:
- .env
environment:
DB_HOST: mysql
REDIS_HOST: redis
depends_on:
- mysql
- redis
networks:
- rouxinol

rouxinol-janus-listen:
build:
context: .
dockerfile: Dockerfile
command: php artisan janus:listen
env_file:
- .env
environment:
JANUS_BASE_URL: http://host.docker.internal:8088/janus
JANUS_WS_URL: ws://host.docker.internal:8188/janus
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- rouxinol

Repita o padrão para queue:work --queue=realtime-calls e janus:whatsapp-listen.

Comandos úteis

# Rodar comandos artisan dentro do container
docker compose exec rouxinol php artisan tinker

# Reiniciar só a aplicação (ex: depois de trocar o .env)
docker compose restart rouxinol

# Parar tudo, mantendo os dados
docker compose down

# Parar tudo e apagar os volumes (perde o banco e as gravações!)
docker compose down -v

Próximo passo

Com os serviços no ar, siga para Configuração do Rouxinol.