.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…
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...
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...
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...
Comprometa-se a tomar a melhor decisão
Todos os dias, ou quase todos, no suporte à comunidade vemos um estereótipo: Muita informação para absorver, muitos assuntos para estudar, pouco conhecimento e a busca pela "a solução ideal" em busca de um atalho para o sucesso. Essa ideia se pauta na esperança de que se fizer a escolha certa, a...
DevWeek 2019 | Canal .NET
O Canal .NET apresenta pelo 5° ano consecutivo o DevWeek. O evento começa hoje, segunda-feira e termina nessa quarta. Convidados São 4 convidados que falarão sobre Desenvolvimento Móvel, ASP.NET Core, Blazor e Prometheus! Canal .NET #completo Dessa vez, nosso time do Canal .NET está completo, sem...
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...
Docker Definitivo – Janela de Inscrição Aberta!
Na tarde desse domingo, dia 27/out alcançamos o limite de alunos.As inscrições para a primeira turma estão encerradas!Cadastre-se para receber notícias, link das lives e para participar do grupo do facebook. Em 2015 eu conduzi um projeto de refactoring daqueles complicados. Ao todo foram quase 10...
Dapr – Distributed Application Runtime – Primeiras Impressões
Nessa quarta-feira a Microsoft anunciou no Open Source Blog um projeto curioso chamado Dapr. Entre os principais pontos, o que me chama a atenção é que tem muita cara de servidor de aplicação/componente. E isso de certa forma me chama a atenção pelas possibilidades. Na versão alpha, versão atual,...
OSBAPI – Open Service Broker API
Em um mundo conectado, com cada vez mais soluções SaaS e PaaS. Há uma boa tendência e convergência em iniciativas que visam criar marketplaces de soluções. Compondo serviços dos mais variados estendendo as capacidades de nuvens públicas e privadas. Ao mesmo tempo, nunca estivemos tão conectados e...
CNAB – Cloud Native Application Bundle
No post anterior eu falei sobre Open Application Model (OAM) o que me leva a falar de CNAB comparando-o com OAM. Sobre uma perspectiva de empacotamento e nascendo um pouco antes do OAM, a Docker, HashiCorp, e Bitnami criaram a CNAB - Cloud Native Application Bundle (que agora conta também com...
Open Application Model
2019 tem sido um ano intenso, cheio de novidades e muitos novos padrões e standards. Kubernetes já se consolidou como plataforma de orquestração default há alguns anos e agora o movimento que vemos é na linha de criação de standards sobre o Kubernetes. Por outro lado, essa nova leva de padrões e...
Post Resposta: POR QUE ADOTAR KAFKA PARA MENSAGERIA?
Esse é um post resposta ao post POR QUE ADOTAR KAFKA PARA MENSAGERIA? do Elemar JR no site da Eximia, sua empresa. A resposta estava ficando longa demais, e resolvi transformar em post. Principalmente por se tratar de um conteúdo (RabbitMQ) que está no meu toolset, assim como Kafka está para...
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 tutorialPara 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
Docker Definitivo – Janela de Inscrição Aberta!
Na tarde desse domingo, dia 27/out alcançamos o limite de alunos.As inscrições para a primeira turma estão encerradas!Cadastre-se para receber notícias, link das lives e para participar do grupo do facebook. Em 2015 eu conduzi um projeto de refactoring daqueles complicados. Ao todo foram quase 10...
Dapr – Distributed Application Runtime – Primeiras Impressões
Nessa quarta-feira a Microsoft anunciou no Open Source Blog um projeto curioso chamado Dapr. Entre os principais pontos, o que me chama a atenção é que tem muita cara de servidor de aplicação/componente. E isso de certa forma me chama a atenção pelas possibilidades. Na versão alpha, versão atual,...
OSBAPI – Open Service Broker API
Em um mundo conectado, com cada vez mais soluções SaaS e PaaS. Há uma boa tendência e convergência em iniciativas que visam criar marketplaces de soluções. Compondo serviços dos mais variados estendendo as capacidades de nuvens públicas e privadas. Ao mesmo tempo, nunca estivemos tão conectados e...
CNAB – Cloud Native Application Bundle
No post anterior eu falei sobre Open Application Model (OAM) o que me leva a falar de CNAB comparando-o com OAM. Sobre uma perspectiva de empacotamento e nascendo um pouco antes do OAM, a Docker, HashiCorp, e Bitnami criaram a CNAB - Cloud Native Application Bundle (que agora conta também com...
Open Application Model
2019 tem sido um ano intenso, cheio de novidades e muitos novos padrões e standards. Kubernetes já se consolidou como plataforma de orquestração default há alguns anos e agora o movimento que vemos é na linha de criação de standards sobre o Kubernetes. Por outro lado, essa nova leva de padrões e...
Post Resposta: POR QUE ADOTAR KAFKA PARA MENSAGERIA?
Esse é um post resposta ao post POR QUE ADOTAR KAFKA PARA MENSAGERIA? do Elemar JR no site da Eximia, sua empresa. A resposta estava ficando longa demais, e resolvi transformar em post. Principalmente por se tratar de um conteúdo (RabbitMQ) que está no meu toolset, assim como Kafka está para...
Oragon Spring 2.0
Finalmente trago o Spring.NET em seu fork Oragon.Spring para o .NET Standard 2.1 e ASP.NET Core 3.0. Nos últimos anos tenho me dedicado a falar mais de arquitetura de solução do que arquitetura de software em si. Cada vez que peso os estudos em uma das duas direções, me afasto da outra. E assim...
Proxy Reverso: Pra quê? Por quê?
Você já nos viu falando de Proxy Reverso, em geral usamos NGINX nessa tarefa, mas afinal? Pra quê isso? Por que "isso" é necessário? Para que fique claro, precisamos voltar no tempo e revisitar alguns assuntos. Vou dar uma pincelada em assuntos como DHCP, DNS, e alocação de portas. É fundamental...
The Microservices Journey – S1E2
No post passado eu citei alguns elementos que precisam ser levados em conta, e não detalhei muita coisa. Só narrei causa e efeito. Hoje eu vou listar o material que já produzi que tem alguma ligação com o tema. Direta ou indiretamente, são elementos que vão ajudar a esclarecer como essa jornada, e...
The Microservices Journey – S1E1
Ainda não estruturei como uma jornada, portanto o começo dessa jornada é um brainstorm. Como toda jornada onde sabemos o destino, mas temos um caminho desconhecido, vamos buscando do horizonte curto para o distante e do horizonte distante para o curto, aproximando e reduzindo a área de...
Consciência Crítica vs Comportamento de Manada
Tomar decisões implica, ou deveria implicar, em conhecimento prévio somado ao discernimento e ponderação a respeito dos impactos e reflexos de cada decisão. Se você não está ponderando sobre suas próprias decisões, alguém está fazendo por você. Direta ou indiretamente. Nos resta saber se estamos...
Docker – de A a Z – 20 – Volume TMPFS – o poder do file system em memória
Uma das coisas lindas do Linux é a separação volumes e file system. E você não faz ideia do que dá para fazer com file system em memória!!!? No windows quando escrevemos no C: sabemos que estamos escrevendo em um disco ou no máximo em um raid. Não importa qual path seja. No linux, não é assim que...
Conheça nosso Podcast
DevShow PodcastEm 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.
.NET
Oragon.Spring
Se você caiu de paraquedas aqui e não entendeu nada do assunto, calma eu vou explicar. O Spring.NET é um container IoC super robusto, mas não caiu na graça da comunidade. Uns reclamam de lentidão, outros reclamam do xml outros reclamam por ter sido inspirado no Spring do java. Eu gosto e defendo sua abordagem, o Spring.NET é alicerce das minhas arquiteturas no .NET Framework, e já faz muito tempo que sinto falta dele no .NET Standard / .NET Core. No post Spring.NET o Renascimento eu fiz um overview sobre o assunto, mas há muito mais assuntos relacionados quando olhamos para tags como Dependency Injection, DI, Inversion Of Control, IoC, e claro, não poderia faltar Spring.NET. A questão é: Agora, oficialmente, estou tocando um fork do projeto, quer participar? Fale comigo!
5 atitudes infalíveis para fracassar em um projeto de software
Você já deve ter lido 5 formas de obter sucesso em blablabla, mas com uma quantidade tão de grande de projetos fracassados, não fracassar é um bom começo. A propósito, existem milhares de atitudes infalíveis para se obter o fracasso, a pior é não fazer nada! Mas se você chegou até aqui, você não é daqueles que desistem, então vou listar para você 5 das atitudes negativas que levam qualquer projeto ao fracasso!
Oragon Architecture Is Dead
Estamos no finalzinho de abril de 2018, vésperas do Microsoft Build e estou retomando meus trabalhos no Oragon Architecture. O projeto foi muita coisa, teve muitas ambições, mas agora é hora de revisitar todos os assuntos do projeto, passar por um momento de introspecção para dar um novo formato e rumo à solução.
Portanto, a partir de hoje todos os posts referentes ao que era o Oragon Architecture passam a ficar privados no blog e em um futuro, que espero não ser tão distante, pretendo relançar o projeto, com novas features.
Vale lembrar que o projeto não é um simples framework sob o Spring.NET junto com ele há uma filosofia a respeito da modelagem de projetos e abstrações, abstrações estas que facilitam a modelagem, da mesma forma que o torna extremamente eficaz e eficiente no papel de compor complexas arquiteturas de forma transparente e funcional com baixo overhead.
Há muita coisa a se fazer, mas mais importante que o projeto em si, é essa filosofia.
Message Broker & .Net Core – Introdução ao RabbitMQ
Pessoal, no dia 15/Fev batemos um papo no Canal .NET com o título Message Broker & .Net Core – Introdução ao RabbitMQ. Nesse bate-papo apresentamos RabbitMQ como Message Broker, mas com foco no AMQP, que por sua vez desponta como principal standard, amplamente utilizado e implementado por diversos serviços, projetos e produtos, oferecendo maior flexibilidade na hora de escolher sua implementação de message broker.
Na narrativa abordei modelos de integração mais antigos, até uma implementação com AMQP, mostrando features, e algumas dicas valiosíssimas que ajudam no entendimento de alguns elementos, que a princípio parecem não fazer muito sentido, mas depois se mostram valiosíssimos dada a sua simplicidade e flexibilidade.
Hangout (Gravado)
Se você quer saber mais sobre RabbitMQ, AMQP, e conhecer algumas demonstrações de uso, fique de olho aqui no site pois tem muito conteúdo a respeito.
Apresentação
[slideshare id=88038393&doc=20-rabbitmq-180215092334]
Demos e Código Fonte
RabbitMQ – Exemplos de Setup
RabbitMQ no Docker (Este projeto consistem em um conjunto de dockerfiles que demonstram as diversas formas de configurar e habilitar plugins no RabbitMQ)
No github separei em um modelo gradativo do mais simples para o mais complexo, adicionando features a cada nova pasta: Gradualmente adicionei vhosts à configuração, depois volumes, plugins (management, mqtt, stomp, nativo e com suporte web), até termos uma instância full featured.
Apresentei também demos com AMQP + .NET Core além de MQTT e STOMP usando as páginas de exemplo que vão embarcadas no RabbitMQ.
O código está no meu github: https://github.com/luizcarlosfaria/CanalDotNet-MessageBroker
Youtube Downloader
As demos anteriores são muito boas, mas precisava mostrar algo mais “real”, então apresentei esse projeto. Esse foi um projeto que serviu de narrativa entre dezembro e fevereiro, me ajudando a apresentar cenários reais de uso de RabbitMQ entre outros diversos elementos. A segunda demonstração foi pautada sob esse projeto e seu código fonte está disponível no github.
https://github.com/luizcarlosfaria/youtube-downloader
Chakra on .NET Core with Docker
Scripting pode não ser uma demanda corriqueira, mas há momentos em que sua flexibilidade faz jus à sua utilização. Seja para deixar alguma pequena parte de sua aplicação mais flexível ou para poder suportar extensibilidade, há cenários bons para seu uso. Hoje vou abordar como usar o JSRT (Javascript Runtime) da Microsoft, motor do Microsoft Edge, o Chakra em uma aplicação .NET Core, rodando em um container linux com Docker.
Arquitetura
Ring Buffer – Antecipe, otimize e evite custos excessivos
Ring Buffer, também chamado de Circular Buffer é uma estrutura de dados muito poderosa. Seu nome já traz o spoiler e entrega o ouro, afinal não deixa de ser um buffer, só que trabalhando em formato de anel/circular. Se você não faz ideia do que seja, vem comigo nessa viagem pois vamos dissecar o assunto e ainda compará-la ao processo de uberização dos objetos custosos.
(mais…)
Docker no WSL² – Walkthrough
No post anterior eu contei um pouco da história do projeto, mas agora é hora de olharmos para ele de fato. Que tal um passeio no parque com o WSL2?
ler mais…
Enfim Generally Available do WSL2 que chega ao Windows 10 na versão 2004
A maior expectativa que eu tinha nos últimos anos era esse lançamento: WSL2 em Generally Available. Ficou fantástico!
ler mais…
.NET no Linux, vale a pena?
A gente está a tanto tempo nessa batida, que nem nos questionamos mais, mas há muita gente que ainda tem dúvidas ou precisa de argumentos. Enquanto de um lado sequer cogitamos fazer deploy de aplicações .NET Core no Windows, por outro há quem ainda tenha medo de sair do windows.
ler mais…
DevWeek 2019 | Canal .NET
O Canal .NET apresenta pelo 5° ano consecutivo o DevWeek. O evento começa hoje, segunda-feira e termina nessa quarta.
Convidados
São 4 convidados que falarão sobre Desenvolvimento Móvel, ASP.NET Core, Blazor e Prometheus!
Canal .NET #completo
Dessa vez, nosso time do Canal .NET está completo, sem desfalques! Uhuuuuu!!!
Aqui fica meu convite, se inscreva pelo meetup para saber mais sobre o evento.
Fica aqui meu convite! Compartilhe esse post com alguém, principalmente se essas tecnologias fizerem sentido para o projeto dela.
A propósito, vou falar de RabbitMQ. Tem uma série super legal aqui no site.
Os 8 primeiros posts da série sobre RabbitMQ já estão no ar.
📍#1 Prefácio
https://gago.io/blog/rabbitmq-amqp-1-prefacio/
📍#2 Pra que mensageria?
https://gago.io/blog/rabbitmq-amqp-2-pra-que-mensageria/
📍#3 Conceitos
https://gago.io/blog/rabbitmq-amqp-3-conceitos/
📍#4 Perguntas e Respostas
https://gago.io/blog/rabbitmq-amqp-4-qna/
📍#5 Management UI, Filas e Exchanges
https://gago.io/blog/rabbitmq-amqp-5-management-ui-filas-e-exchanges/
📍#6 – Show me the code
https://gago.io/blog/rabbitmq-amqp-6-show-me-the-code/
📍#7 – Pipelines & Youtube Downloader
https://gago.io/blog/rabbitmq-amqp-7-pipelines-youtube-downloader/
📍 #8 – RabbitMQ & AMQP – Redis, um Message Broker?
https://gago.io/blog/rabbitmq-amqp-8-redis/
Até mais tarde!
Containers
Windows Subsystem for Linux & Docker
Ao longo de 2016 fiz uma série de vídeos sobre docker, da qual devo retomar nas próximas semanas. Nesse post vou abordar exclusivamente Docker e Windows Subsystem for Linux. Acho que vai ajudar a esclarecer!
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 + WebMin
No post NGINX Automation eu falei sobre como criar uma automação que lhe facilite na gestão do NGINX. Agora vou abordar, em forma de tutorial, como usar essa solução no webmin.
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
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
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.

























