INSTALAÇÃO DO DOCKER E DO DISCOURSE NA AWS EC2 LINUX COM REVERSE PROXY HTTPD EXISTENTE
Olá a todos,
Consegui resolver. Voltei à estaca zero e comecei do zero com uma instalação limpa do Docker e do Discourse. Meu processo está detalhado abaixo:
Pressupostos
• Você já possui uma instância Linux AWS EC2
• Você pode acessar sua instância EC2 via SSH
• O Apache 2 já está configurado e em execução no seu servidor
ACESSAR SUA INSTÂNCIA EC2 VIA SSH
-
Abra o CMD / Terminal
-
Faça SSH na instância AWS EC2
Exemplo de tela após conectar à instância EC2
REALIZAR ATUALIZAÇÕES DO SISTEMA
- Realize atualizações do sistema executando o seguinte comando no console / terminal
$ sudo yum update
INSTALAR DOCKER
- Pesquise o pacote Docker da AWS executando o seguinte comando no console / terminal
$ sudo yum search docker
- Obtenha informações da versão executando o seguinte comando no console / terminal
$ sudo yum info docker
- Instale o Docker executando o seguinte comando no console / terminal
$ sudo yum install docker
- Adicione a associação ao grupo para o usuário padrão ec2-user para que você possa executar todos os comandos do Docker sem usar o comando sudo, executando o seguinte comando no console / terminal
$ sudo usermod -a -G docker ec2-user
$ id ec2-user
# Recarregue as atribuições de grupo de um usuário Linux para o Docker sem fazer logout
$ newgrp docker
- Instale o docker-compose executando o seguinte comando no console / terminal
# 1. Obtenha o pip3 (pacote instalador do Python)
$ sudo yum install python3-pip
# 2. Em seguida, execute qualquer um dos seguintes comandos
$ sudo pip3 install docker-compose # com acesso root
# OU
$ pip3 install --user docker-compose # sem acesso root por motivos de segurança
# Verifique as permissões
$ sudo chmod -v +x /usr/local/bin/docker-compose
- Ative o serviço do Docker para iniciar automaticamente na inicialização executando o seguinte comando no console / terminal
$ sudo systemctl enable docker.service
- Inicie o serviço do Docker executando o seguinte comando no console / terminal
$ sudo systemctl start docker.service
- Verifique se o serviço do Docker está em execução executando o seguinte comando no console / terminal; a saída será semelhante a esta
Comandos básicos do Docker que é bom saber:
# Versão do Docker
$ docker version
# Versão do Docker Compose
$ docker-compose version
# Iniciar serviço do Docker
$ sudo systemctl start docker.service
# Parar serviço do Docker
$ sudo systemctl stop docker.service
# Reiniciar serviço do Docker
$ sudo systemctl restart docker.service
# Status do serviço do Docker
$ sudo systemctl status docker.service
INSTALAR DISCOURSE
- Crie a pasta do Discourse
$ sudo mkdir /var/discourse
- Clone a imagem Docker do Discourse para o diretório recém-criado
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
- Copie o arquivo standalone.yml para a pasta containers
$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml
- Edite o novo arquivo discourse.yml conforme abaixo (as partes importantes são as portas expostas para HTTP e os detalhes de e-mail para SMTP; modifique no arquivo, não copie e cole)
Opções de edição:
1. Você pode usar o nano e editar via linha de comando / terminal
2. Na AWS, se estiver usando MATE com PLUMA, pode usar o PLUMA para editar o arquivo
3. Você pode usar o WINSCP para fazer SSH na máquina e editar o arquivo via GUI do Windows
## este é o modelo de contêiner Docker Discourse tudo-em-um, standalone
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild app
##
## TENHA MUITO CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
## Descomente a próxima linha para habilitar o ouvinte IPv6
#- "templates/web.ipv6.template.yml"
- "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar o Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## quais portas TCP/IP este contêiner deve expor?
## Se você deseja que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
- "8080:80" # http (executar na porta local 8080, porta do Docker 80)
#- "443:443" # https (certifique-se de que isso esteja comentado)
params:
db_default_text_search_config: "pg_catalog.english"
## Defina db_shared_buffers para no máximo 25% da memória total.
## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode substituir
#db_shared_buffers: "256MB"
## pode melhorar o desempenho de classificação, mas adiciona uso de memória por conexão
#db_work_mem: "40MB"
## Qual revisão do Git este contêiner deve usar? (padrão: tests-passed)
#version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Quantas solicitações web simultâneas são suportadas? Depende da memória e dos núcleos da CPU.
## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
#UNICORN_WORKERS: 3
## TODO: O nome de domínio ao qual esta instância do Discourse responderá
## Obrigatório. O Discourse não funcionará com um número IP puro.
DISCOURSE_HOSTNAME: 'faq.mobiloan.io'
## Descomente se quiser que o contêiner seja iniciado com o mesmo
## nome de host (opção -h) especificado acima (padrão "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Lista de e-mails separados por vírgula que serão feitos administradores e desenvolvedores
## no exemplo de cadastro inicial 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'insira o e-mail aqui'
## TODO: O servidor de e-mail SMTP usado para validar novas contas e enviar notificações
# ENDEREÇO SMTP, nome de usuário e senha são obrigatórios
# AVISO: o caractere '#' na senha SMTP pode causar problemas!
DISCOURSE_SMTP_ADDRESS: INSIRA O SMTP AQUI
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: INSIRA O NOME DE USUÁRIO AQUI
DISCOURSE_SMTP_PASSWORD: INSIRA A SENHA AQUI
DISCOURSE_SMTP_ENABLE_START_TLS: true # (opcional, padrão true, usamos Amazon SES)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com # (obrigatório por alguns provedores)
#DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com # (endereço para enviar notificações)
## Se você adicionou o modelo Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## O endereço CDN http ou https para esta instância do Discourse (configurado para buscar)
## consulte https://meta.discourse.org/t/14857 para detalhes
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## A chave de endereço IP do Maxmind para geolocalização para pesquisa de endereço IP
## consulte https://meta.discourse.org/t/-/137387/23 para detalhes
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## O contêiner Docker é sem estado; todos os dados são armazenados em /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Plugins vão aqui
## consulte https://meta.discourse.org/t/19157 para detalhes
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Quaisquer comandos personalizados para executar após a construção
run:
- exec: echo "Início dos comandos personalizados"
## Se você quiser definir o endereço de e-mail 'De' para seu primeiro registro, descomente e altere:
## Após receber o primeiro e-mail de inscrição, comente novamente a linha. Só precisa ser executado uma vez.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Fim dos comandos personalizados"
- Após editar e salvar o arquivo, reconstrua o aplicativo Discourse usando o seguinte comando no terminal
$ /var/discourse/launcher rebuild discourse
Nota: se o seu arquivo YAML tiver outro nome, substitua discourse pelo nome do seu arquivo YAML.
Nota que a reconstrução leva tempo.
- Após o aplicativo ter sido reconstruído, ele deve estar em execução na porta 8080. Para verificar isso, execute o seguinte comando no terminal
$ sudo lsof -i -P -n | grep LISTEN
Exemplo de saída de portas
Observe que o Docker está escutando na porta 8080 e o httpd (Apache) está escutando na porta 80.
Em termos de roteamento de tráfego, o Apache receberá a solicitação web e, quando apropriado, será roteado para o contêiner do Discourse na porta 8080.
Para garantir que o roteamento ocorra, você deve configurar o host virtual no arquivo de configuração do Apache.
CONFIGURAÇÃO DE HOST VIRTUAL DO APACHE
- O arquivo de configuração do Apache está localizado em /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 são versões diferentes do Apache. Seus arquivos podem estar em locais diferentes se você não estiver usando o serviço httpd, mas a configuração do host virtual, neste caso, será a mesma.
Opções de edição:
1. Você pode usar o nano e editar via linha de comando / terminal
2. Na AWS, se estiver usando MATE com PLUMA, pode usar o PLUMA para editar o arquivo
3. Você pode usar o WINSCP para fazer SSH na máquina e editar o arquivo via GUI do Windows
Edite o arquivo /etc/httpd/conf.d/00-virtualhosts.conf adicionando o seguinte:
# FAQ (ROTEAMENTO DO DISCOURSE)
<VirtualHost *:80>
ServerName sub.domain.com
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8080/"
ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
- Você precisa criar o registro DNS CNAME relevante, apontando o subdomínio para seu servidor AWS / balanceador de carga.
Nossa configuração é um pouco complicada, pois temos nosso provedor de domínio que aponta e roteia todo o tráfego para um balanceador de carga AWS.
O balanceador de carga lida com nosso SSL/TLS por meio de um certificado fornecido pela AWS.
O balanceador de carga também roteia o tráfego para a instância AWS.
O Apache está instalado na instância AWS e roteia o tráfego para nossos:
- Aplicações Node express
- Aplicação Docker / Discourse.
CONCLUSÃO
Esta é apenas uma solução, mas é a que funcionou com nossa configuração existente.
Um grande agradecimento a:
@Kane York pelo seu artigo sobre o Discourse,
@Axel Fernandes pelo seu artigo no Medium, suas notas sobre o download dos arquivos necessários do Discourse e
@Vivek Gite da nixCraft e seu artigo no Cyberciti sobre a instalação do Docker no AWS Linux 2.


