Esta etapa mostra como disponibilizar as imagens compiladas em um servidor HTTP simples, permitindo que sejam posteriormente baixadas para instalação nos equipamentos.
O procedimento desta página foi reproduzido em um servidor com Debian 12 (Bookworm).
Por que utilizar HTTP neste ambiente?
Na infraestrutura que originou este procedimento, alguns roteadores utilizavam wget e apresentavam problemas ao buscar as imagens por HTTPS. Por isso, foi utilizado um servidor HTTP simples para distribuir os arquivos de firmware.
O HTTP não oferece, por si só, proteção contra alterações durante o transporte. Por esse motivo, além das imagens, é importante publicar seus hashes SHA-256 e verificá-los depois do download.
Este procedimento documenta o ambiente efetivamente utilizado no projeto. Em outros cenários, especialmente quando o servidor estiver exposto à Internet, devem ser avaliados controles adicionais de acesso e segurança.
Ambiente utilizado
O procedimento foi validado com:
- Debian GNU/Linux 12 (Bookworm);
- Docker 20.10.24;
- Docker Compose 1.29.2;
- servidor HTTP executado em container;
- conteúdo publicado na porta TCP 5000.
A configuração do servidor foi realizada como root.
compila. A publicação é uma etapa separada e pode ocorrer em outro servidor.Instalando Docker e Docker Compose
Atualize os índices dos pacotes:
apt updateInstale os pacotes disponíveis no Debian 12:
apt install docker.io docker-composeConfira as versões instaladas:
docker --version
docker-compose --versionNo ambiente utilizado durante esta validação, foram obtidas as versões:
Docker version 20.10.24+dfsg1
docker-compose version 1.29.2Verifique também se o serviço está ativo:
systemctl is-active dockerO resultado esperado é:
activedocker-compose ou docker compose?
No Debian 12 utilizado nesta validação, o pacote docker-compose fornece o comando:
docker-composecom hífen.
O comando:
docker composenão estava disponível nessa instalação.
Por isso, os exemplos desta página utilizam docker-compose.
Preparando o diretório de publicação
Crie um diretório dedicado ao serviço:
mkdir -p /srv/firmware-server/web/firmwares
cd /srv/firmware-serverA estrutura inicial será:
/srv/firmware-server/
└── web/
└── firmwares/Os arquivos colocados em web/firmwares/ serão disponibilizados pelo servidor HTTP.
Criando o serviço HTTP
Crie o arquivo:
/srv/firmware-server/docker-compose.ymlcom o seguinte conteúdo:
version: "3.8"
services:
http-server:
image: ghcr.io/patrickdappollonio/docker-http-server:v2
restart: unless-stopped
ports:
- "5000:5000"
volumes:
- ./web:/html:ro
environment:
- PORT=5000
- TITLE=CoMpIlaDoR NpF 2026
- CORS=true
- BANNER=Bem vind@s ao site compilador.nupef.org.br!O volume:
./web:/html:rodisponibiliza o conteúdo de web/ dentro do container em modo somente leitura.
A porta:
5000:5000publica o servidor HTTP na porta 5000 do host.
Validando a configuração
Antes de iniciar o container, valide o arquivo:
docker-compose configConfira também o serviço reconhecido pelo Compose:
docker-compose config --servicesO resultado esperado é:
http-serverEssa verificação ajuda a identificar problemas de sintaxe ou indentação no YAML antes de iniciar o serviço.
Baixando a imagem do servidor HTTP
Baixe a imagem utilizada:
docker pull ghcr.io/patrickdappollonio/docker-http-server:v2Confira se ela está disponível:
docker images | grep -E 'patrick|http-server'Fazendo um primeiro teste
Antes de publicar um firmware, crie um arquivo simples:
echo "Teste do servidor de firmwares Nupef" \
> web/firmwares/teste.txtInicie o serviço em primeiro plano:
docker-compose upEnquanto ele estiver em execução, abra outro terminal e teste:
curl http://127.0.0.1:5000/firmwares/teste.txtO resultado esperado é:
Teste do servidor de firmwares NupefTambém é possível acessar o servidor a partir de outra máquina:
http://IP-DO-SERVIDOR:5000/e o arquivo diretamente:
http://IP-DO-SERVIDOR:5000/firmwares/teste.txtEsse acesso externo também foi validado durante a reprodução deste procedimento.
Executando o servidor em segundo plano
Depois do teste, interrompa a execução em primeiro plano com Ctrl+C.
Suba novamente o serviço em segundo plano:
docker-compose up -dConfira:
docker-compose psou:
docker psO serviço utiliza:
restart: unless-stoppedpara que o container seja reiniciado automaticamente, exceto quando tiver sido explicitamente parado.
Publicando uma imagem de firmware
Copie o arquivo .bin produzido durante a compilação para:
/srv/firmware-server/web/firmwares/Por exemplo, a partir da máquina de compilação:
scp \
CAMINHO/DO/ARQUIVO-sysupgrade.bin \
root@IP-DO-SERVIDOR:/srv/firmware-server/web/firmwares/Para equipamentos que já executam OpenWrt e serão atualizados com sysupgrade, o arquivo utilizado é normalmente o que termina em:
squashfs-sysupgrade.binA escolha entre factory e sysupgrade é explicada no tutorial de instalação.
Publicando o SHA-256
Na máquina em que está o firmware, gere o hash:
sha256sum ARQUIVO-sysupgrade.bin > eap225-outdoor-v3.sha256Publique o arquivo .sha256 junto com a imagem:
firmwares/
├── ARQUIVO-sysupgrade.bin
└── eap225-outdoor-v3.sha256Confira no servidor:
cd /srv/firmware-server/web/firmwares
cat eap225-outdoor-v3.sha256
sha256sum ARQUIVO-sysupgrade.binOs hashes devem coincidir.
Validando o download
Em outra máquina, crie um diretório temporário:
mkdir -p /tmp/teste-download-firmware
cd /tmp/teste-download-firmwareBaixe o arquivo de hash:
wget http://IP-DO-SERVIDOR:5000/firmwares/eap225-outdoor-v3.sha256Baixe a imagem:
wget http://IP-DO-SERVIDOR:5000/firmwares/ARQUIVO-sysupgrade.binConfira novamente:
sha256sum ARQUIVO-sysupgrade.binSe o arquivo .sha256 contiver exatamente o nome da imagem publicada, a verificação pode ser automatizada:
sha256sum -c eap225-outdoor-v3.sha256O resultado esperado é:
ARQUIVO-sysupgrade.bin: OKDurante a validação deste procedimento, o firmware foi publicado, baixado novamente por HTTP e teve seu SHA-256 conferido com sucesso.
Resultado
Ao final desta etapa, temos o seguinte fluxo:
imagem compilada
│
▼
arquivo .bin
│
├──── SHA-256
│
▼
servidor de publicação
Docker + HTTP :5000
│
▼
download com wget
│
▼
verificação SHA-256
│
▼
imagem pronta para instalaçãoA publicação não instala o firmware no equipamento. A etapa seguinte é transferir e instalar a imagem conforme o procedimento apropriado para o estado atual do roteador.
Para o EAP225-Outdoor v3 utilizado nesta validação, o equipamento já executava OpenWrt. A atualização foi feita posteriormente com sysupgrade, conforme descrito no tutorial de instalação.
Última atualização em 1º de setembro de 2026