Tenho um servidor Discourse para o qual ./launcher rebuild app resulta em:
FALHA
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || (
Tenho um servidor Discourse para o qual ./launcher rebuild app resulta em:
FALHA
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || (
Tentei fazer o downgrade da base de código do docker_manager para a versão anterior ao último commit em 10 de julho de 2025:
su - discourse
cd /var/discourse/
./launcher enter app
su - discourse
cd /var/www/discourse/plugins/docker_manager
git checkout d91016c
exit
exit
./launcher rebuild app
Mas isso não fez diferença.
Acabei de fazer uma reconstrução sem problemas. Existem outros erros acima do que você incluiu?
O que o free -h relata?
Não é um problema de espaço em disco:
df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 588M 1.1M 587M 1% /run
/dev/sda2 118G 79G 34G 71% /
tmpfs 2.9G 0 2.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 588M 12K 588M 1% /run/user/1001
O servidor não tem swap, mas tem 6 GB de RAM:
free -h
total used free shared buff/cache available
Mem: 5.7Gi 793Mi 1.2Gi 1.0Mi 4.1Gi 5.0Gi
Swap: 0B 0B 0B
Você acha que um disco de swap é necessário?
A seguir está a configuração do Nginx (/etc/nginx/conf.d/discourse.conf) no contêiner, não havia referência a outlets/before-server:
# Tipos MIME adicionais que você gostaria que o nginx tratasse vão aqui
types {
text/csv csv;
}
upstream discourse { server 127.0.0.1:3000; }
proxy_cache_path /var/nginx/cache keys_zone=one:10m max_size=200m;
# veja: https://meta.discourse.org/t/x/74060
proxy_buffer_size 8k;
# Se você for usar o Puma, use estes:
#
# upstream discourse {
# server unix:/var/www/discourse/tmp/sockets/puma.sock;
# }
# tenta preservar o proto, deve estar no contexto http
map $http_x_forwarded_proto $thescheme {
default $scheme;
https https;
}
log_format log_discourse '[$time_local] \"$http_host\" $remote_addr \"$request\" \"$http_user_agent\" \"$sent_http_x_discourse_route\" $status $bytes_sent \"$http_referer\" $upstream_response_time $request_time \"$sent_http_x_discourse_username\"';
limit_req_zone $binary_remote_addr zone=flood:10m rate=12r/s;
limit_req_zone $binary_remote_addr zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $binary_remote_addr zone=connperip:10m;
limit_conn_status 429;
server {
listen 80;
return 301 https://discourse.example.org$request_uri;
}
server {
access_log /var/log/nginx/access.log log_discourse;
listen 443 ssl;
http2 on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_certificate /shared/ssl/discourse.example.org.cer;
ssl_certificate /shared/ssl/discourse.example.org_ecc.cer;
ssl_certificate_key /shared/ssl/discourse.example.org.key;
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
proxy_cache one;
proxy_cache_key $uri;
proxy_cache_valid 200 7d;
proxy_cache_valid 404 1m;
proxy_set_header Connection "";
proxy_pass https://avatars.discourse.org/;
break;
}
# precisamos desativar o buffering para message bus
location /message-bus/ {
proxy_set_header X-Request-Start "t=${msec}";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $thescheme;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://discourse;
break;
}
# isso significa que cada arquivo em public é tentado primeiro
try_files $uri @discourse;
}
location /downloads/ {
internal;
alias $public/;
}
location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # lembre-se do certificado por um ano e conecte-se automaticamente ao HTTPS para este domínio
limit_conn connperip 20;
limit_req zone=flood burst=12 nodelay;
limit_req zone=bot burst=100 nodelay;
add_header Referrer-Policy 'no-referrer-when-downgrade';
proxy_set_header Host $http_host;
proxy_set_header X-Request-Start "t=${msec}";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $thescheme;
proxy_pass http://discourse;
}
}
Então instalei vim e dos2unix e editei os arquivos para adicionar a linha:
include conf.d/outlets/before-server/*.conf;
E parei e iniciei o Nginx e então saí do contêiner e executei ./launcher rebuild app novamente, mas o mesmo erro foi retornado:
FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 300 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"before-server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"discourse\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
b18ed0cbde3a34dfe76ea066657ece16c5a063ff18627d4a7e4b9787268917c0
Então reiniciei o contêiner (./launcher start app) para verificar:
grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf
echo $?
0
Então não entendo por que está falhando quando o include do Nginx está presente?
Há muitas diferenças entre /var/www/discourse/config/nginx.sample.conf e /etc/nginx/conf.d/discourse.conf — devo tentar substituir o arquivo pelo sample e editá-lo para atualizar o nome do domínio?
Anteriormente, a interface web do Discourse não permitia atualizações, dizia que as atualizações deveriam ser feitas usando a CLI, no entanto, agora permite (por quê?) então atualizei discourse_docker usando a interface Web:
E também discourse:
Portanto, este problema está resolvido no entanto, o que, se alguma coisa, fiz para resolvê-lo é um mistério… ![]()
Eu rastreeei o problema — ele foi causado pelo plugin discourse-images-guardian de @mbcahyono, que precisava que o arquivo nginx.sample.conf fosse atualizado. Eu fiz isso e criei um pull request para corrigi-lo.
Mesclado! Obrigado pelo PR.
Não tive a chance de testar, então confio em você desta vez ![]()
Obrigado @mbcahyono Fiz alguns testes básicos e parece que funciona…! No entanto, este é este problema — substituir os URLs de imagem do site não funciona mais, alguma ideia de como consertar isso?
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.