SSD Nodes Learn 🎉 VPS desde $5.50/mês
Guias Matt ConnorPor Matt Connor · Atualizado 2026-08-07

Discourse, Flarum, NodeBB ou phpBB no VPS?

Compare Discourse, Flarum, NodeBB e phpBB no VPS: RAM real, banco de dados exigido, spam, moderação e como migrar sem ficar preso.

Que software de fórum autoalojado deve executar?

Atualmente, há quatro opções principais de software de fórum autoalojado que pode executar num VPS (servidor privado virtual): Discourse, Flarum, NodeBB e phpBB. O Discourse é a escolha padrão se puder disponibilizar 4 GB de RAM e tiver pelo menos duas pessoas dispostas a moderar. Com 1 GB e um moderador, use Flarum ou phpBB. Um fórum tranquilo que consegue manter limpo é melhor do que um fórum superior que não consegue manter.

A instalação é a parte fácil. Qualquer um destes pode estar a funcionar numa tarde. O que determina se o fórum ainda existirá daqui a um ano é a fila de denúncias e o percurso do email. Por isso, leia as secções sobre moderação e email antes de consultar as listas de funcionalidades.

O que um fórum precisa realmente para funcionar?

Um fórum tem quatro componentes, não um só: um processo da aplicação, uma base de dados que tem de sobreviver a esse processo, um diretório para avatares e anexos enviados e um caminho funcional para enviar correio eletrónico. A aplicação pode ser substituída. A base de dados não, porque todas as publicações, todas as contas e todas as mensagens privadas ficam guardadas nela. Por isso, a base de dados escolhida por cada projeto é a linha mais importante nas secções abaixo. É ela que determina o aspeto da sua exportação no dia em que quiser sair.

O segundo custo é humano. O registo público e a publicação pública significam contas criadas por bots, normalmente na primeira semana depois de o domínio aparecer num crawler. É possível restringir os quatro componentes. Apenas um deles inclui este fluxo de trabalho no núcleo.

Discourse: o padrão e o custo real

Discourse é baseado em Ruby on Rails, usa PostgreSQL para os dados, Redis para a cache e as filas de tarefas, e Sidekiq para executar tarefas em segundo plano. A instalação suportada coloca tudo isso num único contentor Docker, criado a partir de um ficheiro de configuração em /var/discourse/containers/app.yml. Não instala estes componentes manualmente.

wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash

Esse script instala git e Docker se estiverem em falta, clona discourse_docker para /var/discourse e depois passa o controlo para o assistente interativo discourse-setup. O assistente pede o nome do host, um endereço de email de administrador e os dados de SMTP (simple mail transfer protocol), escreve app.yml e cria o contentor. As portas 80 e 443 têm de estar livres, porque o contentor executa o seu próprio nginx e solicita um certificado Let's Encrypt.

O mínimo publicado é 1 GB de RAM com swap, além de 10 GB de disco. Interprete literalmente a parte da swap. O script de configuração cria um ficheiro de swap de 2 GB com fallocate -l 2G /swapfile quando o assistente determina que o sistema precisa dele, e essa swap é essencial. O pico de memória não ocorre durante a execução normal do site. Ocorre em ./launcher rebuild app, que recompila os recursos JavaScript e CSS dentro do contentor durante cada atualização. Num sistema com 1 GB e sem swap, esse passo é terminado a meio, a reconstrução termina sem um erro útil no ecrã e dmesg | tail apresenta uma linha Out of memory: Killed process. Reserve 2 GB para o funcionamento básico e 4 GB quando o fórum tiver utilização significativa.

As atualizações são executadas a partir de /admin/upgrade no navegador ou a partir da shell:

cd /var/discourse
./launcher rebuild app

rebuild destrói o contentor em execução, cria um novo a partir de app.yml e inicia-o. Por isso, o site fica indisponível durante os vários minutos necessários. Num único contentor, não há forma de evitar essa indisponibilidade. Separar os componentes em dois contentores usando os exemplos data.yml e web_only.yml mantém o PostgreSQL em execução enquanto o contentor Web é reconstruído. Isso passa a compensar quando já existem utilizadores que detetam a indisponibilidade.

