<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pedro Stéfano</title>
    <description>The latest articles on Forem by Pedro Stéfano (@pedrostefanogv).</description>
    <link>https://forem.com/pedrostefanogv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F502471%2F5048eac5-f4dc-4791-8967-cba29181bc6f.jpg</url>
      <title>Forem: Pedro Stéfano</title>
      <link>https://forem.com/pedrostefanogv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pedrostefanogv"/>
    <language>en</language>
    <item>
      <title>Minio + Traefik + TSL/SSL</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Wed, 31 Aug 2022 18:45:32 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/minio-traefik-tslssl-1f3k</link>
      <guid>https://forem.com/pedrostefanogv/minio-traefik-tslssl-1f3k</guid>
      <description>&lt;p&gt;Hoje vamos abordar um pouco sobre hospedagem de arquivos. &lt;br&gt;
Atualmente no mercado temos a AWS s3 sendo um das principais ferramentas para armazenamento de arquivo em nuvem no merco, para não dizer a principal. Suas especificações de API meio que se tornou um padrão implícito para esse tipo de serviço na web. Contudo por motivos diversos podemos ter casos em que é necessário ter um serviço similar em nossa própria infra seja por motivos técnicos ou outros. &lt;br&gt;
Para atender essa necessidade vamos utilizar o  &lt;a href="https://min.io/"&gt;Minio&lt;/a&gt;  ele funcionar como um serviço s3 sendo em suas especificações muito parecido com o mesmo e podendo ate mesmo usar a S3 ou  serviços similares como um tier de armazenamento, além de serviço de cache, servidores com multi região e etc. Farei uma abordagem de instalação básica. &lt;/p&gt;

&lt;p&gt;Para começarmos é necessário ter o Traefik já instalado.&lt;br&gt;
O pulo do gato esta em extrair do acme.json. As chaves publicas e privadas necessárias para que possamos estabelecer conexão segura com o servidor do min.io . Para isso é necessário utilizar um serviço para extrair as mesmas. No &lt;a href="https://github.com/pedrostefanogv/docker-compose-utils/blob/main/Traefik/docker-compose.yaml"&gt;docker-compose&lt;/a&gt; adonaremos o seguinte serviço.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  traefik-certs-dumper:
    container_name: "traefik-dumpcerts"
    restart: "always"
    image: ldez/traefik-certs-dumper:v2.8.1
    entrypoint: sh -c '
      apk add jq
      ; while ! [ -e /acme.json ]
      || ! [ `jq ".[] | .Certificates | length" /acme.json` != 0 ]; do
      sleep 1
      ; done
      &amp;amp;&amp;amp; traefik-certs-dumper file --version v2 --watch
      --source /acme.json --dest /data'
    volumes:
      - "/opt/traefik/acme.json:/acme.json"
      - "/opt/traefik/data:/data"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, ele vai extrair as chaves .crt e .key dos domínios contidos em  acme.json&lt;br&gt;
Feito isso vamos subir o serviço do min.io, para maiores informações consulte a documentação oficial. Nesse exemplo vamos subir um onico contêiner com dois discos para armazenamento dos dados sendo considerado data1-1 e data1-2 montado na raiz do mesmo. &lt;a href="https://github.com/pedrostefanogv/docker-compose-utils/blob/main/Minio/docker-compose.yaml"&gt;link do arquivo&lt;/a&gt; para consulta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.7'

networks:
  traefik:
    name: traefik
    external: true

volumes:
  data1-1:
     name: data1-1
     driver: local
  data1-2:
     name: data1-2
     driver: local

