Docker local com GLPI, Portainer, Traefik e SSL autoassinado

Docker local com GLPI

Seja bem-vindo a um guia detalhado sobre como configurar serviços Docker local com TLS/SSL, aproveitando um proxy reverso HTTPS por meio do Traefik. A falta de tutoriais abrangentes nessa área é um desafio comum, e é por isso que este tutorial foi criado após horas de pesquisa e aplicado com sucesso em um projeto real. Vamos começar!

Existem duas abordagens para seguir este guia. Você pode optar por clonar meu repositório GitHub que contém configurações pré-definidas para os contêineres Traefik, GLPI e Portainer. A segunda opção é realizar a configuração manualmente. Esta última opção oferece uma compreensão mais profunda de todo o processo, permitindo que você crie seu próprio projeto no futuro.

Neste tutorial, você aprenderá como configurar um ambiente local Docker com as seguintes ferramentas:

  • GLPI: Um sistema de gerenciamento de ativos de código aberto.
  • Portainer: Uma interface de gerenciamento de contêineres Docker.
  • Traefik: Um proxy reverso com suporte a SSL para roteamento de tráfego.

A configuração incluirá a utilização de certificados SSL autoassinados para proteger as conexões HTTPS.

Requisitos

  • Um servidor Ubuntu 22.
  • Acesso ao servidor como superusuário ou com privilégios sudo.

Passo 1: Instalando o Docker

Atualizando a lista de pacotes e Instalando dependências

sudo su -
cd /
sudo apt update
sudo apt upgrade -y
sudo add-apt-repository http://us.archive.ubuntu.com/ubuntu jammy-updates multiverse
sudo add-apt-repository http://us.archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse
sudo apt install -y lsb-release apt-transport-https ca-certificates curl gnupg software-properties-common -y
sudo install -m 0755 -d /etc/apt/keyrings

Adicionando a chave GPG oficial do Docker

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Adicionando o repositório Docker

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Instalando o Docker e habilitando para ser iniciado no boot

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

Passo 2: Instalando o Docker Compose

Vamos agora instalar o Docker Compose para facilitar a criação e gerenciamento de múltiplos contêineres.

Download e Permissões de Execução do Docker Compose

sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Verificando a versão do Docker Compose

sudo docker-compose --version

Passo 3: Criar uma Rede para os Contêineres

Crie uma rede para permitir a comunicação entre os contêineres. Isso facilitará a comunicação entre o Traefik, o GLPI e o portainer:

Crie uma rede docker chamada proxy(o nome da rede pode ser qualquer, basta mantê-lo para todos os serviços). Esta rede será comum (externa) para todos os serviços e aplicações que são proxy do Traefik:

sudo docker network create proxy

Passo 4: Gerar Certificados SSL Autoassinados

Agora, crie certificados SSL autoassinados para cada domínio que você deseja configurar (glpi.localhost.local, port.localhost.local, traefik.localhost.local):

bash

Crie um diretório para os certificados SSL

sudo mkdir -p ~/Traefik/ssl_certificates
cd ~/Traefik/ssl_certificates

Gere os certificados autoassinados para cada domínio

Agora, crie certificados SSL autoassinados para cada sub-domínio que você deseja configurar (glpi.localhost.local, portainer.localhost.local, traefik.localhost.local):

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -keyout glpi.localhost.local.key -out glpi.localhost.local.crt
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -keyout portainer.localhost.local.key -out portainer.localhost.local.crt
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -keyout traefik.localhost.local.key -out traefik.localhost.local.crt
# Siga as instruções interativas e configure os certificados para cada domínio.

Siga as instruções interativas e configure os certificados para cada domínio. No ultimo campo coloque o nome do seu sub-dominio EX: glpi.localhost.local

Adicione certificados gerados e caminhos de chave ao arquivo de configuração

mkdir -p ~/Traefik/conf
cd ~/Traefik/conf
sudo nano tls_certificates.yml

Adicione e edite tls_certificates.yml na pasta conf

