Servidor Cosy VPS para pequenos projetos: como configurar



Sempre quis ter um espaço pessoal na web. Um lugar onde tudo seria organizado da forma mais conveniente para mim. Eu vi a melhor solução como um VPS barato que eu poderia equipar de acordo com minhas necessidades. Por muito tempo não consegui abordar a solução desse problema, mas de alguma forma um conjunto de ferramentas surgiu imperceptivelmente que me permitiu organizar o ambiente de software que eu queria. 



Se você também deseja criar seu próprio espaço pessoal na rede, mas não sabe por onde começar, ou está simplesmente interessado em produtos de software maravilhosos como Docker, Portainer, Traefik - bem-vindo em cat.



Introdução



Para ser honesto, eu realmente não gosto da linha de comando. Ou seja, gosto da própria ideia de uma interface leve, minimalista e universal que quase não requer recursos, mas uma janela preta com um cursor piscando me deixa frustrado e desamparado. E eu até sei de onde tirei isso. 



Quando eu estudava no instituto (é a época em que surgiu a Internet com cartões e o primeiro cibercafé na minha cidade), meu amigo, que naquela época havia conseguido um emprego de auxiliar de laboratório no Departamento de A Ciência da Computação tentou ativamente me conectar ao Linux. E aqui estou eu, considerando-me um cientista da computação avançado, tendo experiência, provavelmente, centenas de instalações do Windows, volto para casa após a formatura e com um movimento confiante insiro o disco com o kit de distribuição do Linux no drive ... E daí? E nada. 



Por muitos anos não me lembro de todos os detalhes, provavelmente até consegui estabelecer, mas então houve uma falha - eu simplesmente não sabia o que fazer. A maneira usual que funcionava no Windows - vasculhar o painel de controle aleatoriamente, incluindo configurações diferentes até que tudo funcione (ou quebre completamente, mas então foi possível reinstalar o Windows e começar tudo de novo) não funcionou aqui. Tudo o que eu tinha era um console que rejeitava minhas tentativas de ajustar as coisas continuamente. Lembro que até tinha um livro sobre Linux, que também não ajudava em nada - os comandos que eram dados lá, por algum motivo, por algum motivo não funcionavam. Em geral, depois de sofrer por vários dias, decidi por mim mesmo que Linux é uma espécie de besteira, e com alívio voltei ao meu Windows de costume. 



Também houve tentativas de dominar o Linux, a vida uma e outra vez me trouxe junto com seus fãs, que tentaram me arrastar para seu acampamento, eu até tentei de alguma forma colocar um ghent (sem sucesso, é claro, embora eu tivesse uma impressão com um guia passo a passo sobre como fazê-lo), mas a maldição do console pairava sobre mim, e a cada falha aquele mesmo sentimento de impotência ficava mais forte. Depois da interface gráfica do Windows, onde todas as configurações estão à sua frente, colidindo com o console, me senti cego, tentando encontrar meu caminho pelo toque em um lugar desconhecido. Então, por muito tempo eu apoiei a pilha de tecnologia da Microsoft, programando em .net usando VisualStudio (é lindo, e sem console). Por favor, não julgue estritamente, talvez se naquela época eu tive a oportunidade de colocar o Linux em uma máquina virtual,para lidar com isso com calma e ter uma Internet decente em mãos, essa história tomaria um rumo completamente diferente.



Agora tudo mudou. Com o advento da web em sua forma moderna em nossa vida, mudei para o Node.js e, quer queira quer não, comecei a ser imbuído da ideologia do console e do Linux. Para hospedar meus desenvolvimentos, eu precisava de um VPS, e descobri que VPS com Windows são muito mais caros, então meu sapo superou minhas frustrações em relação ao console, e a presença de Internet de alta velocidade tornou possível encontrar instantaneamente respostas para emergências questões. 



