.NET

Cloud Native e Cloud Agnostic

para rodar .NET em qualquer Cloud
ou sem Cloud sempre de forma profissional!

Últimas publicações

Aqui estão os últimos 12 posts de mais de 500…

A mecânica das decisões

A mecânica das decisões

Chegou a hora de avaliarmos o mercado, a situação na qual estamos e entender quais movimentos são possíveis. Entender friamente o que pode acontecer e quais são os movimentos possíveis nesse tabuleiro, nos permite antecipar ações para minimizar os efeitos de sermos atingidos de surpresa. Esse...

ler mais
Live Coding – Coravel Application Framework

Live Coding – Coravel Application Framework

Pessoal, vamos animar essa quarentena? Essa é a primeira vez que vamos fazer isso e vamos construir essa dinâmica juntos. Eu preciso da sua participação e sua ajuda para definir o roadmap, mas por hora vamos falar sobre tecnologia e ver no que dá! Não tem pauta definida, vamos ver no que vai dar!...

ler mais
Jornada DevHero – REPRISE

Jornada DevHero – REPRISE

Em janeiro de 2019 produzi um evento chamado Jornada Dev Hero. A jornada do desenvolvedor, mostrando o caminho que eu e diversos amigos trilhamos para chegar onde chegamos. Eu achei o conteúdo tão rico e tão importante em termos de mensagem e capacidade de transformação que tinha reais planos de...

ler mais

Fique por dentro e não perca nada

Menos de 10% da audiência recebe o conteúdo publicado

A newsletter é o meio mais eficiente de furar o bloqueio dos algoritmos das redes sociais e fazer o conteúdo chegar até você.

Assim evitamos poluir as comunidades com chamadas para eventos e lives.

Essa é forma mais eficiente de receber meu conteúdo.

Somos mais de 6k inscritos

Projetos Open Source

projetos ativos e projetos antigos disponíveis para estudo

Nenhum resultado encontrado

A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.

Entender | Analisar | Projetar | Desenvolver | Implantar | Manter

A segurança que você busca não está em um tutorial

Para entender uma tecnologia é importante entender o que influenciou sua criação, o que ela faz de fato, como ela faz. Para que então se sinta seguro e confiante a respeito das decisões que está prestes a tomar.

De um lado precisamos compreender o que está sendo feito por baixo dos panos para descobrir como extrair o máximo de uma tecnologia ou, ao menos, não atrapalhar o bom funcionamento dela.

O Cloud Native .NET é uma jornada de descoberta sobre tecnologias e patterns que fazem parte da maioria dos softwares que usamos, que somos usuários e que suportam e toleram altas cargas de trabalho, de forma eficaz, eficiente e sustentável.

 

É primeiro entendendo o que eles fazem, que podemos descobrir oportunidades e evoluir no que fazemos…

Conteúdo

Angular + Docker no Heroku

Angular + Docker no Heroku

Heroku é um daqueles serviços de hospedagem à frente do seu tempo. É pioneiro em desenhar um modelo com foco total no desenvolvedor. Uma Heroku é uma plataforma que te dá a possibilidade de hospedar aplicações a um preço muito competitivo. Exploramos o uso de Docker no heroku para mostrar como...

ler mais
Habilidades do futuro?

Habilidades do futuro?

De um lado as guerras dos frameworks e tecnologias, de outro as guerras de skills e culturas. Cultura DevOps, Agile. Então serverless ou containers? Fullstack é um pato que não corre bem, não nada bem, e não voa bem? Aproveitei essa noite para reler as pesquisas que eu faço anualmente, onde coleto...

ler mais
Rebranding

Rebranding

Hora de acertar a casa, rever os nomes, marcas, páginas, perfis, grupos, tudo! Fim de ano chega e está na hora de rever o que está certo, o que está errado, hora de planejar o próximo ano. No meu caso também errei e também fiz uma lambança com marcas, projetos. Impulsionei alguns, negligenciei...

ler mais
Microsoft Orleans 3.0

Microsoft Orleans 3.0

Sobre esse lançamento vemos algumas novidades, mas eu não abordarei elas. Referenciarei alguns posts e apresentarei o projeto de demonstração que criei no github. Ainda é cedo para aprofundar no tema e lançar um texto profundo sobre Orleans. Além disso acabaria floodando o assunto pois já tem uma...

ler mais

Conheça nosso Podcast

