.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…
JWT no ASP.NET Core – Standalone
Após o hangout que rolou nessa sexta estávamos discutindo JWT no ASP.NET Core (JSon Web Tokens) e ao apresentar um dos meus projetos cheguei a ficar envergonhado, pois eu havia dado uma certa volta para evitar a utilização de criptografia simétrica e acabei fazendo uma implementação de...
.NET Core – Configurações específicas por SO
Que o .NET Core roda no Windows e no Linux isso é mais que sabido. Mas você pode precisar de configurações específicas por tipo de SO. Paths necessários para executar alguma tarefa podem divergir, e esse é o caso do docker. O endereço da API do Docker Daemon é diferente no Windows e no Linux. No...
.NET Core – de 2.0.0-preview2 para 2.0.0 – Atualizando projetos e Dockerfiles
Vamos direto ao ponto: A intenção desse post é apresentar como migrar seus projetos do .NET Core 2.0-preview2 pra o .NET Core 2.0 RTM. Sim, esse é um tutorial, e visa apresentar o que é necessário para fazê-lo. O .NET Core 2 foi anunciado no dia 14 de agosto e para quem estava usando...
docker-gallery/EnterpriseApplicationLog – v3.0
Em outubro no post Docker - de A a Z - 15 - RabbitMQ, LogStash, ElasticSearch e Kibana com Docker Compose eu apresentei um modelo interessante de Log, com uma abordagem diferente. Ficou muito simples para trabalhar com o stack, no entanto a Elastic.co mudou muita coisa no meio do caminho e foi...
Docker – de A a Z – 18 – NodeJS API com MongoDB
Nesse vídeo damos continuidade à série Docker de A a Z e vou abordar o desenvolvimento com NodeJS, TypeScript, Restify, TSLint, MongoDB e VSCode usando Docker para release e debug, além permitir rodar serviços adicionais como MongoDB entre outros. https://youtu.be/LK9ruCQdBz0 O projeto do gerador...
.NET Core 2.0 e .NET Standard 2.0 Hangout @ Canal.NET
Pessoal, dia 7 de Julho vou participar novamente de um hangout no Canal.NET, desa vez o tema é .NET Core 2.0 e .NET Standard 2.0. O lançamento do .NET Core 2.0, do ASP.NET Core 2.0 e do .NET Standard 2.0 está previsto para os últimos 4 meses de 2017. Acompanhe este hangout para ficar por dentro...
(((((NodeJS + TypeScript + TSLint + Restify) + MongoDB) + Docker) + VSCode ) + Yeoman) = Uma experiência de desenvolvimento incrível!
Esse post foi movido para /blog/projetos/yeoman-generator-node-api-docker-1st-class-experience/
Progressive Web Apps – Coloque no seu roteiro de estudo
Você já se viu tomando decisões simples a respeito de instalar ou não (novamente ou não) um determinado app no seu celular. Os que você menos usa, são os mais eletivos a serem ignorados quando você troca de dispositivo, ou mesmo quando precisa recuperar algum espaço na memória do aparelho. Esse é...
Exception Handling
Pessoal, rolou hoje no Software em Contexto um bate papo sobre Exception Handling muito legal. Nesse papo abordamos exceptions quando lançar, quando não lançar, falamos diversas formas de tratar exceptions, apresentamos códigos e refletimos sobre o que é ou não uma exceção. Qual conclusão...
Docker – de A a Z – 17 – Build and running WSO2 Identity Server
Um dos recursos mais comuns em aplicações corporativas é a gestão de identidade. Ou você implementa na aplicação, ou você utiliza um serviço externo como Auth0, Azure Active Directory ou outros. Quem está próximo das tecnologias Microsoft já ouviu falar do Identity Server (outro projeto), no...
Uma PoC de Sucesso
Esse post não tem o intuito de falar de boas práticas, de abordar padrões, técnicas mirabolantes, ou nada disso. É sobre fazer concessões para obter um resultado, levando em conta recursos disponíveis como know how, equipe e principalmente tempo. Parece familiar? Ok, mas também não é e nem passa...
Contract Package – Uma excelente alternativa ao Service Reference
Falar de WCF em meados de 2017 parece algo sem sentido, no entanto considero relevante tornar públicas soluções e alternativas que muitas vezes só apresentava dentro dos times por onde passei. São soluções, ideias, conceitos que ajudam no desenvolvimento e tornam o dia-a-dia de desenvolvimento...
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
(((((NodeJS + TypeScript + TSLint + Restify) + MongoDB) + Docker) + VSCode ) + Yeoman) = Uma experiência de desenvolvimento incrível!
Esse post foi movido para /blog/projetos/yeoman-generator-node-api-docker-1st-class-experience/
Progressive Web Apps – Coloque no seu roteiro de estudo
Você já se viu tomando decisões simples a respeito de instalar ou não (novamente ou não) um determinado app no seu celular. Os que você menos usa, são os mais eletivos a serem ignorados quando você troca de dispositivo, ou mesmo quando precisa recuperar algum espaço na memória do aparelho. Esse é...
Exception Handling
Pessoal, rolou hoje no Software em Contexto um bate papo sobre Exception Handling muito legal. Nesse papo abordamos exceptions quando lançar, quando não lançar, falamos diversas formas de tratar exceptions, apresentamos códigos e refletimos sobre o que é ou não uma exceção. Qual conclusão...
Docker – de A a Z – 17 – Build and running WSO2 Identity Server
Um dos recursos mais comuns em aplicações corporativas é a gestão de identidade. Ou você implementa na aplicação, ou você utiliza um serviço externo como Auth0, Azure Active Directory ou outros. Quem está próximo das tecnologias Microsoft já ouviu falar do Identity Server (outro projeto), no...
Uma PoC de Sucesso
Esse post não tem o intuito de falar de boas práticas, de abordar padrões, técnicas mirabolantes, ou nada disso. É sobre fazer concessões para obter um resultado, levando em conta recursos disponíveis como know how, equipe e principalmente tempo. Parece familiar? Ok, mas também não é e nem passa...
Contract Package – Uma excelente alternativa ao Service Reference
Falar de WCF em meados de 2017 parece algo sem sentido, no entanto considero relevante tornar públicas soluções e alternativas que muitas vezes só apresentava dentro dos times por onde passei. São soluções, ideias, conceitos que ajudam no desenvolvimento e tornam o dia-a-dia de desenvolvimento...
NodeJS Everywhere
No Microsoft Build 2017 muita coisa legal rolou, fiz uma lista com o que considerei mais interessante, mas aqui vai um vídeo super interessante sobre as capilaridades do NodeJS, e onde e como ele está presente no nosso dia-a-dia. Então, vamos ao vídeo!...
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 no Windows Docker e Windows ainda gera uma série de dúvidas, sobre diversos...
SmtpClient dá lugar a MailKit e MimeKit
No InfoQ foi noticiada a mudança de estratégia em relação ao uso do SmtpClient que aparentemente está descontinuado. Em substituição a Microsoft recomenda os pacotes jstedfast/MailKit e jstedfast/MimeKit. Pela segunda vez, a Microsoft marcou oficialmente uma classe .NET como sendo substituída por...
Microsoft Bot Framework no .NET Core – Alpha
Ao começar esse post estava disposto apenas a apresentar novos packages do Microsoft Bot Framework no .NET Core, que endereçam o desenvolvimento de bots com .NET Core 1.1 e .NET Standard 1.4 e 1.6, já disponíveis em versão alpha no Nuget.org, no entanto como está no meu roadmap reconstruir, já...
Google Cloud Next – 2017
Google Cloud Platform enviou na semana passada um email falando sobre o Google Cloud Next e há muita coisa interessante para falar. Um dos principais aspectos que devo abordar aqui estão centrados nas novas aquisições da google e novos produtos, features e free tier que encontramos no Google Cloud...
A anatomia de um chatbot
Vendo bots com uma visão mais profissional, pude estudar muito e principalmente: experimentar muito. Fiz diversos testes implementando chatbots com C# e Microsoft Bot Framework, sob o .NET Framework, mas também fiz bots em NodeJS, e alguns construídos direto em plataformas web. Testei inúmeras...
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
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.
Arquitetura
Docker – de A a Z – 19 – Youtube Downloader – o projeto
Olá, esse é o vídeo de número 19 da série e vamos abordar um tema incomum: Pizza! Oops brincadeira! Youtube Downloader! A escolha desse projeto se dá pela necessidade de utilizar paralelismo para processar as requisições de download, tratar-se de um projeto não convencional, e precisar de cuidados ortogonais quanto ao design da solução em si. São elementos que fazem desse projeto um projeto divertido e cheio de peculiaridades. A principal característica é sair do mais do mesmo, dos cruds com MongoDB e Redis e mostrar um exemplo mais rico. ler mais…
Docker – de A a Z – 14 – ASP.NET Core from Scratch to Production with docker & jenkins (pt-BR)
Apresento aqui um projeto ASP.NET Core, desde sua criação até sua chegada a produção, com jenkins.
Começamos apresentando as opções de criação do projeto, depois habilitamos a integração com o Docker for Windows. Em seguida adicionamos mongodb ao projeto e começamos a desenhar o build de produção, ainda na máquina de desenvolvimento. Ao concluir o processo de configuração, subo o código para o github e faço o build no jenkins, usando pipeline para realizar build e deploy da nossa aplicação ASP.NET Core.
docker-gallery/EnterpriseApplicationLog – v3.0
Em outubro no post Docker – de A a Z – 15 – RabbitMQ, LogStash, ElasticSearch e Kibana com Docker Compose eu apresentei um modelo interessante de Log, com uma abordagem diferente. Ficou muito simples para trabalhar com o stack, no entanto a Elastic.co mudou muita coisa no meio do caminho e foi necessário readaptar o projeto às novidades da plataforma. Para alegria dos que gostam do projeto que compilei, aqui está a novidade: Revisitei as configuração e acertei o que era necessário para o stack!
A premissa base que me levou à compilar esse stack é criar a possibilidade de utilização desses 5 elementos, sem dor de cabeça. Conectando os pontos, e criando um pacote pré-moldado, todo o entendimento e gerenciamento da plataforma se torna mais simples, e se você quer um stack funcional em minutos, é uma das poucas alternativas.
Eu já fiz pelo menos 2 setups desse stack sem docker e docker-compose e te garanto: é absurdamente traumático, principalmente se quem for executar a tarefa precisa de um documento formal que diga como fazer tudo, from scratch! São 5 elementos, 5 configurações específicas, cada um em um documento, cada um com seus passos em ordem, enfim, um mini-inferno para ambientes mais burocráticos e inviável para quem só quer estudar. Esses motivos me fizeram criar o projeto, permitir que com 3 linhas de comando e alguns segundos, você tenha tudo isso rodando e colaborando em sua infraestrutura.
Sobre os comandos, continuam os mesmos:
git clone https://github.com/docker-gallery/EnterpriseApplicationLog.git cd ./EnterpriseApplicationLog docker-compose up
Entre a primeira release, em outrubro de 2016, e meados de 2017 muita coisa coisa mudou, a Elastic criou seu repositório próprio para imagens docker e lançou algumas releases de seus produtos, com isso muita coisa parou de funcionar, e o stack ficou quebrado. As últimas releases no docker hub causaram essas quebras, mas serviram de alerta.
Agora o stack está aqui novamente!
A release 3.0 do projeto conta com:
- Adequação à mudança de hub.docker.com para docker.elastic.co.
- Revisão das configurações e adequação para as novas versões dos produtos.
- Update do RabbitMQ indo para a versão baseada em apline.
- Remoção do Xpack (o stack ELK é open source, no entanto o Xpack é um pacote pago).
Se quer conferir, rode as linhas de comando acima, ou visite o repositório que está disponível no GitHub. Esse projeto não possui imagem própria, apenas configura imagens do hub.docker.com e agora do docker.elastic.co.
(((((NodeJS + TypeScript + TSLint + Restify) + MongoDB) + Docker) + VSCode ) + Yeoman) = Uma experiência de desenvolvimento incrível!
Esse post foi movido para /blog/projetos/yeoman-generator-node-api-docker-1st-class-experience/
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.
Containers
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.
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.
