É na moderação que o Discourse justifica o consumo de RAM. As contas novas começam no nível de confiança 0, com limites rígidos para o número de ligações que podem publicar e para a frequência dessas publicações. Depois sobem de nível à medida que leem e participam. As denúncias entram numa fila de revisão que regista quem tratou cada caso. As integrações com Akismet e StopForumSpam são plugins oficiais. Nas outras três plataformas, terá de montar esta funcionalidade com add-ons.

A migração para o Discourse é a sua funcionalidade mais forte. O diretório script/import_scripts/ na árvore de código-fonte contém mais de sessenta importadores, incluindo phpbb3.rb, vbulletin.rb, xenforo.rb, vanilla.rb, mybb.rb, flarum_import.rb, um diretório nodebb e um importador mbox para arquivos de listas de discussão. São scripts Ruby executados dentro do contentor contra uma cópia da base de dados antiga. São lentos, mas são mantidos.

A migração a partir do Discourse é o seu ponto fraco. ./launcher enter app seguido de discourse backup escreve um .tar.gz que contém um dump do PostgreSQL e o diretório de uploads. Outra instância do Discourse consegue restaurá-lo. Nenhum outro sistema o lê, por isso, para sair do Discourse, terá de escrever SQL manualmente contra esse dump. Confirme que consegue aceitar essa limitação antes de importar 50,000 publicações.

Flarum: o fórum PHP leve

O Flarum é uma aplicação PHP comum: php-fpm atrás de nginx ou Apache, uma base de dados MySQL ou MariaDB e ficheiros no disco. Os requisitos documentados são PHP 7.3 ou mais recente, com as extensões curl, dom, fileinfo, gd, json, mbstring, openssl, pdo_mysql, tokenizer e zip, além de MySQL 5.6+ (ou 8.0.23+) ou MariaDB 10.0.5+. O Ubuntu 24.04 inclui PHP 8.3, que está acima desse requisito mínimo.

Tenha em atenção pdo_mysql nessa lista. O Flarum não suporta PostgreSQL nem SQLite. Se pretendia uma base de dados num único ficheiro, essa é o phpBB abaixo.

sudo apt update
sudo apt install -y nginx mariadb-server composer php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
sudo install -d -m 755 /srv/flarum
cd /srv/flarum
sudo COMPOSER_ALLOW_SUPERUSER=1 composer create-project flarum/flarum:^1.8.0 .
sudo chown -R www-data:www-data /srv/flarum

Aponte o servidor Web para /srv/flarum/public, não para /srv/flarum. O código da aplicação, o ficheiro de configuração e a palavra-passe da base de dados ficam um nível acima de public. Por isso, uma raiz de documentos demasiado alta expõe as suas credenciais a qualquer pessoa que as solicite. No Apache, também precisa de mod_rewrite e AllowOverride All para que o .htaccess fornecido seja aplicado. No nginx, inclua o .nginx.conf fornecido dentro do seu bloco server. Depois, aceda ao domínio. O instalador do próprio Flarum solicitará os dados da base de dados e da conta de administrador.

Versões em agosto de 2026: 1.8.17 é a versão estável atual, publicada em junho de 2026, e 2.0 está na release candidate 5. Não inicie uma comunidade nova com a release candidate. Quando 2.0 chegar, as extensões precisarão de atualizações antes de serem carregadas. Essa é a atualização que lhe pode custar um fim de semana.

A utilização de recursos é baixa. Alguns workers php-fpm, MariaDB a precisar de algumas centenas de MB e ficheiros estáticos. Uma comunidade pequena cabe em 1 GB.