DevShow Podcast

Em 2019 resolvemos criar um podcast, o DevShow Podcast, desde lá são mais de 40 episódios com muito assunto legal, sempre com essa pegada pessoal, falando coisas sérias, mas sem o menor compromisso com a formalidade.

Saiba mais...

.NET

Oragon.Spring no ASP.NET Core – Get Started Tutorial (PT-BR)

Oragon.Spring no ASP.NET Core – Get Started Tutorial (PT-BR)

Quem trabalhou de perto nos meus projetos sabe que tenho uma opinião bem radical a respeito da maioria dos frameworks de injeção de dependência. Aliás, compartilhando contigo minha opinião: Eles fazem injeção de dependência, mas pouco sobre IoC, e podem, diversas vezes ser encarados meramente como Service Locators, o que na minha opinião deixa pobre qualquer implementação que queira se fundamentar em IoC e DI.

ler mais…

Diário de Bordo – Dezembro 2018

Diário de Bordo – Dezembro 2018

Olá pessoal,

trago novidades interessantes que vou compartilhar com vocês.

Oragon

Saiu a versão 1.5.0 do Oragon.Contexts. Oragon.Contexts aglutina os aspectos AOP que dão suporte à Exception Handling e contextos NHibernate. As maiores adições acontecem nos contextos NHibernate que agora suportam:

  • SQL Server
  • MySQL
  • Oracle
  • DB2
  • PostgreSQL NOVO
  • SQLite NOVO

Além das adições, o projeto ganha testes integrados. Isso sinifica que a cada commit, com a ajuda do jenkins e docker, uma nova instância de cada um dos bancos é criada, exclusivamente para validar a implementação. Ainda falta adicionar o DB2 a esse procedimento.

Os testes tem o papel adicional de ser exemplo de implementação.

As configurações estão aqui enquanto, no teste integrado você encontra os testes de aceitação para o acesso a dados. Esses testes garantem que:

  • Os objetos de banco (tabelas, colunas, etc) conseguem ser criados dinamicamente via NHibernate Schema Update.
  • Leitura e escrita são validados nos cenários de mapeamento 1xN, Nx1 e NxN.

Tudo isso em diversas alternativas de leitura e escrita para expor à cenários diferentes de uso da infraestrutura.

Bom, o resultado é maior garantia para as novas releases, além de incrementar o processo de build, possibilitando a criação dinâmica desses recursos, que possivelmente pode virar um projeto de suporte.

Documentação Oragon

#ChegaDeDesculpas é hora de entregar uma documentação que apresente a solução de forma clara. Embora tenha muito interesse em migrar para o DocFX, usei a imagem que mantenho do Confluence e uma licença anual (10 usuários) para iniciar a documentação do projeto. Você pode ver esse processo de documentação crescendo no endereço docs.oragon.io.

MVP

em 1° de Novembro fui nomeado Microsoft MVP na categoria Developer Technologies. Esse é um prêmio dado pelas contribuições à comunidade.

Vamos combinar, é para ser sem estrelismo. Continuo o suporte no Telegram, e nos grupos (veja na home, os grupos que mais contribuo). Tem faltado tempo, principalmente pois estou atendendo um projeto específico fulltime, muitas vezes tendo de viajar. Meio a restruturação de equipe, enfim. Tenho trabalhado com foco extremo na entrega de features, o que me toma um tempo adicional, além do suporte ao time.

Um dos melhores benefícios do programa MVP é a visibilidade, o que para mim se traduz em possibilidade de causar maior impacto. Estar Microsoft Most Valuable Professional abre possibilidades para impactar mais gente e levar ideias mais longe. No meu caso especificamente, adoro diversos produtos Microsoft, e debuto a favor da sua utilização concomitantemente com soluções open source. De RabbitMQ a Jenkins, de NodeJS com Typescript, ou com API Managers, Linux Containers com Docker, open source me fascina e incentivo seu uso, sempre que entendo que traz valor para as soluções que desenho.

Eventos

Como disse acima, as possibilidades de causar impacto com o MVP são maiores, assim a agenda de eventos de Dezembro é insana para a minha experiência.

Dia 4 – DevWeek 2018 – NH + .NET Core

No dia 4, 22h, vou falar de NHibernate e .NET Core. Vou mostrar as features do projeto e apresentar meus argumentos para elegê-lo meu ORM “Oficial” há mais de 10 anos e permanecer considerando-o o único ORM no .NET Core.

