Erros de permissão com "./launcher rebuild app" em instalação nova

Eu fiz:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

então copiei meu app.yml antigo para containers e tentei reconstruir o aplicativo:


[root@two discourse]# ./launcher rebuild app
x86_64 arch detectado.
Garantindo que o launcher esteja atualizado
Launcher está atualizado
Parando o contêiner antigo
+ /usr/bin/docker stop -t 600 app
app
2.0.20250722-0020: Puxando de discourse/base
Digest: sha256:3b975c30ef85e9742e2d7f6093450867e67dae204c93d22cc38d043dcbf530b3
Status: Imagem está atualizada para discourse/base:2.0.20250722-0020
docker.io/discourse/base:2.0.20250722-0020
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-09-12T19:05:09.283821 #1]  INFO -- : Lendo da entrada padrão
I, [2025-09-12T19:05:09.296585 #1]  INFO -- : Arquivo > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.301579 #1]  INFO -- : Arquivo > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.307391 #1]  INFO -- : Arquivo > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.313597 #1]  INFO -- : Arquivo > /root/install_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.319914 #1]  INFO -- : Arquivo > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.320255 #1]  INFO -- : Substituindo data_directory = '/var/lib/postgresql/15/main' por data_directory = '/shared/postgres_data' em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.323526 #1]  INFO -- : Substituindo (?-mix:#?listen_addresses *=.*) por listen_addresses = '*' em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324153 #1]  INFO -- : Substituindo (?-mix:#?synchronous_commit *=.*) por synchronous_commit = $db_synchronous_commit em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324577 #1]  INFO -- : Substituindo (?-mix:#?shared_buffers *=.*) por shared_buffers = $db_shared_buffers em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324945 #1]  INFO -- : Substituindo (?-mix:#?work_mem *=.*) por work_mem = $db_work_mem em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325369 #1]  INFO -- : Substituindo (?-mix:#?default_text_search_config *=.*) por default_text_search_config = '$db_default_text_search_config' em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325759 #1]  INFO -- : Substituindo (?-mix:#?checkpoint_segments *=.*) por checkpoint_segments = $db_checkpoint_segments em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.329467 #1]  INFO -- : Substituindo (?-mix:#?logging_collector *=.*) por logging_collector = $db_logging_collector em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330304 #1]  INFO -- : Substituindo (?-mix:#?log_min_duration_statement *=.*) por log_min_duration_statement = $db_log_min_duration_statement em /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330761 #1]  INFO -- : Substituindo (?-mix:^#local +replication +postgres +peer$) por local replication postgres  peer em /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.331823 #1]  INFO -- : Substituindo (?-mix:^host.*all.*all.*127.*$) por host all all 0.0.0.0/0 md5 em /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332230 #1]  INFO -- : Substituindo (?-mix:^host.*all.*all.*::1\\/128.*$) por host all all ::/0 md5 em /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332621 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

mkdir: não foi possível criar o diretório '/shared/postgres_run': Permissão negada
chown: não foi possível acessar '/shared/postgres_run': Arquivo ou diretório inexistente
chmod: não foi possível acessar '/shared/postgres_run': Arquivo ou diretório inexistente
mkdir: não foi possível criar o diretório '/shared/postgres_run': Permissão negada
chown: não foi possível acessar '/shared/postgres_run/15-main.pg_stat_tmp': Arquivo ou diretório inexistente
install: não foi possível alterar o proprietário e as permissões de '/shared/postgres_data': Arquivo ou diretório inexistente
initdb: erro: não foi possível criar o diretório "/shared/postgres_data": Permissão negada
find: '/shared/postgres_data': Arquivo ou diretório inexistente
chown: não foi possível desreferenciar '/var/run/postgresql': Arquivo ou diretório inexistente
cat: /shared/postgres_data/PG_VERSION: Arquivo ou diretório inexistente
du: não foi possível acessar '/shared/postgres_data': Arquivo ou diretório inexistente
/root/upgrade_postgres: linha 7: * 2: erro de sintaxe: operando esperado (token de erro \"* 2\")
I, [2025-09-12T19:05:12.122891 #1]  INFO -- : Gerando locais (isso pode levar um tempo)...
  en_US.UTF-8... concluído
Geração completa.
Os arquivos pertencentes a este sistema de banco de dados serão de propriedade do usuário \"postgres\".
Este usuário também deve ser o proprietário do processo do servidor.

O cluster do banco de dados será inicializado com a localidade \"en_US.UTF-8\".
A codificação padrão do banco de dados foi definida como \"UTF8\".
A configuração padrão de pesquisa de texto será definida como \"english\".

As verificações de checksum de página de dados estão desativadas.

criando diretório /shared/postgres_data ... Atualizando PostgreSQL da versão para 15


FALHOU
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 falhou com o retorno #<Process::Status: pid 18 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec falhou com os parâmetros {\"tag\"=>\"db\", \"cmd\"=>\"if [ -f /root/install_postgres ]; then\\n  /root/install_postgres && rm -f /root/install_postgres\\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\\nfi\\n\"}
bootstrap falhou com o código de saída 1
** FALHA AO INICIALIZAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
c9c7badf83b119a15b40255ae48a05182f72663cc870ca85e867c1f9a218bb83

Aparentemente há um problema de permissão dentro do contêiner logo no início:

mkdir: não foi possível criar o diretório '/shared/postgres_run': Permissão negada

O que poderia estar causando isso?

Aparentemente, preciso executar o Docker com a flag --privileged, pois isso resolve o problema:

./launcher rebuild app --docker-args '--privileged'

Não está claro para mim por que isso acontece. (Isso é no Fedora 42.) Eu adoraria entender o que está acontecendo aqui.

Porque no Discourse esses arquivos são de propriedade do root (ou o diretório pai é?).

Talvez esteja definido por padrão no Ubuntu. Não sei o que pode ser diferente no Ubuntu.

Você poderia tentar definir /var/discourse/shared como gravável por qualquer pessoa e ver se funciona? Ou talvez você possa ver se funciona sem --privileged agora?

Ubuntu é o recomendado e Debian é o que está dentro do contêiner (e pode ser o que a CDCK usa para o sistema operacional do host?). Fedora tem um monte de coisas bloqueadas que o Ubuntu não tem. Se você adoraria entender, provavelmente estará em grande parte por conta própria, embora eu ache que me lembro de pelo menos uma pessoa aqui que com alguma frequência gosta de Fedora CentOS (que é mais próximo do Fedora do que o Ubuntu!). Isso pode ter pistas: MKJ's Opinionated Discourse Deployment Configuration

Eu me pergunto qual é o uid efetivo no ponto em que o script de bootstrap está tentando criar subdiretórios em /var/discourse/shared; eu pensei que seria root, já que o docker está sendo executado como root, mas aparentemente não?

Não vejo nada lá sobre o uso de --privileged, infelizmente, embora eu compartilhe o desejo dele de fazer tudo isso com podman em vez de docker.

1 curtida

Sim, eu nunca executei o Discourse em produção no Fedora, apenas fiz o desenvolvimento do Discourse no Fedora, e isso não no 42. Meus servidores Discourse agora estão no AlmaLinux 9 e eu não preciso de --privileged lá. Eu não tenho o Docker instalado em nenhum dos meus sistemas Fedora.

1 curtida

Acho que vou tentar determinar quem é o proprietário desses diretórios sem --privileged quando tiver tempo.

1 curtida

Ao olhar para --privileged, vejo que ele desabilita os rótulos de processo do SELinux.

Eu não estou desabilitando o SELinux no meu servidor Discourse e, de fato, tenho instruções no meu guia sobre como se adaptar para manter o SELinux habilitado enquanto usa o nginx externo. Você também pode verificar seus logs de avc para negações relevantes e escrever políticas locais usando audit2allow. Mas isso pode ser um processo iterativo longo. Eu começaria do zero (apagando /var/discourse) para garantir que seja um teste válido e ver se você ainda precisa de --permissive com o SELinux desabilitado (por exemplo, setenforce 0). Então, se isso funcionar, você pode usar audit2allow, porque setenforce 0 ainda escreve entradas avc, mas não é mais parado no primeiro portão, então você chegará a uma política funcional mais rapidamente.

Eu não acho que continuaria usando --privileged em um sistema de produção se pudesse evitar.

1 curtida