A moderação é a principal fraqueza. O núcleo fornece denúncias e permissões por grupo. As filas de aprovação e o bloqueio de spam vêm de extensões, principalmente da coleção FriendsOfFlarum, instaladas com composer require e ativadas no painel de administração. Isso funciona atualmente. Está a confiar num ecossistema de voluntários menor do que o do phpBB ou do Discourse. Uma extensão sem manutenção bloqueia a próxima atualização do núcleo, porque o composer não consegue resolver as dependências com a nova versão.

A exportação dos dados é fácil: mysqldump a base de dados e copie o diretório de assets. A importação é mais difícil. O Discourse inclui flarum_import.rb para a conversão de Flarum para Discourse, o que indica a direção habitual do fluxo de dados. A importação de phpBB para Flarum é feita por extensões da comunidade, e não por uma ferramenta oficial. Por isso, teste uma delas contra uma cópia antes de confiar nela com a única cópia disponível.

NodeBB: publicação em tempo real e o custo associado

O NodeBB é baseado em Node.js. Envia novas publicações para os navegadores abertos através de websockets, por isso uma discussão ativa é atualizada sem recarregar a página. Esse é o motivo para o escolher. O README pede Node.js 22 ou mais recente e MongoDB 5+ ou Redis 7.2+, e inclui um driver de PostgreSQL na árvore de código como terceira opção.

Usar Redis como base de dados principal é a armadilha dessa frase. O Redis mantém o conjunto de dados em memória, por isso o requisito de RAM cresce com o fórum em vez de permanecer estável. MongoDB ou PostgreSQL mantêm os dados em disco e colocam em cache o que é acedido com frequência. Escolha Redis apenas se conseguir explicar porquê.

O Ubuntu 24.04 disponibiliza Node.js 18, que fica abaixo do mínimo exigido, por isso instale primeiro um runtime atual.

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git build-essential
sudo adduser --system --group --home /srv/nodebb nodebb
sudo -u nodebb git clone -b v4.x https://github.com/NodeBB/NodeBB.git /srv/nodebb
cd /srv/nodebb
sudo -u nodebb ./nodebb setup

./nodebb setup é interativo. Pergunta qual base de dados utilizar e como aceder-lhe. Depois cria a conta de administrador e escolhe uma porta, cujo valor predefinido é 4567. O NodeBB não inicia com npm start. O script ./nodebb é a interface, e ./nodebb log é o destino da saída.

./nodebb start executa como daemon, o que é incorreto numa máquina que reinicia. Execute o loader em primeiro plano através do systemd.

[Unit]
Description=NodeBB
After=network.target

[Service]
Type=simple
User=nodebb
WorkingDirectory=/srv/nodebb
ExecStart=/usr/bin/env node loader.js --no-daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target

--no-daemon é a parte que muitas pessoas ignoram. Sem ele, o loader cria um processo filho e o processo principal termina. Assim, systemctl status nodebb indica que a unidade está parada, enquanto curl localhost:4567 continua a responder, e systemctl stop nodebb não interrompe nada. Atrás de um reverse proxy, os cabeçalhos de upgrade do websocket têm de ser encaminhados. Se proxy_set_header Upgrade $http_upgrade; e proxy_set_header Connection "upgrade"; estiverem ausentes no bloco do nginx, o fórum é carregado, a consola do navegador fica cheia de pedidos socket.io falhados e as novas publicações deixam de aparecer até o leitor recarregar a página.

A moderação fica entre o Flarum e o Discourse. Existe uma fila de sinalizações no painel de administração, privilégios por categoria e um sistema de reputação. A proteção contra spam é fornecida por plugins da comunidade, como nodebb-plugin-spam-be-gone, que integra o Akismet e o StopForumSpam.

As cópias de segurança são manuais, e ninguém menciona isso até precisar de uma. A CLI ./nodebb não tem um comando de backup. Faça o dump da base de dados manualmente com mongodump ou pg_dump e copie o diretório public/uploads e config.json juntamente com ele. config.json contém as credenciais da base de dados e o URL do site, por isso uma restauração sem esse ficheiro é apenas uma nova instalação. Também não existe um importador oficial. nodebb-plugin-import é um projeto da comunidade que não tem acompanhado o ritmo, enquanto o Discourse inclui um importador de NodeBB. Assim, a opção de saída que funciona com certeza conduz ao Discourse.