tls:
  certificates:
    - certFile: "/etc/traefik/certs/traefik.localhost.local.crt"
      keyFile: "/etc/traefik/certs/traefik.localhost.local.key"
    - certFile: "/etc/traefik/certs/glpi.localhost.local.crt"
      keyFile: "/etc/traefik/certs/glpi.localhost.local.key"
    - certFile: "/etc/traefik/certs/portainer.localhost.local.crt"
      keyFile: "/etc/traefik/certs/portainer.localhost.local.key"
  • Se você usou o domínio ‘glpi.localhost.local’ para certificados autoassinados, não precisa fazer nada, porque esses caminhos já estão no arquivo. Se você usou outro nome de domínio, será necessário alterá-lo pelo nome de cada sub domínio no arquivo )
  • Use um DNS ou adicione o nome de domínio do ( glpi.localhost.local) ao arquivo hosts (use o IP do localhost)
  • Abra o arquivo /etc/hosts com o editor de texto preferido e adicione o nome de cada sub-dominio ao ip do servidor ubuntu:
  • sudo nano /etc/hosts


Passo 5: Configurar o Traefik

Crie um diretório para as configurações do Traefik e crie um arquivo static_conf.yml nele:

cd ~/Traefik
sudo nano static_conf.yml

Adicione o seguinte conteúdo ao arquivo static_conf.yml:

# configure logs
log:
  level: ERROR # Defina como 'DEBUG' para solução de problemas

# configure entry points
entryPoints:
  web:
    address: ":80"
    http:
      redirections: # redirecionamento http para https
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

# configure providers
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock" # conexão com o daemon docker
    exposedByDefault: false # ignore recipientes sem rótulo 'traefik.enable=true'
  file:
    directory: "/etc/traefik/conf" # diretório para arquivos de configuração dinâmica do traefik
    watch: true # as alterações são processadas imediatamente

# configurar serviço de API
api:
  dashboard: true # ativar o painel do traefik


Passo 6: Configurar os Containers

Configurando o Traefik

Crie um arquivo docker-compose-traefik.yml para configurar o Traefik com as configurações acima:

cd ~/Traefik
nano docker-compose-traefik.yml

Cole o seguinte conteúdo no arquivo:

version: "3.8"
services:
  traefik:
    networks:
      - proxy
    image: traefik:v2.5.4
    container_name: "local_traefik"
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro # conexão com o daemon do docker para ouvir eventos do docker       
      - ./ssl_certificates/:/etc/traefik/certs/:ro # Certificados SSL
      - ./static_conf.yml:/traefik.yml:ro # configuração estática do traefik
      - ./conf/:/etc/traefik/conf/:ro # configuração dinâmica do traefik
    labels:
      - traefik.enable=true # se for true, o serviço será publicado no traefik
      - traefik.http.routers.traefik.entrypoints=websecure # definindo o ponto de entrada, que será utilizado pelo serviço
      - traefik.http.routers.traefik.rule=Host(`traefik.localhost.local`) # a regra pela qual a solicitação será encaminhada pelo traefik
      - traefik.http.routers.traefik.tls=true # habilitando tls para o roteador
      - traefik.http.routers.traefik.service=api@internal # especificando um serviço para o roteador
      # - traefik.http.services.traefik-traefik.loadbalancer.server.port=8000 # especificando a porta para a qual a solicitação será roteada (no serviço de destino)

networks:
  proxy:
    external: true

Configurando o MariaDB

Crie um arquivo docker-compose-mariadb.yml para configurar o MariaDB:

sudo mkdir ~/mariadb_glpi
cd ~/mariadb_glpi
sudo nano docker-compose-mariadb.yml

Cole o seguinte conteúdo no arquivo docker-compose-mariadb.yml:

version: "3.8"
services:
 mariadb:
    image: mariadb:10.7
    container_name: mariadb_glpi
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=glpidb
      - MYSQL_USER=glpiuser
      - MYSQL_PASSWORD=123456
    volumes:
      - /var/lib/mysql:/var/lib/mysql
    networks:
      - proxy
    restart: always

networks:
  proxy:
    external: true

Configurando o GLPI

Crie um arquivo docker-compose-glpi.yml para configurar o GLPI:

sudo mkdir -p ~/GLPI/glpi_data
cd ~/GLPI
sudo nano docker-compose-glpi.yml

Cole o seguinte conteúdo no arquivo docker-compose-glpi.yml:

version: "3.8"
services:
  glpi:
    image: "jonas556440/glpi"
    container_name: "glpi"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=glpidb
      - MYSQL_USER=glpiuser
      - MYSQL_PASSWORD=123456
    volumes:
      - ./glpi_data:/var/www/html/glpi
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.glpi.rule=Host(`glpi.localhost.local`)
      - traefik.http.routers.glpi.tls=true
      - traefik.http.routers.glpi.entrypoints=websecure # definindo o ponto de entrada, que será utilizado pelo serviço
      - traefik.http.routers.glpi.service=glpi # especificando um serviço para a rota
      - traefik.http.services.glpi.loadbalancer.server.port=80 # especificando a porta para a qual a solicitação será roteada (no serviço de destino)
    restart: always

networks:
  proxy:
    external: true

Configurando o Portainer

Crie um arquivo docker-compose-portainer.yml para configurar o Portainer:

sudo mkdir -p ~/Portainer/port_data
cd ~/Portainer
sudo nano docker-compose-portainer.yml

Cole o seguinte conteúdo no arquivo docker-compose-portainer.yml:

version: "3.8"
services:
  portainer:
    image: "portainer/portainer"
    container_name: "portainer"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./port_data:/data
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.portainer.rule=Host(`portainer.localhost.local`)
      - traefik.http.routers.portainer.tls=true
      - traefik.http.routers.portainer.entrypoints=websecure # definindo o ponto de entrada, que será utilizado pelo serviço
      - traefik.http.routers.portainer.service=portainer # especificando um serviço para a rota
      - traefik.http.services.portainer.loadbalancer.server.port=9000 # especificando a porta para a qual a solicitação será roteada (no serviço de destino)
    restart: always

networks:
  proxy:
    external: true

Passo 7: Iniciando os Containers

Para iniciar os containers, use o seguinte comando:

cd ~/
docker-compose -f ~/Traefik/docker-compose-traefik.yml up -d
docker-compose -f ~/mariadb_glpi/docker-compose-mariadb.yml up -d
docker-compose -f ~/GLPI/docker-compose-glpi.yml up -d
docker-compose -f ~/Portainer/docker-compose-portainer.yml up -d

Passo 8: Aponte os dominios para o IP do servidor

Certifique-se de que os domínios que você usará com seus certificados SSL autoassinados sejam direcionados para o IP do servidor onde o Docker e seus contêineres estão sendo executados. Isso pode ser feito de duas maneiras:

Opção 1: Usando um Servidor de DNS Interno

Você pode configurar um servidor DNS interno em sua rede para resolver os nomes de domínio (glpi.localhost.local, port.localhost.local, traefik.localhost.local) para o IP do servidor onde o Docker está sendo executado.

Opção 2: Editando o Arquivo /etc/hosts

Outra maneira é adicionar manualmente os mapeamentos de IP e domínio ao arquivo /etc/hosts do servidor. Você pode fazer isso com o seguinte comando:

sudo nano /etc/hosts

Dentro do arquivo, adicione linhas semelhantes a esta para cada domínio que você deseja configurar:

IP_DO_SERVIDOR  glpi.localhost.local
IP_DO_SERVIDOR  port.localhost.local
IP_DO_SERVIDOR  traefik.localhost.local

Lembre-se de substituir IP_DO_SERVIDOR pelo endereço IP real do seu servidor onde o Docker está em execução.

Passo 8: Acessando as Aplicações

Agora, você pode acessar as seguintes aplicações:

Você verá avisos de segurança devido ao uso de certificados autoassinados. Você pode aceitar esses avisos para continuar.

Lembre-se de que os certificados autoassinados não são confiáveis para uso público, mas são úteis em ambientes internos para criptografar a comunicação. Certifique-se de que todos os dispositivos que se conectam às aplicações tenham o certificado raiz correspondente instalado como confiável para evitar avisos de segurança.

Este tutorial abordou a configuração de um ambiente Docker local com Traefik para SSL e o uso de GLPI e Portainer como exemplos de aplicativos. Você pode personalizar esse ambiente conforme necessário para suas próprias necessidades.

Espero que este tutorial seja útil para você e que você possa configurar seu ambiente Docker com Traefik com sucesso. Certifique-se de personalizar as senhas e ajustar as configurações conforme necessário.