Como executar o Nginx Proxy Manager no Docker Container
Todos nós sabemos que o gerenciamento manual de hosts Nginx Proxy, redirecionamentos e SSL pode ser entediante. O projeto Nginx Proxy Manager começou como um projeto pessoal de Jamie Curnow com a intenção de fornecer uma maneira mais fácil de criar hosts de proxy reverso e encerrar SSL usando Nginx. O projeto possui opções avançadas opcionais para uso avançado de proxy. Abaixo estão alguns dos bons recursos do Nginx Proxy Manager.
- Suporte para gerenciamento de usuários, concessão de permissões e registro de auditoria
- Ele vem com uma interface administrativa bonita e segura baseada no Tableropen in new window
- Suporte para SSL grátis usando Let’s Encrypt ou uma opção para fornecer seus próprios certificados SSL personalizados
- Capacidade de criar domínios de encaminhamento, redirecionamentos, streams e hosts 404 sem domínio dos conceitos Nginx
- Para superusuários, há configuração avançada do Nginx disponível
- Suporte para listas de acesso e autenticação HTTP básica para hosts específicos
- Facilidade de implantação: é construído como uma imagem Docker para instalação rápida
Nas próximas seções realizamos a instalação, configurações e demonstramos o uso básico do Nginx Proxy Manager no Docker Container. Você não precisa de conhecimentos profundos de Linux para acompanhar este artigo.
Instale o Docker Engine
O Nginx Proxy Manager é empacotado como uma imagem de contêiner que pode ser executada no Docker, Podman ou qualquer mecanismo de contêiner semelhante. Para simplificar, estamos usando o Docker Engine neste artigo. Siga o artigo abaixo para realizar a instalação do Docker Container Engine.
- Como instalar o Docker Engine em sistemas Linux
Após a instalação, você pode verificar a versão do Docker.
$ docker version
Client: Docker Engine - Community
Version: 25.0.3
API version: 1.44
Go version: go1.21.6
Git commit: 4debf41
Built: Tue Feb 6 21:13:09 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 25.0.3
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: f417435
Built: Tue Feb 6 21:13:09 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Execute o Nginx Proxy Manager no Docker Container
O Nginx Proxy Manager usará as portas 80 para http, a porta 443 para tráfego https e a porta 81 para seu painel de administração. Se você tiver outro servidor web como Nginx ou Apache no mesmo host, considere desativá-lo.
Para interromper os serviços da web Nginx e Apache atuais em sistemas baseados em Debian e RHEL, use os seguintes comandos.
### Debian / Ubuntu ###
sudo systemctl disable --now nginx apache2
### RHEL based systems ###
sudo systemctl disable --now nginx httpd
Crie diretórios que conterão dados do gerenciador de proxy Nginx.
mkdir ~/nginx-proxy-manager && cd ~/nginx-proxy-manager
Docker compose é uma ferramenta de linha de comando usada para definir e executar um ou vários aplicativos contêineres a partir de definições em um único arquivo YAML chamado docker-compose.yml
. Vamos criar este arquivo
vim docker-compose.yml
Aqui temos as configurações padrão necessárias para executar o aplicativo usando o Compose. O banco de dados padrão é SQLite.
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
# Uncomment the next line if you uncomment anything in the section
# environment:
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Se você deseja usar o banco de dados MariaDB, aqui está um exemplo de como será a aparência do seu docker-compose.yml
:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
MARIADB_AUTO_UPGRADE: '1'
volumes:
- ./mysql:/var/lib/mysql
Ative o contêiner para execução executando os seguintes comandos.
docker compose up -d
Saída esperada de execução de comando.
[+] Running 2/2
✔ Network nginx-proxy-manager_default Created 0.1s
✔ Container nginx-proxy-manager-app-1 Started 0.2s
Se tudo correr bem, você verá uma saída como abaixo.
À medida que os aplicativos são iniciados, as seguintes operações acontecerão.
- As chaves GPG são geradas e salvas na pasta de dados
- O banco de dados será inicializado com estruturas de tabela
- Um usuário administrador padrão será criado – com credenciais [email /changeme
As portas de serviços mencionadas anteriormente são 80, 443 e 81.
$ ss -tunelp | egrep '80|443|81'
tcp LISTEN 0 4096 0.0.0.0:80 0.0.0.0:* users:(("docker-proxy",pid=608762,fd=4)) ino:8689062 sk:100d cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 0.0.0.0:81 0.0.0.0:* users:(("docker-proxy",pid=608740,fd=4)) ino:8689043 sk:100e cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",pid=608718,fd=4)) ino:8688177 sk:100f cgroup:/system.slice/docker.service <->
tcp LISTEN 0 4096 [::]:80 [::]:* users:(("docker-proxy",pid=608768,fd=4)) ino:8689067 sk:1010 cgroup:/system.slice/docker.service v6only:1 <->
tcp LISTEN 0 4096 [::]:81 [::]:* users:(("docker-proxy",pid=608746,fd=4)) ino:8688198 sk:1011 cgroup:/system.slice/docker.service v6only:1 <->
tcp LISTEN 0 4096 [::]:443 [::]:* users:(("docker-proxy",pid=608724,fd=4)) ino:8688181 sk:1012 cgroup:/system.slice/docker.service v6only:1 <->
Você pode acessar o Nginx Proxy Manager em http://ServerIP_or_FQDN:81
Os detalhes de login padrão são;
- E-mail: [email protegido]
- Senha: alterar-me
Edite o usuário após o login e defina os nomes e o endereço de e-mail correto.
Altere sua senha de alterarpara uma senha mais forte.
O painel terá as seguintes seções no menu de navegação.
Usando Let's Encrypt SSL (curinga)
Acho que usar SSL curinga Let’s Encrypt para todos os subdomínios é mais ideal do que gerar um certificado para cada domínio. Para criar novos certificados SSL, navegue até “Certificados SSL” e depois “Adicionar Certificado SSL”.
Para meu caso de uso, optarei por “Usar um desafio de DNS”, já que meu domínio está hospedado na Cloudflare. Insira *.domain para certificado SSL de subdomínio curinga. Você também pode adicionar o domínio primário para que o certificado tenha ambos.
Salve e aguarde a geração do certificado.
Adicionar hosts proxy
Para um serviço que você precisará expor, você deve criar um registro DNS A para um nome de domínio apontando para o endereço IP do gerenciador de proxy Nginx. Por exemplo;
grafana.computingforgeeks.com in A 192.168.20.3
Para o restante deste tutorial, usaremos computingforgeeks.com como domínio, substitua-o pelo seu nome de domínio real.
Para adicionar um novo host virtual, navegue até Hosts > Hosts proxy.
Clique em “Adicionar Host Proxy” para configurar um novo host virtual.
Preencha o formulário preenchendo os seguintes dados.
- Nomes de Domínio: Insira um ou mais nomes de domínio nos quais o serviço será acessado.
- Esquema: Define o esquema utilizado pelo Nginx para acessar o serviço, portanto não é o esquema utilizado para o proxy em si.
- Nome de host/IP de encaminhamento: configure o endereço IP ou nome de host onde o serviço de back-end está sendo executado. Pode ser um IP local ou público.
- Porta de encaminhamento: a porta de serviço usada pelo serviço de back-end.
- Bloquear explorações comuns: você pode ativar esta opção.
- Outros campos podem ser deixados com seus padrões.
Na seção SSL , você pode optar por solicitar um novo certificado SSL ou usar o existente adicionado anteriormente. Preencha as outras informações necessárias para obter o certificado SSL Let's Encrypt.
Todos os hosts proxy estão listados na seção do menu Hosts proxy. Acesse o URL de origem para testar seu serviço de proxy nginx.
Conclusão
Neste artigo, demonstramos como você pode usar o Nginx Proxy Manager para gerenciar o acesso externo frontal ou público aos serviços de back-end protegidos com certificados Let's Encrypt SSL. Este é considerado um guia de uso básico, mas configurações mais avançadas podem ser feitas. Isso serve apenas para mostrar as funcionalidades e a eficácia do gerenciador de proxy nginx.