Esse evento será no Canal .NET.

#online #gratuito

https://gago.io/evento/devweek-2018-nhibernate/

Dia 5 – Microsoft Monthly meetup – RJ

No dia 5, logo pela manhã, 9h vou falar sobre Computer Vision no mundo corporativo, apresentando os estudos que fizemos e encontramos em 2017 e 2018 e apresento um roadmap do que está sendo planejado para entrar em produção já em 2019.

https://gago.io/evento/microsoft-rio-monthly-meetup-05-12-2018/

#presencial #microsoft #errejota

No dia 5 volto para SP e passo o resto da semana aqui.

Dia 10 – Containers Night #1

Dia 10 estarei em São Paulo falando Estruturando Implantações corporativas com Docker. Na Fujitsu, em São Paulo.

https://www.meetup.com/pt-BR/dotnet-Sao-Paulo/events/256811038/

#presencial #fujissu #essepê

Dias 11-12 – Microsoft Ignite

Aproveitando, na mesma semana começa o Microsoft Ignite, também aqui em SP. Já enviou sua inscrição?

Estarei assistindo ao evento!

https://gago.io/evento/microsoft-ignite-the-tour-sp/

#presencial #sp

Dias 13-14

Nos dias 13 e 14 continuarei em SP para um evento privado (na verdade ainda estou me habituando com os “acessos” à informação, e não sei o que dá para divulgar. Mas saiba que se não estou respondendo suas mensagens, é porque estou em um evento nesse período.

Dia 15 ou 16 – Docker – Aulão Beneficente

Renato Groffe ainda está fechando a data, mas faremos um evento beneficente, online, para arrecadar dinheiro para o Natal NERD. Renato me pediu para ajudar na moderação no Youtube, e me ofereci para falar um pouco. Ainda estamos fechando as datas, preciso criar o evento aqui no site, enfim.

Será pago e 100% do dinheiro será para o Natal Nerd.

Fechando 2018

Acompanho quase que diariamente as visitas aqui do site. E como é um número gerenciável, dá para entender o que cada um busca, quais os interesses, o que tem buscado recorrentemente. O maior problema nesse momento é um projeto em que estou tocando e precisando urgentemente de um arquiteto para tocar o projeto e me deixar volta para Ofertas e Inovação, minha área na Ebix que está parada desde maio desse ano.

Os resultados do ano são positivos e esse dezembro está mais tumultuado do que deveria em virtude de ter adiado minhas férias por conta desse projeto. Eu iria pegar esse período para tirar férias.

Novidades para 2019

2019 já começou para mim! Estou trabalhando nas novas direções que os projetos que estou tocando devem assumir, e novas estratégias para alcançar e apoiar mais gente a entregar mais projetos.

Muita coisa boa está por vir, e conto com o suporte e apoio de vocês.

Feedback

A propósito, sei que alguns me acompanham e gostariam de trocar uma ideia, bater um papo, falar sobre seus problemas. Não hesitem, dou preferência para a utilização do Telegram. Sou mais tímido do que se imagina!

Pessoal, um grande abraço, e continuamos na saga por fazer uma Brasil melhor! Com comunidades mais participativas, mais colaborativas.

Enfim, venha fazer parte disso, todos os links para comunidades estão na home do site.

Underwater – Construindo Libraries .NET Standard Profissionais

Underwater – Construindo Libraries .NET Standard Profissionais

Então você quer lançar uma library no Nuget.Org? Nesse post vou abordar Github Organization (Org), a integração do Org inteiro com seu Jenkins. No Jenkins vou falar de testes unitários, build, deploy, de projetos .NET Core usando Jenkins Pipeline/Jenkinsfile e publicação dos seus pacotes no MyGet e Nuget. Vou abordar cobertura de código e análise com SonarQube, tudo que estou começando a implantar nos meus projetos.

ler mais…

Arquitetura

RabbitMQ – Guia de Estudo Gratuito 2021

RabbitMQ – Guia de Estudo Gratuito 2021

RabbitMQ é simples e incrível. São apenas 4 componentes. Relativamente simples, mas cada um tem detalhes que escondem ouro.

Se você conhece estruturas de filas, pode pensar que já sabe do que se trata. E é aí que mora o engano. O RabbitMQ não é simplesmente uma infraestrutura de filas, é um Message Broker. Essa categoria exige que tenha habilidades que vão muito além de simplesmente possuir filas FIFO. Há detalhes que levariam semanas ou meses para implementar e anos para estabilizar, dependendo da linguagem.

Por isso defendo seu uso nos cenários mais variados.

ler mais…

Containers

Docker – Images vs Layers

Docker – Images vs Layers

Sempre que fazemos um build de uma imagem docker, estamos criando novas layers a cada comando do dockerfile. A última layer de cada build é a layer que identifica aquela imagem, é sob ela que o Docker aplica a tag quando usamos o parâmetro -t {imagename:tagname}, para dar nomes semanticamente eficientes.

Abaixo trago um vídeo bem curtinho, gerado direto do powerpoint para ilustrar esse aspecto.

É só isso, a intenção é apenas ilustrar esse aspecto, facilitando o entendimento. Em breve esse vídeo estará incorporado a um vídeo maior que detalhará o processo de build.

NGINX Automation

NGINX Automation

Se você usa o NGINX em produção, como Reverse Proxy, já se perguntou se seria possível criar algum tipo de automação. Essa é uma demanda pois quanto mais apps passando por ele, mais endereços, mais configurações serão necessárias. Se você usa todo o potencial do NGINX, aí com toda certeza você ficará interessado na automação.

Exemplo de configuração do NGINX:

Para você entender o que estou falando, abaixo tenho um arquivo bem parecido com o que tenho em produção.

#user  nobody;
worker_processes  1;
pid        /run/nginx.pid;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;


events {
    worker_connections  4096;
}

stream {

	#############################################################
	# Stream binds for Container zimbra
	#############################################################
	server { 
    	listen 23; 
    	proxy_pass zimbra:22; 

    }				
	server { 
    	listen 53; 
    	proxy_pass zimbra:53; 

    }				
	server { 
    	listen 110; 
    	proxy_pass zimbra:110; 

    }				
	server { 
    	listen 143; 
    	proxy_pass zimbra:143; 

    }				
	server { 
    	listen 389; 
    	proxy_pass zimbra:389; 

    }				
	server { 
    	listen 465; 
    	proxy_pass zimbra:465; 

    }				
	server { 
    	listen 587; 
    	proxy_pass zimbra:587; 

    }				
	server { 
    	listen 993; 
    	proxy_pass zimbra:993; 

    }				
	server { 
    	listen 995; 
    	proxy_pass zimbra:995; 

    }				
	server { 
    	listen 3443; 
    	proxy_pass zimbra:3443; 

    }				
	server { 
    	listen 9071; 
    	proxy_pass zimbra:9071; 

    }				
	server { 
    	listen 444; 
    	proxy_pass zimbra:443; 

    }				

	#############################################################
	# Stream binds for Container MySQL
	#############################################################
	server { 
    	listen 3306; 
    	proxy_pass MySQL:3306; 

    }				

	#############################################################
	# Stream binds for Container Redis
	#############################################################
	server { 
    	listen 6379; 
    	proxy_pass Redis:6379; 

    }				

	#############################################################
	# Stream binds for Container MongoDB
	#############################################################
	server { 
    	listen 27017; 
    	proxy_pass MongoDB:27017; 

    }				

	#############################################################
	# Stream binds for Container RabbitMQ
	#############################################################
	server { 
    	listen 4369; 
    	proxy_pass RabbitMQ:4369; 

    }				
	server { 
    	listen 25672; 
    	proxy_pass RabbitMQ:25672; 

    }				
	server { 
    	listen 5671; 
    	proxy_pass RabbitMQ:5671; 

    }				
	server { 
    	listen 5672; 
    	proxy_pass RabbitMQ:5672; 

    }				
	server { 
    	listen 15672; 
    	proxy_pass RabbitMQ:15672; 

    }				
	server { 
    	listen 61613; 
    	proxy_pass RabbitMQ:61613; 

    }				
	server { 
    	listen 61614; 
    	proxy_pass RabbitMQ:61614; 

    }				
	server { 
    	listen 1883; 
    	proxy_pass RabbitMQ:1883; 

    }				
	server { 
    	listen 8883; 
    	proxy_pass RabbitMQ:8883; 

    }				
	
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    client_max_body_size 50M;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	#############################################################
    #
    #		HTTP
    #
    #############################################################



	#############################################################
	# HTTP binds for Container LuizCarlosFariaBlog
	#############################################################
	server { 
    	listen 80; 
		server_name  endereco.com.br www.endereco.com.br docker.endereco.com.br;

		location / {
    		proxy_pass http://LuizCarlosFariaBlog:80; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			

	#############################################################
	# HTTP binds for Container javaApp
	#############################################################
	server { 
    	listen 80; 
		server_name  jira.endereco.com.br;

		location / {
    		proxy_pass http://javaApp:8080; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			

	#############################################################
	# HTTP binds for Container zimbra
	#############################################################
	server { 
    	listen 80; 
		server_name  mail.*;

		location / {
    		proxy_pass http://zimbra:80; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			
	


	#############################################################
    #
    #		HTTPS
    #
    #############################################################


	#############################################################
	# HTTPS binds for Container LuizCarlosFariaBlog
	#############################################################
	server { 
    	listen 443 ssl; 
		server_name  endereco.com.br www.endereco.com.br docker.endereco.com.br;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass http://LuizCarlosFariaBlog:80; 
			
			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				

	#############################################################
	# HTTPS binds for Container zimbra
	#############################################################
	server { 
    	listen 443 ssl; 
		server_name  mail.*;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass https://zimbra:443; 
					proxy_set_header X-Real-IP $remote_addr;

			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				
	server { 
    	listen 7071 ssl; 
		server_name  mail.*;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass https://zimbra:7071; 
					proxy_set_header X-Real-IP $remote_addr;

			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				
	


	#############################################################
    #
    #	DEFAULT	
    #
    #############################################################

    server {
        listen       80;
        server_name  xxx;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /nginx_status {
          stub_status;
          #access_log   off;
          #allow 1.1.1.1;
          #deny all;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }


}

Trabalhando com Metadados:

No dia-a-dia você acaba por não ter de dar manutenção nestes arquivos com freqüência, e por isso você acaba por não lembrar de todos os passos necessários ou todas as features possíveis, assim automatizar gera o conforto e reduz o atrito na hora de fazer uma nova configuração no NGINX, a cada vez que você precise adicionar um novo endereço, ou aplicação no stack.

Embora o arquivo do exemplo 1 seja extenso, no dia-a-dia eu não preciso gerenciá-lo diretamente. Usando um script de automação que criei, eu modifico um arquivo json de metadados, executo um comando e pronto: arquivo de configuração gerado e script de recriação do container pronto para ser executado. Abaixo temos o exemplo de metadados, ele está disponível no repositório do projeto, no github.

{
    "NginxContainerName": "EntryPoint",
    "Workers": {
        "Count": 1,
        "Connections" : 4096        
    },
    "Services" :[
		{             
            "ContainerName" : "blog",
            "Enabled" : true,
            "Binds":[
                { "Type": "http", "Port" : 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" },
                { "Type": "https", "HostPort" : 443, "ContainerPort": 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" }
            ]
        },{             
            "ContainerName" : "wso2esb",
            "Enabled" : false,
            "Binds":[
          		{ "Type": "http", "HostPort" : 80, "ContainerPort": 8020, "HostHeaderPattern": "esb.endereco.com.br api.endereco.com.br", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] }
            ]
        },{             
            "ContainerName" : "javaApp",
            "Enabled" : true,
            "Binds":[
                { "Type": "http", "HostPort" : 80, "ContainerPort": 8080, "HostHeaderPattern": "jira.endereco.com.br" }                
            ]
        },{             
            "ContainerName" : "zimbra",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "HostPort" : 23, "ContainerPort": 22 },
                { "Type": "stream", "Port" : 53 },
                { "Type": "stream", "Port" : 110 },
                { "Type": "stream", "Port" : 143 },
                { "Type": "stream", "Port" : 389 },
                { "Type": "stream", "Port" : 465 },
                { "Type": "stream", "Port" : 587 },
                { "Type": "stream", "Port" : 993 },
                { "Type": "stream", "Port" : 995 },
                { "Type": "stream", "Port" : 3443 },
                { "Type": "stream", "Port" : 9071 },
                { "Type": "stream", "HostPort" : 444, "ContainerPort": 443 },
                { "Type": "http", "Port" : 80, "HostHeaderPattern": "mail.*" },
                { "Type": "https", "Port" : 443, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] },                
                { "Type": "https", "Port" : 7071, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] }
            ]
        },{             
            "ContainerName" : "MySQL",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 3306 }
            ]
        },{             
            "ContainerName" : "Redis",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 6379 }
            ]
        },{             
            "ContainerName" : "MongoDB",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 27017 }
            ]
        },{             
            "ContainerName" : "RabbitMQ",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 4369 },
                { "Type": "stream", "Port" : 25672 },
                { "Type": "stream", "Port" : 5671 },
                { "Type": "stream", "Port" : 5672 },
                { "Type": "stream", "Port" : 15672 },
                { "Type": "stream", "Port" : 61613 },
                { "Type": "stream", "Port" : 61614 },
                { "Type": "stream", "Port" : 1883 },
                { "Type": "stream", "Port" : 8883 }
            ]
        }
    ],
    "templates": [
        { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf"  },
        { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh"  }
    ]
}

Sem sombra de dúvidas, o arquivo JSON, acima, apresenta um modelo mais simples e melhor estruturado, tornando fácil criar novas configurações. Mas o NGINX não reconhece esse formato, para isso um script que transforma esse arquivo em 2 outros, o de configuração e o de recriação do container.

O repositório já conta com um arquivo de configuração parecido com esse que está aqui no post, além disso, o resultado do script é o arquivo de configuração “` ./output/nginx.conf “` e um arquivo sh “` ./output/reebuild-container.generated.sh “` , destinado à recriação do container.

O arquivo de configuração segue o exemplo 1, enquanto o script de recriação do container está abaixo no exemplo 3.

#!/bin/bash
docker rm -f EntryPoint

docker run 
-d 
--name EntryPoint 
--hostname EntryPoint 
--network=front 
-p 80:80 -p 443:80 
 
-p 23:22 -p 53:53 -p 110:110 -p 143:143 -p 389:389 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 3443:3443 -p 9071:9071 -p 444:443   -p 7071:7071 
-p 3306:3306 
-p 6379:6379 
-p 27017:27017 
-p 4369:4369 -p 25672:25672 -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 61613:61613 -p 61614:61614 -p 1883:1883 -p 8883:8883 
-v /docker/EntryPoint/config:/etc/nginx/ 
-v /docker/EntryPoint/PageSpeed:/PageSpeed/ 
-v /docker/EntryPoint/logs:/var/log/nginx/ 
-v /docker/Certificados/:/cert/ 
luizcarlosfaria/nginx-pagespeed

sleep 2

docker ps -a --filter "name=EntryPoint"
docker logs EntryPoint

Este repositório é uma base para você criar sua própria automação. Se você usar a imagem luizcarlosfaria/nginx-pagespeed/ você ganha features como:

  • Stream – Possibilidade de usar o NGINX como Reverse Proxy de serviços não HTTP, como Banco de Dados, Redis. Mongo etc. Isso torna mais segura sua infra, na medida que você não precisa criar seus containers com binding para as portas. Habilita somente nos períodos em que precisar.
  • ngx_http_substitutions_filter_module – possibilita a substituição do conteúdo HTTP de uma requisição.
  • Google Page Speed – uma verdadeira bruxaria! O Google Page Speed realiza otimizações no HTML, Javascript de forma coordenada e unificada, permitindo que você melhore aplicações das quais você não tem controle sobre o desenvolvimento.
  • nginx-rtmp-module – NGINX-based Media Streaming Server, desenhado para enconding em realtime.

Os templates de criação estão na pasta ./Templates e devem ser customizados a gosto!

Get Started

Download

Baixe o repositório:

git clone https://github.com/docker-gallery/nginx-pagespeed-automation.git
cd ./nginx-pagespeed-automation
npm install

Customizando os metadados

No arquivo ./data.json substitua ./output/nginx.conf pelo path real onde deve ficar o arquivo de configuração do NGINX.

    "templates": [
        { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf"  },
        { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh"  }
    ]

Customizando script de recriação do container

No arquivo ./templates/nginx-recreate.sh.template.asp fique atento às linhas 8 e 26:

#!/bin/bash
docker rm -f <%= data.NginxContainerName %>

docker run 
-d 
--name <%= data.NginxContainerName %> 
--hostname <%= data.NginxContainerName %> 
--network=front <% 
	var portsInUse = [];
Enumerable.from(data.Services).where("$.Enabled").toArray().forEach(function(service){ 
	var result = Enumerable.from(service.Binds).select(function(bind){
		var bindPort = is.existy(bind.Port)?bind.Port : bind.HostPort;
		var containerPort = is.existy(bind.Port)?bind.Port : bind.ContainerPort;
		var returnValue = "";
		if(Enumerable.from(portsInUse).any(function(it){ return it == bindPort}) == false)
		{
        	portsInUse.push(bindPort);
			return "-p " + bindPort + ":" + containerPort;
		}
		return returnValue;
	}).toArray().join(" "); 
%>
<%= result %> <%
});
%>
-v /docker/EntryPoint/config:/etc/nginx/ 
-v /docker/EntryPoint/PageSpeed:/PageSpeed/ 
-v /docker/EntryPoint/logs:/var/log/nginx/ 
-v /docker/Certificados/:/cert/ 
luizcarlosfaria/nginx-pagespeed

sleep 2

docker ps -a --filter "name=<%= data.NginxContainerName %>"
docker logs <%= data.NginxContainerName %>

Na linha 8 temos a configuração da rede docker usada pelo container, enquanto na linha 26 o bind com o path do volume destinado às configurações do NGINX. Este último precisa ser coerente com path do arquivo gerado.

Executando

Acertando esses pontos para o teu cenário, basta rodar:

node ./index.js

Os arquivos são regerados e você pode executar o script “` ./reebuild-container.generated.sh“` localizado na pasta output. Este script removerá o container chamado EntryPoint, e o recriará, com base nas configurações de portas determinados no seu data.json.

Outras possibilidades

Esse procedimento pode ser automatizado no WebMin, mas isso é um assunto para um segundo post.

Você ainda pode customizar todo o fluxo para gerar outros artefatos, como um docker-compose.yml, por exemplo, e enfim, muito mais.

Forke o projeto no github.

Docker – de A a Z – 16 – SQL Server for Linux

Docker – de A a Z – 16 – SQL Server for Linux

Pessoal,

aqui vai mais um vídeo da série, e dessa vez uma demo, super simples e super rápida sobre o SQL Server for Linux.

Vale lembrar que esse SQL Server on Linux é compatível com os providers e ferramentas que conhecemos e usamos no da-a-dia em qualquer aplicação, sua limitação está nos designers do SQL Server Management Studio (SSMS). E por falar nisso, está aqui o link para download do SSMS, o download tem aproximadamente 900mb.

Se você ainda não pensa em uma utilizada real para o SQL Server for Linux, vale lembrar que a estabilidade do Linux já justificaria uma versão de produção do SQL Server no Linux, mas enquanto estamos em CTP (community technology preview), podemos pensar em:

  • Ambientes de teste
  • Teste integrado para testes de CI e CD
  • Teste de implantação

Bom o céu é o limite. Com um pouco de criatividade, dá para se imaginar muitas formas de se utilizar o SQL Server on Linux!

Aqui está o vídeo!

[UPDATE 26/09/2017]

Hoje fazendo novos testes, revalidando o que havia dito aqui no vídeo percebi que o designer de tabelas já está funcionando perfeitamente no Linux, e com Docker!

Mensageria

Nenhum resultado encontrado

A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.

Conteúdo e Posicionamento

.NET + Cloud Native + Cloud Agnostic

.NET | DevOps | Microservices | Containers | Continuous Delivery

.NET muito além do .NET

O mínimo de infra que todo dev e/ou arquiteto deveria saber

Aplicações distribuídas e comunicação entre serviços (RabbitMQ / gRPC)

Containers, Docker e Kubernetes

+

RabbitMQ e Mensageria e comunicação assíncrona entre aplicações e serviços

Arquitetura de Software e Arquitetura de Solução com foco no melhor aproveitamento em projetos .NET

Nossos números

Desde 2002 trabalhando com desenvolvimento de software

Desde 2002 ajudando outros devs

Desde 2010 trabalhando exclusivamente como arquiteto

Contas atingidas no telegram/facebook

Alunos

Microsoft MVP

2018-2020

2020-2021

2021-2022

2022-2023

2023-2024

2024-2025

Conteúdo Gratuito

Tudo que está aqui no gaGO.io é conteúdo gratuito, feito para ajudar desenvolvedores dos mais variados níveis.

Cursos

Tenho também alguns programas de acompanhamento. Esses programas tem a função de ajudar desenvolvedores em áreas específicas ou de forma mais abrangente na jornada do arquiteto.