phpBB: o pequeno e sem complicações que continua a funcionar

O phpBB é antigo, e esse é o argumento a favor dele. A versão 3.3 funciona com PHP 7.2.0 até PHP 8.3, inclusive, e suporta MySQL 4.1.3+, MariaDB 5.1+, PostgreSQL 8.3+, SQLite 3.6.15+, MS SQL Server e Oracle. Precisa de suporte para json, mbstring e XML, além da função getimagesize() ativada.

O SQLite é o motivo pelo qual ele pertence a esta lista. Com SQLite, o fórum é um diretório de ficheiros PHP e um único ficheiro de base de dados. Não há servidor de base de dados, nada para ajustar e nada adicional para incluir nas cópias de segurança. Num VPS de 1 GB que já executa outro serviço, essa diferença é real. Use SQLite para uma comunidade pequena e mude para MySQL quando aumentarem as publicações simultâneas, porque o SQLite serializa as escritas e as publicações começam a ficar em fila umas atrás das outras.

Não há uma etapa com composer nem um contentor. Instale um servidor web com PHP, extraia o arquivo e execute o instalador no browser. A configuração completa da stack está descrita em uma stack LAMP padrão no Ubuntu 24.04.

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql php-mbstring php-xml php-gd unzip

Transfira a versão 3.3 atual de phpbb.com, extraia-a no diretório servido pelo seu vhost e torne graváveis pelo utilizador do servidor web os caminhos onde o instalador escreve.

sudo chown -R www-data:www-data /srv/phpbb
sudo chmod 660 /srv/phpbb/config.php
sudo chmod -R 770 /srv/phpbb/store /srv/phpbb/cache /srv/phpbb/files /srv/phpbb/images/avatars/upload

As instruções oficiais indicam 666 e 777. Esses números existem para alojamento partilhado, onde não controla o utilizador com que o PHP é executado. No seu próprio VPS, esse controlo existe. Por isso, atribua a propriedade a www-data e impeça o acesso de todos os outros. Há um detalhe do Apache que causa problemas: a configuração do Ubuntu só concede acesso dentro da raiz de documentos predefinida. Por isso, um vhost que aponte para /srv/phpbb também precisa de um bloco <Directory> correspondente com Require all granted, ou todos os pedidos devolvem 403 Forbidden antes de chegarem ao phpBB. Termine no browser em /install/index.php, depois altere config.php novamente para 640 e elimine o diretório install/. O phpBB continuará a avisar sobre esse diretório até ele ser eliminado.

O spam é o problema conhecido do phpBB, mas pode ser resolvido. O formulário de registo está num URL previsível (ucp.php?mode=register), por isso os bots encontram-no poucos dias depois de o domínio ser rastreado. A solução eficaz está no painel de administração, em Spambot countermeasures: defina o método antispam como Question and Answer e escreva uma pergunta que só alguém da sua comunidade consiga responder. CAPTCHAs de imagem (testes de Turing públicos completamente automatizados) são resolvidos a baixo custo por serviços que cobram por cada mil testes. Uma pergunta sobre o seu próprio tema não é.

O phpBB também é a fonte com melhor suporte para uma migração. O phpbb3.rb do Discourse é o importador mais utilizado de todo este artigo, e existem vinte anos de respostas nos fóruns de suporte do phpBB. Para sair, use mysqldump ou copie o ficheiro SQLite. O que não é transferido são os seus estilos e as suas extensões.

Por que os e-mails de inscrição no fórum nunca chegam?