Aprendi a usar o ssh, percebi o poder do git e comecei a usar o docker ativamente, mas também gosto de usar uma interface gráfica para minhas tarefas e, neste artigo, quero apresentar a vocês um maravilhoso conjunto de ferramentas que me permitem resolver minhas tarefas diárias, não me referindo mais uma vez ao console.



Preparação



Criei um VPS de configuração mínima (vCPU: 1 núcleo, RAM: 1 GB, NVMe: 20 GB) no macloud . Para instalação em um VPS, escolhi a distribuição Debian 10. Ao instalar, adicionei imediatamente uma chave SSH através do painel de controle, para que fosse conveniente entrar no console usando um cliente SSH. Para outros experimentos, você precisará do seguinte:



  1. Atualize o sistema
  2. Instale docker e docker-compose
  3. Inclui o arquivo de troca.


Você pode atualizar o sistema operacional com os seguintes comandos:



# apt update

   

# apt upgrade

 ,    .
      
      





Para instalar o docker, siga as instruções oficiais https://docs.docker.com/engine/install/debian/



Instale as dependências necessárias:



# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
      
      





Adicione a chave oficial do Docker GPG:



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





Adicione o repositório:



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





Agora resta atualizar a lista de pacotes:



# apt-get update
      
      





e instale o docker:

# apt-get install docker-ce docker-ce-cli containerd.io
      
      





Você pode verificar se tudo está instalado corretamente executando o comando:



# docker run hello-world
      
      





Se uma saudação for exibida, tudo correu bem. No momento em que este artigo foi escrito, eu tinha a seguinte versão instalada:



# docker -v

Docker version 20.10.6, build 370c289

      
      





Agora você precisa instalar o docker-compose. Para fazer isso, usaremos as instruções oficiais:



https://docs.docker.com/compose/install/



Primeiro, precisamos obter um link para a versão mais recente do docker-compose. A lista de lançamentos pode ser encontrada aqui: https://github.com/docker/compose/releases



No momento em que este livro foi escrito, a versão mais recente era 1.29.2. Precisamos de uma versão do Linux, então selecionamos um arquivo chamado docker-compose-Linux-x86_64. Vamos copiar o link para ele. Agora você precisa inserir o seguinte comando no console (cole o link que você recebeu acima no lugar certo):



# curl -L "<  >" -o /usr/local/bin/docker-compose
      
      





 No meu caso, acabou:



# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
      
      





Execute o comando e baixe o binário docker-compose.



A última etapa é definir a permissão de execução para ele. Isso pode ser feito com o seguinte comando:



# chmod +x /usr/local/bin/docker-compose
      
      





Se tudo correu bem, o processo de instalação acabou, agora você pode verificar a versão do docker-compose. Eu entendi assim:



# docker-compose -v

docker-compose version 1.29.2, build 5becea4c
      
      





A última etapa é habilitar o arquivo de paginação, dada a pequena quantidade de memória com certeza não será supérfluo:



Crie um arquivo de 4 GB



# fallocate -l 4G /swapfile

      
      





Vamos atribuir os direitos necessários a ele:



# chmod 600 /swapfile
      
      





Vamos inicializá-lo como um arquivo de troca:



# mkswap /swapfile
      
      





Finalmente, ativamos:



# swapon /swapfile
      
      





Você pode verificar se o arquivo de paginação apareceu no sistema com o comando free. Eu tenho tudo:



# free

              total        used        free      shared  buff/cache   available

Mem:        1010900      150500      143788        2892      716612      714916

Swap:       4194300           0     4194300

      
      





Resta uma última etapa: para que o arquivo de paginação permaneça ativo após uma reinicialização, adicione a seguinte linha ao arquivo / etc / fstab:



/swapfile swap swap defaults 0 0
      
      







Para essas tarefas, gosto de usar o gerenciador de arquivos Midnight Commander. É um gerenciador de arquivos de console com uma interface clássica. Se você já encontrou o Norton Commander / FAR / TotalCommander, compreenderá facilmente como usá-lo. Você pode instalá-lo com o seguinte comando:



# apt-get install mc
      
      







E execute com o comando 



# mc

      
      





Vamos ver uma imagem dolorosamente familiar:





Agora encontraremos o arquivo necessário e o editaremos:





Isso conclui a configuração preliminar, você pode prosseguir.



Portainer



A primeira ferramenta que gostaria de apresentar a você é o Portainer. Portainer é uma ferramenta de gerenciamento de contêiner para Docker, Swarm, Kubernetes e Azure ACI. Como afirma a documentação do Portainer:



"Ao negar a  necessidade dos usuários de usar a interface de linha de comando, escrever YAML ou entender manifestos, o Portainer torna a implantação de aplicativos e a solução de problemas tão fácil que qualquer um pode fazer".



Para meus propósitos, Portainer é simplesmente perfeito. Vamos conhecê-lo melhor. De acordo com a documentação https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/, a maneira mais fácil de fazer isso é a seguinte:



Crie um volume para armazenar dados:



# docker volume create portainer_data
      
      





Agora você pode iniciar o Portainer com o seguinte comando:



# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
      
      





Depois de iniciar o Portainer, ele estará disponível em http: // <ip do servidor>: 9000 /



Quando você iniciar o Portainer pela primeira vez, ele pedirá que você especifique a senha do administrador, após o que ele irá perguntar como se conectar ao meio Ambiente:





Selecionei a opção de conectar ao Docker local, após o que a tela inicial do Portainer apareceu:





Como você pode ver, um ponto de extremidade local está disponível; posteriormente, você pode adicionar conexões a outros nós, se necessário.



Vamos examiná-lo e veremos um painel conveniente com informações resumidas:





É aqui que podemos gerenciar todos os aspectos de como o Docker funciona. Vamos ver o que temos em nossos contêineres:





Até agora, um contêiner é o próprio Portainer. A interface é muito conveniente para visualizar e gerenciar contêineres, e também há a capacidade de adicionar novos. Você pode passar pelo resto das guias e ver como a interface conveniente e atenciosa tem o Portainer.



Mais interessante é a guia Pilhas. Uma pilha é uma coleção de contêineres interconectados que funcionam e funcionam juntos. Na verdade, é igual ao Docker Compose, cuja configuração descrevemos no arquivo docker-compose.yml e, em seguida, executamos com o comando docker-compose up.  



O Portainer permite que você adicione uma pilha ao sistema de várias maneiras, desde a edição com o editor embutido até o download do github.





O formato docker-compose é usado para definir a pilha, que é o que funciona aqui nos bastidores. Usando esta função, é mais conveniente para mim construir a infraestrutura necessária a partir de contêineres.



Neste ponto, proponho fazer um desvio do estudo das capacidades do portêiner por enquanto. Acho que você já viu que esta é uma ferramenta séria, graças à qual você pode abandonar quase completamente o uso do docker CLI. Agora, vamos dar uma olhada rápida no que desejo obter como resultado neste VPS.



Periodicamente, tenho necessidade de desenvolver projetos "rápidos". Isso é o que chamo de projetos que não requerem um estudo profundo. Podem ser experimentos, pequenos sites, bots, coletores de informações, etc. Qualquer coisa que não exija a construção de uma cadeia CI / CD. Seria extremamente conveniente para mim desenvolver e depurar esses aplicativos exatamente onde eles funcionarão. Além disso, muitas vezes tenho uma situação em que estou longe do meu local de trabalho com um ambiente de desenvolvimento configurado e, se algo nesses meus projetos começar a funcionar errado, gostaria de ser capaz de compreender rapidamente a situação e corrigir o problema. ou apenas trabalhe em projetos enquanto você tem um minuto livre em qualquer computador, mesmo que não haja nada nele, exceto um navegador e acesso à Internet.



