Configurar Discourse - Ambiente AWS Linux 2 AMI e Apache2 (httpd)

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

  1. Abra o CMD / Terminal

  2. Faça SSH na instância AWS EC2

Exemplo de tela após conectar à instância EC2

REALIZAR ATUALIZAÇÕES DO SISTEMA

  1. Realize atualizações do sistema executando o seguinte comando no console / terminal

$ sudo yum update

INSTALAR DOCKER

  1. Pesquise o pacote Docker da AWS executando o seguinte comando no console / terminal

$ sudo yum search docker

  1. Obtenha informações da versão executando o seguinte comando no console / terminal

$ sudo yum info docker

  1. Instale o Docker executando o seguinte comando no console / terminal

$ sudo yum install docker

  1. 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
  1. 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
  1. Ative o serviço do Docker para iniciar automaticamente na inicialização executando o seguinte comando no console / terminal

$ sudo systemctl enable docker.service

  1. Inicie o serviço do Docker executando o seguinte comando no console / terminal

$ sudo systemctl start docker.service

  1. 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

  1. Crie a pasta do Discourse

$ sudo mkdir /var/discourse

  1. 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

  1. Copie o arquivo standalone.yml para a pasta containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. 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"
  1. 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.

  1. 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

  1. 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>
  1. 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.