O registo em todos os quatro depende de um e-mail de confirmação. Se essa mensagem não chegar, a conta nunca é ativada e os logs mostram uma inscrição que simplesmente parou. A capacidade de entrega de mensagens determina se o fórum funciona, por isso trate-a como parte da instalação.

  • A maioria dos fornecedores de VPS bloqueia a porta de saída 25 por predefinição, por isso um Postfix local que tenta entregar mensagens diretamente não chega a lado nenhum. O log de e-mail mostra connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out.
  • Um endereço IP novo não tem reputação de envio, por isso até uma entrega bem-sucedida acaba na pasta de spam. Para um link de confirmação, isso equivale a não chegar.
  • Sem registos SPF (sender policy framework) e DKIM (domainkeys identified mail) publicados no DNS, os grandes fornecedores rejeitam a mensagem imediatamente. A rejeição do Google é 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. O DMARC (domain-based message authentication, reporting and conformance) é agora esperado de qualquer entidade que envie mensagens em volume.

A resposta prática é usar um relay. Aponte as definições SMTP do fórum para um fornecedor de e-mail transacional na porta 587, publique os registos SPF, DKIM e DMARC fornecidos por esse fornecedor e envie a partir de um subdomínio como mail.example.com, para manter a reputação do fórum separada do seu e-mail pessoal. É possível executar o seu próprio servidor de e-mail, e um servidor de e-mail totalmente autoalojado numa VPS explica como fazê-lo, mas a semana de lançamento de um fórum não é o momento certo para aprender sobre capacidade de entrega.

Teste antes de anunciar o fórum. No Discourse, a partir do interior do contentor:

cd /var/discourse
./launcher enter app
rake emails:test[you@example.com]

Essa tarefa verifica a ligação SMTP e envia uma mensagem. Também identifica a falha quando as credenciais estão erradas, normalmente como um Net::SMTPAuthenticationError. O phpBB tem um teste equivalente no painel de administração, em Client communication. No Flarum e no NodeBB, registe uma conta descartável usando uma caixa de correio real de um grande fornecedor e leia os cabeçalhos brutos da mensagem recebida. spf=pass e dkim=pass no cabeçalho Authentication-Results são o resultado que procura.

Há uma particularidade no Discourse. Em agosto de 2026, o assistente de configuração permite ignorar o SMTP e usar o Discourse ID, que inicia sessão com uma conta externa em vez de usar um link enviado por e-mail. Isso permite lançar o fórum sem um relay. No entanto, não fornece e-mails de notificação nem reposições de palavra-passe, por isso configure o SMTP antes de a comunidade crescer.

Como colocar o fórum atrás de TLS?

Flarum e phpBB são hosts virtuais comuns, por isso o certbot no servidor web que já utiliza é suficiente. NodeBB e Discourse são diferentes: são aplicações que escutam em portas locais, e é necessário um componente à frente delas para terminar o TLS (transport layer security) e encaminhar o tráfego pelo nome de host. Se o fórum partilhar o servidor com outros serviços, coloque um único reverse proxy à frente de todos eles. É para isso que serve o Traefik à frente de várias aplicações Docker Compose.

Por predefinição, o Discourse assume o controlo das portas 80 e 443, utilizando o seu próprio nginx e o seu próprio template do Let's Encrypt. Para o colocar atrás de um proxy existente, edite app.yml, remova a linha templates/web.letsencrypt.ssl.template.yml, altere as portas expostas para que o container escute apenas num endereço local e execute ./launcher rebuild app. Fazer esta alteração depois da instalação exige uma reconstrução e alguns minutos de indisponibilidade. Por isso, decida antes de instalar, e não depois.

Qual fórum é adequado ao tamanho da sua comunidade?