Para facilitar o acesso, comprei um nome de domínio e desejo configurar domínios de terceiro nível para várias ferramentas, de modo que, por exemplo, o portainer esteja disponível em portainer.example.com. Também quero que tudo funcione por meio de https e, para não me incomodar em comprar certificados SSL, use o Let's Encrypt. Outro requisito é que tudo o que não deveria ser acessível publicamente seja fechado por autenticação.



Para implementar tudo isso, vamos nos familiarizar com a seguinte grande ferramenta. Isto…



Traefik



Traefik é um servidor proxy reverso ajustado para o manuseio de contêineres. Os seguintes recursos são importantes para mim:



  • atualização de configuração em tempo real
  • suporte docker como provedor de configuração
  • trabalhando com Vamos criptografar fora da caixa


Para executar o traefik com o portainer, usaremos o exemplo docker-compose.yml fornecido na documentação do portainer: https://documentation.portainer.io/v2.0/ad/traefik/rp-traefik/



version: «3.9»

services:

  traefik:

    container_name: traefik

    image: «traefik:latest»

    container_name: traefik

    command:

      - «--entrypoints.web.address=:80»

      - «--entrypoints.websecure.address=:443»

      - «--providers.docker=true»

      - «--providers.docker.exposedbydefault=false»

      - «--log.level=ERROR»

      - «--certificatesresolvers.leresolver.acme.httpchallenge=true»

      - «--certificatesresolvers.leresolver.acme.email=user@mymail.com»

      - «--certificatesresolvers.leresolver.acme.storage=./acme.json»

      - «--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web»

      - «--entrypoints.web.http.redirections.entryPoint.to=websecure»

      - «--entrypoints.web.http.redirections.entryPoint.scheme=https»

      - «--metrics.prometheus=true»

    ports:

      - «80:80»

      - «443:443»

    volumes:

      - «/var/run/docker.sock:/var/run/docker.sock:ro»

      - «./acme.json:/acme.json»

    networks:

      - intranet

    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

portainer:

    image: portainer/portainer-ce:2.5.0-alpine

    container_name: portainer

    command: -H unix:///var/run/docker.sock

    restart: always

    volumes:

      - /var/run/docker.sock:/var/run/docker.sock

      - portainer_data:/data

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.frontend.rule=Host(`portainer.example.com`)»

      - «traefik.http.routers.frontend.entrypoints=websecure»

      - «traefik.http.services.frontend.loadbalancer.server.port=9000»

      - «traefik.http.routers.frontend.service=frontend»

      - «traefik.http.routers.frontend.tls.certresolver=leresolver»

volumes:

  portainer_data:

networks:

  intranet:

    name: intranet
      
      





Para que o processo de obtenção do certificado Let's encrypt seja bem-sucedido, você precisa ter certeza de que os registros DNS estão configurados corretamente antes de começar. Eu uso o cloudflare para essas finalidades, e nele a configuração deve ser parecida com esta:





A coluna "Conteúdo" deve conter o endereço de nosso VPS.



Agora, se você copiar o docker-compose.yml resultante para o servidor, execute o seguinte comando:



 # docker-compose up -d
      
      





Então, após o lançamento em portainer.example.com, a seguinte imagem aparecerá :





Além disso, já estará protegido pelo certificado Let's Encrypt:





O Traefik possui um painel muito útil para ajudá-lo a entender se as configurações foram aplicadas corretamente. Para ativá-lo, você precisa adicionar as seguintes linhas a docker-compose.yml:



services:

  traefik:

  ...

    command:

      ...

      - «--api.dashboard=true»

    labels:

      ...

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»  
      
      





Você também precisa adicionar o domínio de terceiro nível traefik.example.com nas configurações de DNS. Isso pode ser feito por analogia com a forma como o domínio do portainer foi adicionado anteriormente. Depois de aplicar as configurações em traefik.example.com, veremos o painel:





