Tutoriais de VPS
Criar um fórum Discourse em VPS (2026): Docker, HTTPS com domínio, SMTP, backups e atualizações
Crie um fórum comunitário em um VPS Ubuntu usando o instalador Docker oficial do Discourse, cobrindo escolha de configuração, domínio e HTTPS automático, envio por SMTP, Cloudflare, backup e restauração, reforço de segurança, atualizações e solução de problemas comuns.

O Discourse é adequado para criar comunidades de produto, fóruns de usuários, sites de perguntas e respostas de conhecimento e comunidades de assinatura paga. Ele já vem com categorias, tags, busca de texto completo, níveis de confiança, moderação, notificações e PWA para celular, o que o torna mais completo do que montar plugins de fórum do WordPress do zero, mas também exige mais em memória, entregabilidade de e-mail e manutenção diária.
Este artigo usa o método de instalação Docker oficialmente suportado do Discourse para concluir domínio, HTTPS automático, cadastro do administrador, SMTP, backups, atualizações e solução de problemas comuns em um VPS Ubuntu novo. O requisito mínimo oficial atual é 1 núcleo, 1 GB de memória mais Swap e 10 GB de disco; para produção, recomenda-se começar com 2 núcleos, 2 GB e 20 GB SSD.
| Cenário | Adequado | Explicação |
|---|---|---|
| Comunidades de suporte de produto, fóruns de usuários | Adequado | Categorias, tags, busca, moderação e notificações completas |
| Comunidades de alunos de cursos, troca entre membros | Adequado | Permite restringir cadastro, convidar usuários e integrar login de terceiros |
| Blogs de conteúdo puro | Não prioritário | Sistemas de publicação como WordPress e Ghost são mais diretos |
| Apenas algumas dezenas de páginas estáticas de perguntas e respostas | Possivelmente exagerado | O Discourse executa Rails, PostgreSQL, Redis e Sidekiq ao mesmo tempo |
| Necessidade de modo lista de discussão | Adequado, mas é preciso configurar e-mail | SMTP, tratamento de rejeições e domínio de envio precisam ser confiáveis |
O Discourse não é um programa PHP comum e não permite criar um site com o painel BaoTa e enviar o código-fonte para concluir a instalação. O suporte oficial é apenas a implantação baseada em Docker, e recomenda-se um VPS Linux de 64 bits dedicado e limpo.
O instalador oficial ajusta automaticamente os Unicorn Workers e os Shared Buffers do PostgreSQL conforme a CPU e a memória. A configuração mínima pode ser usada para testes, mas na operação pública convém reservar espaço para o banco de dados, o processamento de imagens, a busca e as compilações de atualização.
| Escala de uso | Configuração recomendada | Situação aplicável |
|---|---|---|
| Testes, ensaios de migração | 1 núcleo 1 GB, 2 GB Swap, 20 GB SSD | Apenas para poucos usuários e validação de curto prazo |
| Comunidade pública pequena | 2 núcleos 2-4 GB, 40 GB SSD | Poucos usuários ativos diários, poucos anexos |
| Comunidade média | 4 núcleos 8 GB, 80 GB+ NVMe | Mais plugins, busca, imagens e concorrência |
| Comunidade grande | Web, banco de dados e Redis separados | Requer monitoramento, armazenamento de objetos, CDN e planejamento profissional de capacidade |
O disco não deve ser calculado apenas pelo tamanho do programa. Envios de usuários, backups automáticos, imagens Docker, logs e arquivos temporários durante atualizações crescem continuamente. Se você ainda não definiu as especificações, pode começar pelo guia de escolha de configuração de VPS.
Prepare o seguinte:
- Um VPS Ubuntu 24.04 LTS ou Debian novo;
- Acesso SSH root e um IPv4 público;
- Um domínio já apontado para o VPS, por exemplo
forum.example.com; - Um serviço de e-mail transacional disponível, ou usar temporariamente o login com Discourse ID;
- Um snapshot do provedor ou outra opção de reversão.
Adicione um registro A para o domínio:
forum.example.com A 203.0.113.10
Verifique a resolução e o uso de portas:
dig +short forum.example.com A
sudo ss -lntp | grep -E ':(80|443)\b' || true
free -h
df -h
80 e 443 precisam estar disponíveis. Se o servidor já executa Nginx, Apache, Caddy, BaoTa ou outro painel, não execute o instalador diretamente; conflitos de porta farão a verificação de conexão e a emissão do HTTPS falharem.
O firewall na nuvem só precisa abrir:
| Porta | Uso | Recomendação |
|---|---|---|
| 22/TCP | Gerenciamento SSH | Restringir aos IPs de administração é mais seguro |
| 80/TCP | HTTP, validação de certificado | Permitir acesso público |
| 443/TCP | Fórum HTTPS | Permitir acesso público |
PostgreSQL e Redis não devem ser expostos diretamente à internet.
Um VPS de 1 GB ou 2 GB pode esgotar a memória facilmente ao compilar imagens, atualizar e reconstruir contêineres. O instalador oficial pode criar Swap em máquinas de pouca memória, ou você pode configurá-lo manualmente com antecedência:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/30-discourse-swap.conf
sudo sysctl --system
free -h
O Swap apenas reduz a probabilidade de OOM repentino; não substitui a memória física. Quando o fórum usa Swap com frequência ou responde visivelmente mais devagar, convém ampliar a configuração em vez de continuar aumentando o Swap.
O comando de instalação rápida oficial atual do Discourse é:
wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash
Se preferir revisar o script antes de executá-lo, você pode dividi-lo em duas etapas:
curl -fsSL https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse -o install-discourse
less install-discourse
sudo bash install-discourse
O instalador verifica os recursos do sistema, instala Docker e Git, baixa a configuração /var/discourse e entra em um assistente interativo. O assistente pergunta principalmente sobre:
- O e-mail do administrador;
- Um domínio próprio ou um subdomínio gratuito de
discourse.diy; - Se a configuração SMTP será ignorada;
- DNS, portas 80/443 e ajustes de Swap.
Após a confirmação, ele compila o contêiner app, o que costuma levar vários minutos. Não interrompa o SSH só porque o terminal temporariamente não mostra nova saída. Você pode abrir outra janela para observar os recursos:
docker ps
docker stats --no-stream
df -h
Verifique após a conclusão da instalação:
cd /var/discourse
sudo ./launcher logs app
curl -I https://forum.example.com
Normalmente, o certificado Let's Encrypt é configurado automaticamente pelo processo de instalação, e não é necessário instalar o Certbot novamente no host.
Abra https://forum.example.com no navegador e cadastre-se com o e-mail de administrador informado durante a instalação. Apenas a conta que corresponde a DISCOURSE_DEVELOPER_EMAILS pode obter privilégios de administrador após o primeiro cadastro.
Após entrar pela primeira vez no painel de administração, conclua:
- Definir o nome do site, a descrição, o logo e o idioma padrão;
- Decidir se o cadastro é aberto, por convite ou se apenas o administrador cria usuários;
- Criar categorias, regras do fórum, política de privacidade e termos de serviço;
- Ativar o filtro de palavras sensíveis, a fila de moderação e os limites de publicação para novos usuários;
- Criar uma conta de teste comum para verificar cadastro, publicação e notificações.
Não teste apenas com a conta de administrador. Permissões de usuário comum, verificação por e-mail, envio de imagens e problemas de níveis de confiança geralmente só aparecem quando você realmente percorre o fluxo de cadastro.
O novo instalador oficial permite ignorar o SMTP e ativar o login com Discourse ID. Assim você pode concluir os testes primeiro e também usar e-mail ou métodos de login como Google, GitHub e Apple por meio do serviço de identidade unificado.
No entanto, comunidades em produção ainda devem configurar e-mail transacional dedicado. Sem SMTP, a verificação de cadastro tradicional, os e-mails de resumo, as notificações de mensagens privadas, as respostas por e-mail e alguns fluxos de recuperação de conta ficarão limitados. Não instale o Postfix temporariamente no mesmo VPS para enviar e-mail diretamente; entregabilidade, PTR, SPF, DKIM e tratamento de rejeições aumentarão visivelmente os custos de manutenção.
Os parâmetros SMTP comuns são os seguintes:
SMTP 地址:smtp.example.net
SMTP 端口:587
SMTP 用户名:provider-user
SMTP 密码:独立 SMTP Key
发件地址:[email protected]
Para modificar a configuração de instalação, edite:
sudo nano /var/discourse/containers/app.yml
Exemplo de campos:
env:
DISCOURSE_HOSTNAME: 'forum.example.com'
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
DISCOURSE_SMTP_ADDRESS: 'smtp.example.net'
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: 'provider-user'
DISCOURSE_SMTP_PASSWORD: 'replace-with-smtp-key'
DISCOURSE_NOTIFICATION_EMAIL: '[email protected]'
O YAML é sensível à indentação, e quando a senha contém caracteres como #, :, $ ela deve ficar entre aspas. Reconstrua o contêiner após modificar:
cd /var/discourse
sudo ./launcher rebuild app
Depois envie um e-mail de teste pelo painel e verifique SPF, DKIM, DMARC e o webhook de rejeições. O subdomínio de envio deve ser verificado conforme os requisitos do provedor de e-mail; não presuma que os usuários receberão o e-mail só porque o painel indica "enviado".
Durante a primeira instalação, recomenda-se definir o registro da Cloudflare como DNS Only, garantindo que o instalador do Discourse possa detectar diretamente a origem e emitir o certificado. Após a instalação bem-sucedida, ative o proxy e defina o modo SSL/TLS como Full (strict).
Não use o modo Flexible, pois a Cloudflare se conecta à origem via HTTP, o que facilita loops de redirecionamento e anomalias nos cookies de login. Se ocorrerem loops de HTTPS, consulte Solução de loops de redirecionamento HTTPS em VPS.
Após ativar a Cloudflare, verifique:
curl -I http://forum.example.com
curl -I https://forum.example.com
curl -sS https://forum.example.com/srv/status
Login, publicação, upload e notificações em tempo real do fórum precisam ser testados por completo; não basta a página inicial retornar 200.
Ative os backups automáticos em Admin → Backups e defina a frequência e a quantidade a manter. Os backups devem incluir o banco de dados e os uploads dos usuários, mas backups locais ainda serão perdidos junto com o VPS, portanto devem ser copiados para armazenamento externo.
Os dados persistentes padrão ficam em:
/var/discourse/shared/standalone/
Os arquivos de backup comuns ficam em:
/var/discourse/shared/standalone/backups/default/
Verifique os backups recentes:
sudo find /var/discourse/shared/standalone/backups -type f -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' | sort
Recomenda-se manter três camadas ao mesmo tempo:
- Backups automáticos do painel do Discourse;
- Snapshots do provedor do VPS, para reverter rapidamente se uma atualização falhar;
- Cópias externas em S3, armazenamento de objetos ou outro servidor.
Realize pelo menos uma restauração de teste. Backups apenas criados e nunca verificados não provam que são utilizáveis após corrupção do banco de dados ou exclusão acidental. Para o método completo, consulte o guia de simulação de backup e restauração em VPS.
Atualizações de versão menor podem ser executadas pelo painel em /admin/upgrade. Quando envolvem imagens base, templates Docker ou mudanças de versão maior, reconstruir pela linha de comando facilita manter os logs completos:
cd /var/discourse
sudo ./launcher rebuild app
Antes de atualizar, execute:
free -h
df -h
docker ps
sudo ./launcher logs app
Garanta que há um backup e um snapshot recentes e então agende uma janela de manutenção. rebuild destrói o contêiner antigo e reconstrói a partir da configuração; os dados persistentes ficam em /shared, mas erros de configuração, disco insuficiente ou falhas de download ainda podem causar indisponibilidade.
Após atualizar, verifique a página inicial, login, publicação, busca, upload de imagens, e-mail e tarefas em segundo plano. Não encerre a manutenção só porque o status do contêiner mostra Up.
- Use login SSH por chave e restrinja a origem de administração;
- Abra apenas 22, 80 e 443, e não exponha PostgreSQL nem Redis;
- Ative a autenticação de dois fatores para o administrador e use uma conta comum para publicar no dia a dia;
- Limite links, anexos, mensagens privadas e frequência de publicação de novos usuários;
- Instale prontamente as atualizações de segurança do Discourse;
- Instale plugins apenas de repositórios confiáveis e registre versões e finalidades;
- Não grave chaves SMTP, segredos OAuth ou chaves de armazenamento de objetos em repositórios públicos;
- Configure backups externos, alertas de disco e monitoramento de disponibilidade do site.
O Discourse tem limitação de taxa na camada de aplicação, mas isso não substitui firewalls na nuvem, CDNs e monitoramento de capacidade. Quando uma comunidade pública sofre ataque CC, você pode tratá-lo com a lista de verificação de Cloudflare WAF e limitação de taxa no Nginx.
sudo ss -lntp | grep -E ':(80|443)\b'
docker ps --format 'table {{.Names}}\t{{.Ports}}'
Confirme qual serviço ocupa a porta antes de decidir migrar ou parar. Não encerre diretamente processos de produção que você não reconhece.
dig +short forum.example.com A
curl -4 ifconfig.me
Os dois IPs devem coincidir. Verifique também registros AAAA incorretos, o proxy da Cloudflare, o firewall na nuvem e o cache DNS.
free -h
swapon --show
dmesg -T | grep -i -E 'out of memory|killed process'
Se não houver Swap, configure primeiro 2 GB de Swap; se o OOM ainda ocorrer com frequência na operação de longo prazo, amplie para 2 GB ou 4 GB de memória.
cd /var/discourse
sudo ./launcher logs app
docker ps -a
curl -I http://127.0.0.1
sudo tail -n 100 /var/discourse/shared/standalone/log/rails/production.log
Verifique especialmente DNS, certificados, espaço em disco, inicialização do banco de dados, logs do Rails e mapeamento de portas.
Verifique o endereço SMTP, a porta, o usuário, a chave, o modo TLS e o domínio de envio. Provedores de nuvem podem bloquear a porta 25; o e-mail transacional geralmente usa 587 ou a porta indicada pelo provedor. Alterações em app.yml só entram em vigor após reconstruir.
Verifique primeiro o log completo de compilação para confirmar se o plugin é compatível com a versão atual do Discourse. Não exclua o diretório persistente só para a atualização continuar. Você deve reverter o snapshot ou remover temporariamente o plugin incompatível de app.yml, depois reconstruir e verificar os dados.
- O registro A do domínio aponta para o VPS atual e 80/443 estão acessíveis
- Tanto o site principal quanto o painel usam HTTPS válido
- Usuários comuns conseguem se cadastrar, entrar, publicar, buscar e enviar imagens
- Os e-mails de teste SMTP chegam e SPF, DKIM e DMARC estão corretos
- O administrador tem autenticação de dois fatores ativada
- Os backups automáticos estão ativados e copiados para armazenamento externo
- Uma simulação de restauração de backup foi concluída
- Há snapshot antes da atualização, e e-mail e tarefas em segundo plano são verificados depois
- PostgreSQL, Redis e credenciais de administração não estão expostos à internet
- Há alertas de disco, memória, certificados e disponibilidade do site
O verdadeiro custo de implantação do Discourse não está em abrir a página inicial pela primeira vez, mas na entregabilidade de e-mail, moderação, crescimento dos anexos, backup e restauração e atualizações contínuas. Comunidades pequenas que começam com 2 núcleos, 2 GB, e-mail transacional dedicado e backups externos costumam economizar mais tempo do que lidar repetidamente com OOM, disco cheio e falhas de envio em um VPS de 1 GB.