GUI web para gerenciar server blocks do Nginx, com auto-descoberta de containers Docker via unix socket — o server block é gerado automaticamente a partir de labels no container, sem precisar editar arquivo de config na mão.
MVP: form estruturado (listen/server_name/root/locations), validação (nginx -t) e backup automático antes de aplicar, reload (nginx -s reload) só se a validação passar.
Important
Sem autenticação nesta versão. Não exponha a GUI (porta 3000) publicamente — mantenha em rede interna/confiável.
| Dashboard | Novo Proxy Host | Categorias |
|---|---|---|
![]() |
![]() |
![]() |
| Criando um Proxy Host | Criando um Redirection Host |
|---|---|
![]() |
![]() |
- Docker e Docker Compose
- Se for usar auto-discovery: containers alvo precisam estar na mesma rede Docker do
better-nginx
- Clone o repositório e entre na pasta:
git clone <repo> cd better-nginx
- Copie o
docker-compose.ymlde exemplo (já incluso no repo) e ajuste conforme seu cenário — veja Modos de operação abaixo. - Suba:
docker compose up -d --build
- Acesse a GUI em
http://localhost:3000.
Ao subir, o better-nginx:
- Verifica se já existe config em
/etc/nginx/conf.d(caso você tenha montado um volume com config existente) — se sim, mantém como está; se não, gera uma config padrão mínima e já sobe respondendo em80/443 - Escaneia containers com o label
better-nginx.enable=truee gera os server blocks correspondentes automaticamente - Continua escutando eventos do Docker (
start/die) para manter os server blocks sincronizados em tempo real
No docker-compose.yml:
- Borda (default): publica
80:80e443:443no host — obetter-nginxé o proxy que recebe tráfego direto da internet/rede local - Upstream: comente as linhas de
portsreferentes a 80/443 — o container só participa da rede Docker interna e recebe tráfego de outro proxy/load balancer na frente
Adicione estas labels no docker-compose.yml (ou docker run --label) do container que você quer expor:
services:
minha-app:
image: minha-app:latest
labels:
better-nginx.enable: "true"
better-nginx.host: "minhaapp.exemplo.com"
better-nginx.port: "3000" # porta interna que a app escuta
better-nginx.location: "/" # opcional, default "/"
networks:
- better-nginx-net # precisa estar na mesma rede do better-nginxO proxy_pass gerado aponta direto para o IP do container na rede Docker — não depende de portas publicadas no host.
Note
A GUI hoje só revalida a lista ao recarregar a página/navegar — o gif acima mostra alguns reloads automáticos pra simular isso. Ainda não há push/polling em tempo real do frontend.
Se você já tem uma config de produção e quer que o better-nginx assuma o controle dela, monte o volume no docker-compose.yml:
volumes:
- /etc/nginx/conf.d:/etc/nginx/conf.dSe o path montado já tiver arquivos .conf, o entrypoint mantém como está (não sobrescreve). Se vier vazio, gera uma config mínima padrão.
Backend:
bun install
bun run devFrontend:
cd web
bun install
bun devO Vite (web/) faz proxy de /api para http://localhost:3000 (configurado em web/vite.config.ts). Nesse modo o better-nginx precisa de um Nginx local instalado e acessível via nginx -t/nginx -s reload, e opcionalmente Docker rodando pra testar o auto-discovery.
O mount de /var/run/docker.sock equivale a acesso root no host. É montado como somente leitura (:ro) no docker-compose.yml de exemplo, mas ainda assim: mantenha o better-nginx em rede isolada e não exponha a GUI de administração publicamente.
- Autenticação
- Gestão remota via SSH
- Upstreams/load balancing avançado
- Gestão de certificados (certbot automático)
- Multi-server
- Múltiplas redes Docker simultâneas