Como você pode ver, o Traefik provou ser uma ótima ferramenta. Ele funciona em conjunto com o docker e seus recursos de configuração dinâmica permitem que você abandone completamente o uso de arquivos de configuração para configurações de roteamento. Em vez disso, apenas escrevemos todos os parâmetros necessários como rótulos para o serviço personalizado, de forma que todas as configurações fiquem em um só lugar.



Agora, proponho desviar um pouco da configuração de serviços básicos e adicionar um ambiente de desenvolvimento ao sistema. Será…



Servidor de código do Visual Studio



Para mim, o ambiente de desenvolvimento ou IDE sempre foi algo muito sério. Um pacote de software poderoso instalado na máquina do desenvolvedor ocupa muitos gigabytes de espaço em disco e RAM. Um exemplo de IDE que tenho usado por muitos anos, e ainda acredito que essa é a melhor escolha se você trabalhar com a pilha de tecnologia da Microsoft, é o Microsoft VisualStudio. Quando comecei a aprender Node.js, descobri o VSCode e, apesar dos nomes relacionados, é um IDE completamente diferente, com um conceito e recursos completamente diferentes. O fato de o VSCode usar o mecanismo Chrome para exibir sua interface permite que o próprio VSCode seja espaçado. Graças a esta arquitetura, nasceu o Visual Studio Code Server, que pode rodar em um VPS, enquanto a interface VSCode estará acessível através de um navegador. E não, este não é outro editor de código online,é um IDE VSCode completo que possui todos os seus excelentes recursos.



Para adicionar VSCode Server ao meu VPS, vou criar uma nova pilha no Portainer, chamá-la de servidor de código e adicionar a seguinte configuração lá:



version: «3.9»

volumes:

  codeserverdata:

  codeappdir:

networks:

  intranet:

    external: true 

services:

  code-server:

    image: ghcr.io/linuxserver/code-server

    container_name: code-server

    environment:

      - PUID=1000

      - PGID=1000

      - TZ=Europe/London

#      — PASSWORD=password #optional

      - SUDO_PASSWORD=password #optional

      - PROXY_DOMAIN=code.example.com

    volumes:

      - codeserverdata:/config

      - codeappdir:/app

    extra_hosts:

      host.docker.internal: host-gateway

    restart: always

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»
      
      







Além disso, antes de começar, não se esqueça de adicionar o domínio de terceiro nível code.example.com aos seus registros DNS. Agora resta clicar no botão Implementar a pilha.



Após o final do processo, uma nova pilha aparecerá no portainer, e se formos para code.example.com , veremos a seguinte imagem (imediatamente ativei o tema escuro):





Aqui você pode desenvolver da mesma forma que na versão desktop do VSCode. De modo geral, a única diferença que encontrei é a diferença na vinculação padrão de alguns atalhos de teclado, mas você se acostuma rapidamente no processo de uso.



Por conveniência, conectei o volume que montei no diretório / app ao contêiner do servidor de código, então é melhor criar ou clonar projetos do repositório lá, caso em que os dados não serão perdidos mesmo quando o contêiner for restaurado -criada.



Esta imagem já tem o Node.js instalado, então não precisei fazer nada e posso começar a trabalhar nos meus projetos imediatamente. Se você precisar de outros YPs em seu trabalho, observe que os criadores desta imagem mantêm um catálogo de mods que permite adicionar suporte para várias plataformas. Você pode ler sobre como usá-los na descrição da imagem no Docker Hub, e a lista de mods oficiais pode ser encontrada aqui: mods.linuxserver.io/?mod=code-server



Observe também que a senha do sudo é especificada no configurações do contêiner ... Para demonstração, deixei simples, mas na prática é melhor complicar, ou ainda melhor usar a propriedade SUDO_PASSWORD_HASH para não armazenar a senha em texto não criptografado. Você pode ler como fazer isso na descrição da imagem aqui: hub.docker.com/r/linuxserver/code-server



