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.
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ço | Imagem/Build | Porta no host | Função |
|---|---|---|---|
rouxinol | Dockerfile (PHP 8.3 + Apache) | 8000 → 80 | A aplicação Laravel. |
mysql | mysql:8.0 | 3306 | Banco de dados. |
phpmyadmin | phpmyadmin/phpmyadmin | 8081 → 80 | Interface web para o MySQL. |
redis | redis:7-alpine | 6379 | Filas, cache e sessão. |
janus | docker/janus/Dockerfile | — (rede do host) | Janus, compilado a partir do código-fonte. |
freeswitch | docker/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.