services:
   minio1:
    restart: always
    image: quay.io/minio/minio
    container_name: minio
    command: server  --console-address ":80" http://minio/data{1...2}

    volumes:
      - data1-1:/data1
      - data1-2:/data2
      - "/opt/traefik/data/private:/.minio/certs:ro"
    environment:

       MINIO_DOMAIN: DOMINIO.COM.BR
       MINIO_SERVER_URL: https://s3.DOMINIO.COM.BR
       MINIO_BROWSER_REDIRECT_URL: http://console.s3.DOMINIO.COM.BR
       CONSOLE_SECURE_TLS_REDIRECT: off
       MINIO_ROOT_USER: minioadmin
       MINIO_ROOT_PASSWORD: minioadmin

    labels:

    # console
      - "traefik.http.routers.minio.rule=Host(`console.s3.DOMINIO.COM.BR`)"
      - "traefik.http.routers.minio.entrypoints=websecure"
      - "traefik.http.routers.minio.tls=true"
      - "traefik.http.routers.minio.tls.certresolver=letsencrypt"
      - "traefik.http.services.minio.loadbalancer.server.port=80"
      - "traefik.http.routers.minio.service=minio"

    # Api
      - "traefik.http.routers.minio-api.rule=Host(`s3.DOMINIO.COM.BR`)"
      - "traefik.http.routers.minio-api.entrypoints=websecure"
      - "traefik.http.routers.minio-api.tls=true"
      - "traefik.http.routers.minio-api.tls.certresolver=letsencrypt"
      - "traefik.http.services.minio-api.loadbalancer.server.port=9000"
      - "traefik.http.routers.minio-api.service=minio-api"


      - "traefik.frontend.passHostHeader=true"
      - "traefik.enable=true"


    networks:
      - traefik


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações.&lt;/p&gt;

&lt;p&gt;Verifique as variáveis de usuário inicial. Apos o primeiro login, recomendo a criação de um novo usuário e a rotação do nome e senha do usuário.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
MINIO_ROOT_USER: minioadmin&lt;br&gt;
MINIO_ROOT_PASSWORD: minioadmin&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O serviço possui dois domínios, um para fornecimento dos arquivos e outro para acesso ao console de administração.&lt;br&gt;
Caso não esteja conseguindo acessar o console (usuário e senha invalido) desative o redirecionamento do TLS. &lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
    MINIO_DOMAIN: DOMINIO.COM.BR&lt;br&gt;
    MINIO_SERVER_URL: &lt;a href="https://s3.DOMINIO.COM.BR"&gt;https://s3.DOMINIO.COM.BR&lt;/a&gt;&lt;br&gt;
    MINIO_BROWSER_REDIRECT_URL: &lt;a href="http://console.s3.DOMINIO.COM.BR"&gt;http://console.s3.DOMINIO.COM.BR&lt;/a&gt;&lt;br&gt;
    CONSOLE_SECURE_TLS_REDIRECT: off&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
      <category>aws</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Docker IPV6 - Guia definitivo</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Thu, 14 Jul 2022 02:54:24 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/docker-ipv6-guia-definitivo-2nd6</link>
      <guid>https://forem.com/pedrostefanogv/docker-ipv6-guia-definitivo-2nd6</guid>
      <description>&lt;p&gt;É de conhecimento de todos que o ipv4 se esgotou, existe alguns blocos ainda disponíveis mas já não se pode contar com eles para novos provedores e etc. Dessa forma cada vez mais esta sendo adotado o IPV6 porém, nem todas as aplicações estão preparadas 100% para o uso do mesmo. Em alguns casos já existe o suporte porém, pode ser necessário alguns ajustes a mais, o docker é um desses. &lt;/p&gt;

&lt;p&gt;Contudo para habilitar a conexão via ipv6 basta editarmos o arquivo daemon.json com algumas informações. Será habilitado via nat, utilizando o ipv6 do host para comunicação. Caso queria usar seu bloco de ipv6 para pegar um IP real direto no container, faça o ajuste no endereçamento do mesmo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Editar o arquivo de configuração
nano /etc/docker/daemon.json 