Como você provavelmente já percebeu, no momento o acesso ao servidor de código não está protegido de forma alguma e agora qualquer pessoa que visite code.example.com terá acesso. Esta é uma opção muito ruim, e embora você possa habilitar o acesso por senha nas configurações de imagem, gostaria de ter um único login para acessar todos os recursos localizados no servidor. Para fazer isso, proponho me familiarizar com a seguinte ferramenta. Será…



KeyCloak 



KeyCloak é uma ferramenta moderna para organizar o acesso a sistemas distribuídos usando a tecnologia de logon único. Na verdade, é a única ferramenta gratuita com uma funcionalidade tão poderosa que consegui encontrar. Se você conhece uma alternativa válida, não deixe de escrever sobre ela nos comentários.



Para adicioná-lo ao meu sistema, criei uma nova pilha chamada auth no portainer e adicionei a seguinte configuração a ela:



version: '3.9'

networks:

  intranet:

    external: true 

services:

 keycloak:

    image: jboss/keycloak

    container_name: keycloak

    restart: always

    networks:

      - intranet

    environment: 

      KEYCLOAK_PASSWORD: password

      PROXY_ADDRESS_FORWARDING: «true»

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.keycloak.rule=Host(`auth.yourdomain.com`)»

      - «traefik.http.routers.keycloak.tls=true»

      - «traefik.http.routers.keycloak.tls.certresolver=leresolver»
      
      







Depois de clicar no botão Implementar a pilha, o KeyCloak estará disponível em auth.example.com . Se formos lá, seremos recebidos pela janela de boas-vindas do KeyCloak:







Vamos para o console de administração:





O nome de usuário será admin e a senha inicial é aquela que definimos na configuração da pilha da variável de ambiente KEYCLOAK_PASSWORD. Após o login, chegaremos ao painel de administração do KeyCloak:





As recomendações para a configuração inicial do KeyCloak para docker podem ser encontradas na documentação oficial aqui www.keycloak.org/getting-started/getting-started-docker .



Resumindo, você precisa criar um novo Realm customizado, criar um usuário nele e adicionar um novo cliente.



Para o cliente, você precisa definir o Tipo de acesso: confidencial e adicionar nossos domínios aos URIs de redirecionamento válidos, enquanto estes são "https://traefik.example.com/*" e " code.example.com *":







Depois de instalar o Tipo de acesso: confidencial, a guia Credenciais aparecerá, na qual você poderá obter o segredo, que será útil para nós mais tarde, durante a configuração.



Isso conclui a configuração do KeyCloak por enquanto. Agora precisamos fazer amizade com Traefik. Deixe-me lembrá-lo de que queremos evitar que usuários não autenticados acessem code.example.com e traefik.example.com. Para isso, a traefik possui um middleware ForwardAuth que permite organizar a autorização através de um serviço externo. Para garantir sua interação com o KeyCloak, precisamos de um serviço intermediário, usarei github.com/thomseddon/traefik-forward-auth . Ele também está disponível como uma imagem no Docker Hub, então vou apenas adicionar a configuração da pilha de autenticação do portainer com este serviço:



  traefik-forward-auth:

    image: thomseddon/traefik-forward-auth

    container_name: traefik-forward-auth

    environment:

      - DEFAULT_PROVIDER=oidc

      - PROVIDERS_OIDC_ISSUER_URL=https://auth.example.com/auth/realms/example

      - PROVIDERS_OIDC_CLIENT_ID=traefik

      - PROVIDERS_OIDC_CLIENT_SECRET=d7fb86f0-71a9-44f7-ab04-967f086cd89e

      - SECRET=something-random

      - LOG_LEVEL=debug

    labels:

      - «traefik.enable=true»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User»

      - «traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181»

    restart: always

      
      





Aqui, a variável PROVIDERS_OIDC_ISSUER_URL deve conter o caminho para o Reino que criamos anteriormente no Keycloak, PROVIDERS_OIDC_CLIENT_ID deve conter o nome do cliente que criei anteriormente neste domínio e PROVIDERS_OIDC_CLIENT_SECRET deve ser obtido da guia Credenciais deste cliente. Na variável SECRET, você precisa preencher uma string aleatória.



