feat: suporte a Docker com configuração por variável de ambiente - #17
Merged
Conversation
Extrai RADIO_NAME e URL_STREAMING do js/script.js para um config.js carregado antes dele. O script.js mantem os valores atuais como fallback, entao o player continua funcionando identico se o config.js nao existir. Prepara o terreno para o Docker, onde o config.js e gerado na subida do container a partir de variaveis de ambiente (issue #16). Co-Authored-By: Claude Opus 5 <[email protected]>
Dockerfile baseado em nginx:alpine servindo os estaticos. Um script em /docker-entrypoint.d/ gera config.js e manifest.json a partir das variaveis de ambiente na subida do container, entao trocar de radio nao exige rebuildar a imagem. - docker/nginx.conf: no-store nos arquivos gerados e no-cache no service-worker/index.html, senao mudar a env var nao surte efeito - .gitattributes: eol=lf nos arquivos do container (CRLF quebra o shebang) - LICENSE embarcada na imagem (obrigacao da AGPL para quem hospeda) Closes #16 Co-Authored-By: Claude Opus 5 <[email protected]>
Os caminhos absolutos ('/index.html', '/js/script.js') davam 404 quando o
site fica em subdiretorio, como o /RadioPlayer/ do GitHub Pages: o
cache.addAll rejeitava e a instalacao do service worker falhava inteira,
entao o PWA nunca funcionou na demo. Agora sao relativos ao proprio worker,
o que serve tanto a raiz (Docker) quanto o subdiretorio.
Outras correcoes na mesma linha:
- cache.add individual: um arquivo ausente nao derruba mais a instalacao
- config.js e manifest.json em rede-primeiro, senao trocar a variavel de
ambiente no Docker nao surtiria efeito para quem ja visitou a pagina
- requisicoes cross-origin passam direto: interceptar o stream de audio, a
API de metadados e as capas nao traz beneficio e pode atrapalhar o player
- clients.claim() para o worker novo assumir na hora
Co-Authored-By: Claude Opus 5 <[email protected]>
Workflow multi-arch (amd64 + arm64, cobrindo Raspberry Pi e NAS ARM) que builda em pull request e publica na main e em tags. O nome da imagem e passado para minusculas porque o GHCR nao aceita maiuscula e o repositorio se chama RadioPlayer. README: secao Docker com a tabela de variaveis de ambiente, e a secao de configuracao agora aponta para o config.js em vez do js/script.js. Co-Authored-By: Claude Opus 5 <[email protected]>
Achados ao rodar a imagem de verdade:
- HEALTHCHECK usava localhost, que dentro do container resolve primeiro para
::1. O nginx escuta so em IPv4 (listen [::]:80 quebra em container sem
IPv6), entao o healthcheck dava "connection refused" com o site no ar e o
container ficava unhealthy. Agora usa 127.0.0.1.
- nginx nao declarava charset: o nome da radio com acento dependia do browser
adivinhar a codificacao. Agora charset utf-8 tambem em js e json.
- expires somado a add_header Cache-Control mandava o header duplicado
("max-age=3600,public, max-age=3600"). Ficou so o expires.
Co-Authored-By: Claude Opus 5 <[email protected]>
Acrescenta o que so ficou claro rodando a imagem: tamanho real (~76 MB), healthcheck embarcado, e o aviso de por tras de proxy reverso com HTTPS (sem origem segura o browser bloqueia o convite de instalar o PWA e a Media Session API). Deixa explicito tambem que o container serve o player, nao os metadados: capa, letra e now playing continuam vindo das APIs publicas. Co-Authored-By: Claude Opus 5 <[email protected]>
✅ Deploy Preview for allstream ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #16
Adiciona suporte a Docker ao player. Como o projeto é 100% estático, o Dockerfile em si é a parte fácil — o trabalho de verdade foi tornar o player configurável sem editar arquivo-fonte, senão trocar a URL do stream exigiria rebuildar a imagem.
Como funciona
A configuração saiu do
js/script.jspara umconfig.jscarregado antes dele. No Docker, esse arquivo é gerado na subida do container a partir das variáveis de ambiente, por um script em/docker-entrypoint.d/— diretório que a imagem oficial do nginx já executa antes de subir o servidor, sem precisar sobrescrever oENTRYPOINT.Trocar a rádio é mudar a variável e reiniciar. Sem rebuild.
RADIO_NAMEJailson Web RádioURL_STREAMINGAPI_URL/FALLBACK_API_URLACCENT_COLOR/BG_COLORTHEME_COLOR#0b0e13PWA_NAME/PWA_SHORT_NAMERADIO_NAMECompatibilidade — nada quebra
O
js/script.jsmantém os valores atuais como fallback. Semconfig.js, o player roda idêntico a hoje. GitHub Pages, Vercel, Netlify e "copiar a pasta pro servidor" seguem funcionando sem nenhuma mudança.Bug do service worker que já existia
Ao mexer no cache apareceu um problema anterior a este PR: o
service-worker.jslistava caminhos absolutos (/index.html,/js/script.js). A demo fica em/RadioPlayer/, então esses caminhos davam 404, ocache.addAllrejeitava e a instalação do service worker falhava inteira — ou seja, o PWA nunca funcionou no GitHub Pages.Verificado servindo o site em subdiretório:
Corrigido junto:
cache.addindividual — um arquivo ausente não derruba mais a instalaçãoconfig.jsemanifest.jsonem rede-primeiro, senão trocar a variável de ambiente não surtiria efeito para quem já visitou a páginaTestes
Imagem buildada e executada localmente, com stream real:
manifest.jsongerado é válido e o PWA é instalávelHTTP 200 audio/mpeg,icy-name: Jailson Webradiohealthy, fallback de rota,LICENSEservidaTrês bugs foram encontrados justamente por rodar a imagem, e um deles o CI não pegaria, porque
docker buildnão executa healthcheck:unhealthycom o site no ar. OHEALTHCHECKusavalocalhost, que dentro do container resolve primeiro para::1; o nginx escuta só em IPv4 (listen [::]:80quebra em container sem IPv6) →connection refused. Passou a usar127.0.0.1.Cache-Controlduplicado —expiressomado aadd_headermandava o header duas vezes.charsetnão declarado — o nome da rádio com acento dependia do browser adivinhar a codificação.Publicação
Workflow multi-arch (
linux/amd64+linux/arm64, cobrindo Raspberry Pi e NAS ARM) que builda em pull request e publica no GHCR namaine em tags. O nome da imagem é passado para minúsculas porque o GHCR não aceita maiúscula e o repositório se chamaRadioPlayer.A
LICENSEvai embarcada na imagem: quem redistribui ou hospeda tem obrigação de AGPL.@ameer1234567890 obrigado pela sugestão — se puder testar a branch antes do merge, ajuda bastante.
🤖 Generated with Claude Code