A regra de decisão depende das pessoas, não dos recursos.

  • Menos de algumas centenas de membros, um moderador, 1 GB de RAM: phpBB com SQLite ou Flarum se quiser uma interface moderna e puder executar MariaDB. Cada opção é uma única aplicação PHP que precisa de atualizações regulares.
  • Uma comunidade em crescimento, dois ou mais moderadores, 4 GB de RAM: Discourse. Os níveis de confiança e a fila de revisão justificam o consumo de recursos assim que a moderação deixa de caber na cabeça de uma só pessoa.
  • Quer mais conversas em tempo real do que tópicos duradouros: NodeBB ou aceite que isso é chat e execute Rocket.Chat com Docker Compose em vez disso. Um fórum em que nada merece ser lido uma semana depois deveria ser um servidor de chat.
  • O que realmente precisa é de documentação, não de discussão: nenhuma destas opções. BookStack, Wiki.js ou Outline responde melhor a essa necessidade, e um fórum cheio de perguntas repetidas normalmente indica que falta uma wiki.
  • Ainda está a decidir o que deve ficar no servidor: a lista mais ampla de opções de self-hosting para 2026 é um ponto de partida melhor, e o guia de alternativas self-hosted ao Notion aborda a sobreposição entre fóruns e espaços de trabalho partilhados.

Seja qual for a escolha, a durabilidade do fórum depende da existência de um backup restaurado mais recentemente. Faça o dump da base de dados segundo um agendamento, copie o diretório de uploads no mesmo job e restaure o resultado noutro local uma vez para confirmar que o dump pode ser utilizado. Backups agendados com restic num VPS explica essa parte, e este é o único componente desta configuração que não permite uma segunda oportunidade.

FAQ

Quais são os requisitos mínimos do servidor para um fórum autoalojado?

O phpBB com SQLite funciona com 1 GB de RAM juntamente com outros serviços, porque não existe um servidor de base de dados. O Flarum requer 1 GB mais MariaDB. O NodeBB funciona confortavelmente com 2 GB e MongoDB. O Discourse indica 1 GB com swap e 10 GB de disco como requisitos mínimos, mas 2 GB é o mínimo realista e 4 GB é adequado para um fórum movimentado, porque o ./launcher rebuild app recompila os recursos em memória a cada atualização. É nesse momento que o kernel pode terminar um servidor pequeno através do gestor de falta de memória.

Posso migrar o meu fórum phpBB para o Discourse?

Sim, e este é o caminho de migração com melhor suporte. O Discourse inclui script/import_scripts/phpbb3.rb, que deve ser executado dentro do contentor contra uma cópia da base de dados do phpBB, nunca contra a base de dados em produção. Os utilizadores, as categorias, os tópicos, as publicações e os anexos são importados. Os estilos e as extensões não são importados, e os URLs dos tópicos antigos mudam. Por isso, planeie redirecionamentos a partir dos caminhos do phpBB antes de alterar o DNS. Quadros grandes podem demorar horas. Faça primeiro um ensaio da importação num servidor temporário e registe a duração.

Porque é que os novos utilizadores nunca recebem o email de ativação?

A maioria dos fornecedores de VPS bloqueia a porta de saída 25. Por isso, um servidor de email local não consegue entregar mensagens e o log mostra Connection timed out para o servidor de email do destinatário. Quando a entrega funciona, um IP novo sem registos SPF ou DKIM é rejeitado ou filtrado, e o Google responde com 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy. Envie através de um relay na porta 587 e publique os registos SPF, DKIM e DMARC fornecidos por esse relay. Depois, confirme com um registo de teste e consulte o cabeçalho Authentication-Results da mensagem recebida.

Qual é o software de fórum autoalojado que requer menos trabalho de moderação?

O Discourse, porque o fluxo de trabalho faz parte do núcleo em vez de ser adicionado através de extensões. As contas novas ficam sujeitas a limites de pedidos até os utilizadores lerem conteúdo suficiente, as denúncias são reunidas numa fila que regista quem tratou de cada uma e o plugin Akismet é oficial. O phpBB aproxima-se desse nível quando ativa o método antispam Question and Answer, que por si só impede a maioria dos registos de bots. O Flarum e o NodeBB dependem de extensões da comunidade para as mesmas funções. Nada disto altera o fator principal: a carga de moderação aumenta com o número de pessoas que publicam conteúdo, não com o software utilizado.