# Conteúdo a ser incluído no mesmo.
{
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental": true,
    "ip6tables": true
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eljzTcKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcpuapk1kslrpe5lx51a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eljzTcKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcpuapk1kslrpe5lx51a.png" alt="Docker daemon.json " width="738" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após realizar a configuração precisamos reiniciar os serviços do docker&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# Reiniciar o serviço docker 
systemctl restart docker.service

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso nossos containers conectado a rede bridge do docker tem acesso via ipv6/nat a internet, como se pode observar na imagem baixo conseguimos pingar o google normalmente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gnhfysC5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/slvw963pl7vo92619mk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gnhfysC5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/slvw963pl7vo92619mk0.png" alt="ping6 google.com" width="738" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links Úteis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mailcow/mailcow-dockerized/blob/1a05101f5031bcda864bc9e10d49cc52d26de2e5/update.sh"&gt;https://github.com/mailcow/mailcow-dockerized/blob/1a05101f5031bcda864bc9e10d49cc52d26de2e5/update.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discuss.hashicorp.com/t/no-assigned-ipv6-address-for-docker-containers-nomad-consul-connect/41391"&gt;https://discuss.hashicorp.com/t/no-assigned-ipv6-address-for-docker-containers-nomad-consul-connect/41391&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/kasmweb/comments/sg6tv9/guide_enabling_ipv6_on_your_kasmweb_server/"&gt;https://www.reddit.com/r/kasmweb/comments/sg6tv9/guide_enabling_ipv6_on_your_kasmweb_server/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mailcow/mailcow-dockerized/blob/3d538d4f144d31b2e0df1b71708735979e1027ed/docker-compose.yml"&gt;https://github.com/mailcow/mailcow-dockerized/blob/3d538d4f144d31b2e0df1b71708735979e1027ed/docker-compose.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>docker</category>
      <category>devops</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>FVM - Múltiplos SDKs Flutter na mesma maquina</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Tue, 12 Jul 2022 02:06:59 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/fvm-multiplos-sdks-flutter-na-mesma-maquina-55af</link>
      <guid>https://forem.com/pedrostefanogv/fvm-multiplos-sdks-flutter-na-mesma-maquina-55af</guid>
      <description>&lt;p&gt;Como desenvolvedor você já deve ter passado pela situação de ser necessário possuir múltiplas verões de um determinado SDK em sua maquina. Em algumas tecnologias ( exemplo o .net)  basta instalar os SDKs que eles coexistem sem grandes conflitos, porém, o flutter não permite isso. Contudo, o famoso jeitinho brasileiro deu um jeito, alguns desenvolvedores criaram a ferramenta &lt;a href="//fvm.app"&gt;FVM - Flutter Version Management&lt;/a&gt;, que em miúdos uma ferramenta cli que permite executar diversas versões do SDK do Flutter. Com extrema facilidade de alternar entre os sdk.&lt;br&gt;
Em alguns casos isso pode ocorrer de forma automática se configurado tudo certinho. Em explicação simples, ele baixa as versões em uma determinada pasta e a medida que for solicitado, ele alterna um link global simbólico apontando para a versão do SDKs que precisa executar.&lt;/p&gt;

&lt;p&gt;Vamos a mão na massa.&lt;/p&gt;

&lt;p&gt;Ele é disponibilizado como um pacote global do &lt;a href="//pub.dev/packages/fvm"&gt;pub.dev&lt;/a&gt;, para proceder a sua instalação primeiro será necessário instalar o dart. &lt;br&gt;
Aqui a abordagem será usada no Linux&lt;/p&gt;

&lt;p&gt;Vamos importar e configurar o repositório do Dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update

sudo apt-get install apt-transport-https

wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg

echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida vamos atualizar os repositórios e fazer a instalação do dart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update

sudo apt-get install dart

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para maiores informações sobre como proceder a instalação do dar consulte a &lt;a href="https://dart.dev/get-dart"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feito isso, vamos a instalação do FVM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dart pub global activate fvm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode ser necessário configurar o PATCH no Ubuntu para que os comandos seja reconhecidos, caso seja necessário edite o arquivo .profile na pasta home com o conteúdo abaixo no final do arquivo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# abrir o arquivo 
nano ~/.profile

# Conteúdo a ser adicionado no final do arquivo
export PATH="$PATH":"$HOME/fvm/default/bin"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5pPJ-koC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mdep3b6ko7jwb6w49p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5pPJ-koC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mdep3b6ko7jwb6w49p7.png" alt="PATH FVM" width="588" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos a instalação e configuração do SDK que será usado por padrão pelo sistema, neste caso recomendo a versão estável do flutter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; fvm install stable

 fvm global stable

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;após instalado, podemos usar o flutter normalmente usando chamando diretamente ou através do comando do FVM, para uma lista de comando mais detalhadas consulte a &lt;a href="https://fvm.app/docs/guides/basic_commands"&gt;documentação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Caso para instalar versões especificas do SDK do flutter, basta utilizar o comando acima subsistido stable pela versão que deseja. Para ver as verões disponíveis utilize o comando abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; fvm releases

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para alternar as versões de uso do SDK basta utilizar o comando abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; fvm use XXX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: lembrado que quando instalar uma versão anterior, não rode o comando de atualização do SDK do flutter. Isso fará com que quebre o funcionamento do FVM.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>programming</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Traefik HUB</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Sat, 02 Jul 2022 01:43:22 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/traefik-hub-1jfj</link>
      <guid>https://forem.com/pedrostefanogv/traefik-hub-1jfj</guid>
      <description>&lt;p&gt;Quem é desenvolvedor, principalmente se estiver começando na carreira por vezes precisa realizar testes com chamada externa. Seja para homologar alguma funcionalidade ou teste de segurança. Contudo nem sempre possuímos recursos, entenda por um nome de domínio, para poder deixar nossos aplicativos exposto na internet por meio de um domínio. Nesse artigo vou lhes apresentar a nova ferramenta lançada pela equipe do Traefik que vem dar ajuda nesse quesito com a nova ferramenta Traefik Hub. Ela permite expor entry points de forma fácil na internet e com SSL. Quem quiser consultar o lançamento pode dar uma olhada no anuncio através desse &lt;a href="https://traefik.io/blog/announcing-traefik-hub-cloud-native-networking-platform"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funcionamento
&lt;/h2&gt;

&lt;p&gt;Antes de colocarmos a mão na massa, vamos a um pequeno resumo de como ele funciona.&lt;/p&gt;

&lt;p&gt;En nossa host de container, rodará um agente que fará uma espécie de rede na nuvem entre a nossa infraestrutura e o Traefik. Dessa forma ele atuará como uma espécie de HUB. Os servidores atuará como proxy fornecendo uma URL de conexão para os entry points. Após a configuração, toda a configuração e gerenciado é realizado pelo &lt;a href="https://hub.traefik.io/"&gt;site da plataforma&lt;/a&gt;. Além disso, é possível configurar autenticação para acesso as url utilizadas para acesso, permitindo adicionar uma proteção para testes que não é interessante ficar exposto a internet livremente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SOd7q4dV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bnlvrkxndztunxerj08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SOd7q4dV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bnlvrkxndztunxerj08.png" alt="Traefik Hub" width="880" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mão na massa.
&lt;/h2&gt;

&lt;p&gt;Não vou entrar em detalhes sobre instalação e configuração  do docker e docker compose.&lt;/p&gt;

&lt;p&gt;Vamos criar um 'docker-compose.yml' com o conteúdo abaixo, lembrando de informar seu token de conexão com o HUB.&lt;br&gt;
Para pegar seu token, acesse esse &lt;a href="https://hub.traefik.io/agents/new"&gt;link&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3"

services:
  # Start the agent with the latest version
  hub-agent:
    image: ghcr.io/traefik/hub-agent-traefik:v0.7.2
    container_name: hub-agent
    restart: "on-failure"
    command:
      - run
      - --hub.token=TOKEN_TRAEFIKHUB
      - --auth-server.advertise-url=http://hub-agent
      - --traefik.host=traefik
      - --traefik.tls.insecure=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - traefik

  # Start Traefik with the latest version
  traefik:
    image: traefik:v2.7
    container_name: traefik
    command:
      # Enable Hub communication (open the port 9900 and 9901 by default)
      - --experimental.hub=true
      - --hub.tls.insecure=true
      - --metrics.prometheus.addrouterslabels=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vamos dar start no agente e no traefik&lt;/p&gt;

&lt;p&gt;'docker-compose up -d'&lt;/p&gt;

&lt;p&gt;Uma vez que o agente esta funcionamento podemos acessar o site do Traefik HUB e publicar nossos containers na internet. Uma vez listado nossos containers vamos acessar um deles para gerar a URL de acesso&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b9VC9mIT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5efdmlux061a1outcidj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b9VC9mIT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5efdmlux061a1outcidj.png" alt="Containers Traefik HUb" width="880" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos confirmar a porta de entrada do container, se necessário a política de acesso, e publicar nosso container na web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1qhMRAiH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9j1bczhu0z6rry5urvi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1qhMRAiH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9j1bczhu0z6rry5urvi1.png" alt="Publicação Trafefik Hub" width="880" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fP1MTfnf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbzz6ik2ktspa7e5f06j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fP1MTfnf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbzz6ik2ktspa7e5f06j.png" alt="Traefik Hub publicação" width="810" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma vez publicado, será disponibilizado a url para acesso ao container já com o SSL configurado. Mas alegria de pobre dura pouco. O serviço possui duas limitações, limite de 1G de trafego, o que é muita coisa se considerar o uso para apis e você pode publicar somente 10 servidos/containers.&lt;/p&gt;

&lt;p&gt;Bom, como pudemos ver, em menos de 5 minutos é possível publicar sua api/aplicação na web se forma segura. Claro que no momento (06/2022) não é recomendar o uso em produção visto que o recuso esta em beta, mas o propósito desse novo recuso vem facilitar muito a vida dos desenvolvedores.&lt;/p&gt;

&lt;p&gt;Links úteis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://traefik.io/blog/publish-and-secure-applications-with-traefik-hub/"&gt;https://traefik.io/blog/publish-and-secure-applications-with-traefik-hub/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SEO&lt;br&gt;
Como publicar container com SSL&lt;br&gt;
Disponibilizar API com SSL&lt;br&gt;
configurar container com SSL&lt;br&gt;
configurar letsencrypt  Trafefik&lt;/p&gt;

</description>
      <category>traefik</category>
      <category>programming</category>
      <category>devops</category>
      <category>api</category>
    </item>
    <item>
      <title>Keycloak instalação - P03</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Tue, 10 Aug 2021 01:13:45 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/keycloak-instalacao-p03-1mog</link>
      <guid>https://forem.com/pedrostefanogv/keycloak-instalacao-p03-1mog</guid>
      <description>&lt;p&gt;Bom, como mencionado na parte 02, estamos com o servidor pronto para execução. Entretanto, por medida de segurança, para a criação do usuário administrador da aplicação é necessário acessar a aplicação usando o endereço localhost, e ao menos que esteja executando um servidor com ambiente gráfico, não será tão simples o acesso.&lt;/p&gt;

&lt;p&gt;Vamos fazer uma execução inicial e ver se a aplicação esta apta para produção/configuração inicial.&lt;br&gt;
Vamos acessar a pasta bin e iniciar o script standalone.sh.&lt;br&gt;
Caso seja executado sem a passagem do parâmetro -b=0.0.0.0, não será possível acessar a aplicação pelo endereço externo do servidor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./standalone.sh &lt;span class="nt"&gt;-b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ztvpkks_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5d45sg19fwb72ez61b80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ztvpkks_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5d45sg19fwb72ez61b80.png" alt="Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apos o sistema criar a base de dados inicial, fazer algumas migrações e etc, já conseguimos acessar a interface de gerenciamento do keycloak. Entretendo, podemos observar que somos orientado a acessar a mesma via endereço localhost para a criação do usuário administrador. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IsiZ8pky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0tqz1ijizyrd2uv47oi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IsiZ8pky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0tqz1ijizyrd2uv47oi1.png" alt="Keycloak server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma forma de contornar isso é realizar um redirecionamento de porta por meio de um túnel sobre ssh. Dessa forma ao tentar acessar uma porta no computador local, as solicitações serão feitas para o servidor remoto a qual estamos conectados.&lt;br&gt;
Contudo, existe um script para a criação e associação de usuários aos realms da aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./add-user-keycloak.sh &lt;span class="nt"&gt;-r&lt;/span&gt; master &lt;span class="nt"&gt;-u&lt;/span&gt; pedrostefanogv &lt;span class="nt"&gt;-p&lt;/span&gt; testekeycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jx-JMXTz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v4d03gdp5y1qdxbh5q4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jx-JMXTz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v4d03gdp5y1qdxbh5q4d.png" alt="Criação usuário Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma vez que o usuário inicial está criado, podemos acessar ao painel administrador do Keycloak, lembrando que devemos iniciar o servidor novamente. Como podemos verificar na imagem abaixo, agora está disponível a opção de realizar login.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XBFRcM0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3xty3ygnqv3f4u8l50k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XBFRcM0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3xty3ygnqv3f4u8l50k.png" alt="Servidor Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VBHzP0ms--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/di3ak9zukzvnwe5ayqpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VBHzP0ms--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/di3ak9zukzvnwe5ayqpa.png" alt="Login Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No próximo artigo, vou abordar como configurá-lo para rodar como serviço no Ubuntu. Dessa forma, garantimos que ao reiniciar o servidor ou caso a sessão do usuário seja encerada, a aplicação continue em execução. &lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>ubuntu</category>
      <category>nginx</category>
      <category>ssh</category>
    </item>
    <item>
      <title>Keycloak instalação - P02</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Tue, 27 Jul 2021 20:02:58 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/keycloak-instalacao-p02-1729</link>
      <guid>https://forem.com/pedrostefanogv/keycloak-instalacao-p02-1729</guid>
      <description>&lt;p&gt;Com a nossa maquina virtual preparada, vamos proceder com a instalação do JDK para rodar o Keycloak e a instalação inicial do mesmo.&lt;br&gt;&lt;br&gt;
vamos verificar se possuímos o java instalado, caso contraŕio, instalaremos a versão default do mesmo, uma vez que é necessário para rodar o Keycloak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tYy33_yZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9q174olijbgjdzblwyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tYy33_yZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9q174olijbgjdzblwyp.png" alt="verificando versão Java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver, não possuímos o java instalado, procederemos com a instalação da versão padrão&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;default-jdk &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apos instalado, vamos verificar se esta tudo ok&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7xFcRiDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxcbozjyayh5woip2ipn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7xFcRiDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxcbozjyayh5woip2ipn.png" alt="verificando versão Java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos baixar e extrair os arquivos do keycloak&lt;br&gt;
*No momento que escrevo esse artigo a versão mais recente é a 14.0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://github.com/keycloak/keycloak/releases/download/14.0.0/keycloak-14.0.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mg7gRHM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im2zko95izipsxlsfgxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mg7gRHM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im2zko95izipsxlsfgxu.png" alt="Baixando Keycloak"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-xvzf&lt;/span&gt; keycloak-14.0.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para uma melhor organização vamos criar uma pasta em /opt para rodar o keycloak&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-xvzf&lt;/span&gt; keycloak-14.0.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos verificar se os arquivos estão no local correto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /opt/keycloak/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M3i6-GpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wl1vuoie1swwfvfcw6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M3i6-GpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wl1vuoie1swwfvfcw6a.png" alt="Listando diretório Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse ponto estamos com o servidor pronto para execução inicial. No próximo artigo vou mostrar como executar de forma  standalone, ou seja, de forma autônoma sem depender de terceiros. Além disso os passos necessários para a configuração inicial. Como o servidor não possui interface gráfica, será necessário realizar um redirecionamento de porta via ssh em uma maquina com navegador para criar o usuário administrador. &lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>postgres</category>
      <category>ubuntu</category>
      <category>nginx</category>
    </item>
    <item>
      <title>Keycloak instalação - P01</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Fri, 23 Jul 2021 01:05:06 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/keycloak-instalacao-281a</link>
      <guid>https://forem.com/pedrostefanogv/keycloak-instalacao-281a</guid>
      <description>&lt;p&gt;Nessa serie de  artigos vou abordar como realizar a instalação e configuração inicial do Keycloak. Ele é uma ferramenta gratuita mantida pela RedHat para gerenciamento identidade e permissões. &lt;/p&gt;

&lt;h2&gt;
  
  
  Parte 01 - Preparando ambiente 
&lt;/h2&gt;

&lt;p&gt;Irei utilizar uma maquina com o Ubuntu server 21.04. Não vou abordar a instalação do SO, segui o padrão. No meu caso o sistema esta em inglês, com isso precisamos mudar o locale para pt-BR para o sistema identifique corretamente a língua usada e não gere conflitos de  acentuação e quebra de carácter invalido.&lt;/p&gt;

&lt;p&gt;Aqui podemos ver o idioma configurado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;locale &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CWsoSGOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nxibmeh17s0uhmdto9vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CWsoSGOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nxibmeh17s0uhmdto9vz.png" alt="Idioma configurado Ubuntu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Idioma definida como padrão&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;locale
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YXIVwvf7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4n49vx5kvh8xnlmhy04n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YXIVwvf7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4n49vx5kvh8xnlmhy04n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instalando e definindo o português como padrão, selecionamos as duas opções disponíveis e definimos como padrão a opção com UTF8&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg-reconfigure locales
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5OBR1qL6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3mh7y5zl0ae6mlawzya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5OBR1qL6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3mh7y5zl0ae6mlawzya.png" alt="Configurando Locales"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wCAiWd5Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4kejyy33o7wynomy1zn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wCAiWd5Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4kejyy33o7wynomy1zn.png" alt="Idioma padrão"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após reiniciar, podemos confirmar que o idioma foi alterado.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z0eX32iW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jo8j3xis6hdqujhhaz14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z0eX32iW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jo8j3xis6hdqujhhaz14.png" alt="Idioma padrão"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>ubuntu</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Nos temos um homelab</title>
      <dc:creator>Pedro Stéfano</dc:creator>
      <pubDate>Tue, 15 Jun 2021 14:54:38 +0000</pubDate>
      <link>https://forem.com/pedrostefanogv/nos-temos-um-homelab-30p2</link>
      <guid>https://forem.com/pedrostefanogv/nos-temos-um-homelab-30p2</guid>
      <description>&lt;h4&gt;
  
  
  Parafraseando um pouco a missão Apolo da NASA,"Houston, we have a problem"; Nos temos um homelab.
&lt;/h4&gt;

&lt;p&gt;Sempre tive a vontade de escrever alguns artigos para a internet, talvez como uma forma de retribuir um pouco o que aprendi pesquisando um pouco pelo google a fora, acredito que tenha chegado a hora. &lt;/p&gt;

&lt;p&gt;Depois de algumas tentativas, montei um pequeno homelab, é singelo em suas configurações, uma única maquina, I3 16G DDR4 e alguns HDs, mas acredito que vá dar oportunidade de brincar com muitas tecnologias que tenho vontade. Pertento falar um pouco de tudo, de questões de infra a programação. Não elaborei como será conduzido mas espero poder compartilhar o que aprendi e ate mesmo para servir de cola em algum momento. Num próximo artigo espero falar sobre o Proxmox que vou utilizar para virtualização, instalação dicas e algumas dificuldades que tive para configura-lo.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