Agora, para fechar o serviço, roteamento que o Traefik oferece, basta adicionar a seguinte linha aos rótulos:



      - "traefik.http.routers.< >.middlewares=traefik-forward-auth"
      
      







Para começar, decidi fechar o servidor de código com autenticação, para o qual entrei em sua pilha e adicionei sua configuração. O resultado é o seguinte (para abreviar, cito apenas a seção de rótulos):



    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»

      - «traefik.http.routers.code.middlewares=traefik-forward-auth»
      
      







Clique no botão Atualizar pilha e tente visitar code.example.com. Se tudo for feito corretamente, a janela de login aparecerá:





Depois de inserir o nome de usuário e a senha corretos (que eu havia configurado anteriormente no KeyCloak), entrei na interface do servidor de código. Tudo está funcionando!



 Da mesma forma, fechei o painel do traefik de olhos curiosos. Para fazer isso, tive que ir para o console (o Portainer não pode fazer alterações na configuração da pilha, que não foi criada por ele, mas levantei Traefik do console) e editar da mesma forma docker-compose.yml:



    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.routers.traefik.middlewares=traefik-forward-auth»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»
      
      







Para verificar, fui para traefik.example.com. Para ter certeza de que tudo funcionava como deveria, tive que abrir uma janela do navegador em modo anônimo, caso contrário o sistema me reconheceu e não pediu uma senha, já que eu já havia feito login para acessar o servidor de código e, portanto, o KeyCloak autenticado me automaticamente. 



Assim, usando uma combinação de KeyCloak e Traefik, consegui proteger elementos confidenciais do meu sistema contra acesso não autorizado. A vantagem dessa abordagem é que ela permite que você faça isso mesmo onde não há mecanismos de autenticação proprietários. Existem, é claro, desvantagens - o KeyCloak é bastante pesado, consome muitos recursos, principalmente memória e, em termos de recursos, isso é um exagero óbvio, provavelmente não precisarei da maior parte do que ele pode fazer. Como alternativa, um serviço de nuvem pode ser usado, por exemplo, traefik-forward-auth tem suporte integrado ao Google OAuth.



conclusões



Neste artigo, conhecemos um conjunto de ferramentas, cujo uso conjunto pode simplificar e automatizar muito uma ampla gama de tarefas que surgem hoje na prática de muitos especialistas em TI. Configurações como:



  • Conexão de nomes de domínio
  • Configuração TLS
  • Obtenção e instalação de certificados
  • Autenticação


são feitas em várias linhas diretamente na configuração do serviço.



Claro que, na hora de configurar, tive que fazer muito no console, mas no futuro, com o uso diário, o sistema embutido me permitirá reduzir seu uso, o que é sem dúvida uma vantagem para mim.



Quando estava escrevendo este artigo, a principal dificuldade era reunir todas as informações necessárias. Muitas coisas da documentação não são óbvias e frequentemente para fazer o sistema funcionar conforme necessário, você tinha que procurar uma solução para o problema em vários problemas no github e questões do stackoverflow. Portanto, tentei destacar alguns pontos com mais detalhes e espero que minha pesquisa ajude alguém a entender melhor os produtos descritos.



Também espero sinceramente receber críticas construtivas nos comentários e ideias sobre como fazer o que tentei implementar melhor aqui. Por exemplo, eu realmente gostaria de encontrar uma alternativa mais leve ao KeyCloak, porque é um pouco pesado para esse tipo de tarefa.



Por conveniência, coloquei os arquivos de configuração no repositório aqui: https://github.com/debagger/vps-docker-workspace



Obrigado por sua atenção!






Os servidores em nuvem da Macleod são rápidos e seguros.



Cadastre-se pelo link acima ou clicando no banner e ganhe 10% de desconto no primeiro mês de aluguel de um servidor de qualquer configuração!






All Articles