ArgumentError: diretório para pid=/.../unicorn.pid não gravável

Aqui está o final do meu unicorn.stderr.log para o que vale a pena

I, [2023-08-22T04:18:52.795267 #81]  INFO -- : Refreshing Gem list
fatal: detected dubious ownership in repository at '/var/www/discourse'
To add an exception for this directory, call:

	git config --global --add safe.directory /var/www/discourse
I, [2023-08-22T04:18:57.742262 #81]  INFO -- : listening on addr=127.0.0.1:3000 fd=10
fatal: detected dubious ownership in repository at '/var/www/discourse'
To add an exception for this directory, call:

	git config --global --add safe.directory /var/www/discourse
I, [2023-08-22T04:19:04.916798 #81]  INFO -- : starting 1 supervised sidekiqs
I, [2023-08-22T04:19:04.927971 #81]  INFO -- : starting up EmailSync demon
I, [2023-08-22T04:19:07.993280 #81]  INFO -- : master process ready
I, [2023-08-22T04:19:11.010040 #174]  INFO -- : worker=0 ready
I, [2023-08-22T04:19:11.994849 #188]  INFO -- : worker=1 ready
I, [2023-08-22T04:19:12.524936 #203]  INFO -- : worker=2 ready

Ubuntu 22.04 (Server)

Configurado recentemente a partir de um provedor de nuvem. Não fiz nada além de atualizar o sistema, instalar docker, zsh, nginx e executar a configuração do discourse, que falhou.

Editar:

Reconstruí o servidor na nuvem com Fedora, instalei apenas o docker e, em seguida, tentei a instalação limpa novamente.

Outro erro diferente

[Ter 22 Ago 2023 17:51:02 UTC] Executar comando de recarga: sv reload nginx
aviso: nginx: impossível abrir supervise/ok: arquivo não existe
[Ter 22 Ago 2023 17:51:02 UTC] Erro de recarga para :
iniciado runsvdir, PID é 2941
ok: run: redis: (pid 2953) 0s
ok: run: postgres: (pid 2954) 0s
supervisor pid: 2949 unicorn pid: 2981

o nginx interno não quer rodar.

Espere, por que você instalou o nginx? A instalação padrão falhará se já houver algo no host usando a porta 80.

Em um novo droplet da Digital Ocean, não fiz nada que não estivesse no guia de instalação oficial, e funcionou bem. Deixei o instalador do Discourse instalar o docker para mim e tudo mais.

Tentar reproduzir isso está se mostrando complicado.

2 curtidas

Sim, parece que sim. Definitivamente parece ser uma coisa, já que vi várias pessoas relatando isso (@DarthLasciel, @Godmar_Back e talvez @kdambekalns).

Me avise se houver algo que você queira ver da minha instalação.

1 curtida

O problema ainda ocorre se você tentar provisionar em um novo subdomínio em um servidor totalmente novo e seguir estritamente nosso guia de instalação oficial, abstendo-se de instalar quaisquer pacotes extras no host?

Além disso, você pode compartilhar seu [redacted] app.yml?

Especificamente, por favor, certifique-se de redigir a variável de ambiente DISCOURSE_SMTP_PASSWORD e quaisquer outras informações sensíveis.

Também:

Você pode tentar adicionar isto à URL? ?safe_mode=no_plugins

Se funcionar, pode indicar bugs em plugins.

Exceto pela parte do subdomínio, fiz exatamente isso.
Novo Servidor Fedora, instale docker, instale discourse, configure sem nginx instalado no servidor. Resulta no erro postado acima.

## este é o template do container Docker do Discourse, tudo em um, independente
##
## 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 listener IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Descomente estas duas linhas se desejar adicionar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quais portas TCP/IP este container deve expor?
## Se você quer que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## veja https://meta.discourse.org/t/17247 para detalhes
expose:
  - "9980:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Defina db_shared_buffers para um máximo de 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 da ordenação, mas adiciona uso de memória por conexão
  #db_work_mem: "40MB"

  ## Qual revisão Git este container deve usar? (padrão: tests-passed)
  #version: tests-passed

env:
  LC_ALL: de_DE.UTF-8
  LANG: de_DE.UTF-8
  LANGUAGE: de_DE.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quantas requisições web concorrentes são suportadas? Depende de memória e núcleos de CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
  #UNICORN_WORKERS: 3

  ## TODO: O nome de domínio que esta instância do Discourse responderá
  ## Obrigatório. Discourse não funcionará com um número IP puro.
  DISCOURSE_HOSTNAME: 'redacted.de'

  ## Descomente se você quiser que o container seja iniciado com o mesmo
  ## hostname (-h option) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de emails separados por vírgula que serão feitos administradores e desenvolvedores
  ## na inscrição inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

  ## 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: none.com
  #DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: user@none.com
  DISCOURSE_SMTP_PASSWORD: none
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (exigido por alguns provedores)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (endereço para enviar notificações de)

  ## Se você adicionou o template 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 puxar)
  ## veja https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## A chave de endereço IP do MaxMind geolocation para consulta de endereço IP
  ## veja https://meta.discourse.org/t/-/137387/23 para detalhes
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## O container Docker é stateless; 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
## veja 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 a linha novamente. Ela só precisa ser executada uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fim dos comandos personalizados"

Tive o mesmo problema de permissão em que unicorn.pid não pode ser gravado. Queria te dar mais informações vendo se ele se reproduz com o guia de instalação oficial, mas isso não se encaixa no meu sistema. Primeiro reclamou porque as portas 80/443 já estão em uso e, em seguida, fez algumas verificações de e-mail que falharam. Você tem um app.yml que apenas cria uma imagem docker que não requer nada externo? Presumivelmente, este mesmo problema se reproduzirá com isso também.

Eu “consertou” o problema e me sinto incrivelmente estúpido.

Em vez de instalar o Docker “da maneira certa”, eu apenas digitei “sudo apt install docker-compose” e segui em frente. O Docker “parecia” funcionar… parecia…

Eu o reinstalei da maneira que o guia do Docker me diz para fazer, adicionando outro repositório, chaves, tudo isso… E o Discourse funciona!

7 curtidas

Então, uma instalação malfeita do Docker foi a culpada. Eu realmente não entendo como ainda é tão difícil instalar um Docker atualizado e funcional. E parece que eles finalmente integraram o docker-compose ao docker (então você pode fazer docker compose ...), embora eu ainda não tenha prestado muita atenção a isso.

@rtwfroody e @StanD isso também resolve o seu problema?

2 curtidas

Mas nós não usamos docker-compose de forma alguma

Bom saber, mas nosso guia não pede nada disso, você executa o discourse-setup e ele instalará o docker para você.

Tenho quase certeza de que minha instalação do Docker está boa e não estou usando o Docker Compose. Honestamente, tudo o que fiz foi remover um plugin (o plugin discourse-checklist que não é mais necessário) e executar um rebuild em uma instância auto-hospedada e atualizada que está funcionando bem há anos.

Infelizmente, meu trabalho principal me impediu de investigar isso nas últimas 24 horas. Devo retomar esta noite. Verei se consigo fornecer mais informações.

1 curtida

Tive o mesmo problema ao fazer uma instalação limpa em uma EC2 (Ubuntu 22.04.3 LTS).
Tive experiência anterior em configurar o Discourse (cerca de 2-3 vezes).

Inicialmente, pensei que era um problema de compilação e executei ./launcher rebuild app várias vezes, o que me fez esgotar o limite semanal de certificados SSL oferecido pelo Let’s Encrypt, razão pela qual o site apresentava o erro site cant be reached error.

Mais tarde, tentei ./launcher logs app. Ele estava mostrando os seguintes erros:

  1. directory for pid=/var/www/discourse/tmp/pids/unicorn.pid not writable (ArgumentError).
  2. \"detail\": \"Error creating new order :: too many certificates (5) already issued for this exact set of domains in the last 168 hours - Problema de Limite de Taxa do Let’s Encrypt

A única coisa que fiz de diferente do guia oficial foi a instalação do Docker.
Instalei o Docker usando sudo apt install docker.io. Desinstalei completamente e deixei a instalação do Docker ocorrer com ./discourse-setup.

E funcionou!!

Como @pfaffman disse, foi um problema com a instalação do Docker.

PS: Segui em frente com um novo subdomínio durante a 2ª tentativa de instalação, pois precisei configurar o servidor Discourse com prioridade.

Concordando com o que @pfaffman e @csgeek disseram, o seguinte funcionou para mim:

  1. apt remove docker.io, removendo o docker.io (20.10.25-0ubuntu1~22.04.1)
  2. Execute ./discourse-setup até que ele tenha instalado o docker, então saia dele.
  3. systemctl start docker
  4. ./launcher rebuild app

Isso é em um sistema rodando Ubuntu 22.04.3 LTS.

1 curtida

Olá @jeanas. Isso parece ser o que tentar. Você poderia fazer o seguinte:

E se isso funcionar para você, marque a postagem dele como a solução?

[Nota: Meu caso não é realmente um problema de #instalação, mas o erro produzido é o mesmo que neste tópico e minha correção (abaixo) pode ser útil para outros. Moderadores (@pfaffman?), sintam-se à vontade para categorizar isso de forma mais apropriada.]

A mensagem ArgumentError aparece depois que executo um ./launcher rebuild app na minha instância auto-hospedada, dockerizada (instalada e funcionando há muitos anos). Isso acontece porque o unicorn não consegue gravar um arquivo pid no diretório /var/www/discourse/tmp/pids (dentro do contêiner). O log mostra um loop de mensagens ArgumentError enquanto ele tenta gravar esse arquivo a cada poucos segundos.

Eu faço login no contêiner a partir da máquina host via

docker exec -it app bash

De dentro do contêiner eu executo

find /var/www/discourse -printf '%u:%g\\n'  | sort -t: -u

Isso me mostra uma lista do proprietário:grupos naquele diretório

root:root
discourse:discourse

Eu então torno o diretório /var/www/discourse/tmp/pids legível por todos via

chmod +r /var/www/discourse/tmp/pids

Neste ponto, um arquivo unicorn.pid é gravado nesse diretório. O arquivo tem um proprietário:grupo de discourse:www-data.

Minha correção foi alterar recursivamente a propriedade de /var/www/discourse para discourse:www-data.

chown -R discourse:www-data /var/www/discourse

Isso leva muito tempo, pois há mais de 100.000 arquivos. Provavelmente não é necessário fazer o diretório inteiro, mas foi o que eu fiz.

Por último, tornei o arquivo /etc/postgres/13/main/pb_hba.conf legível por todos

chmod +r /etc/postgres/13/pg_hba.conf

Reinicie o contêiner e tudo funciona.

Parece que a configuração de propriedade de arquivo não está exatamente correta, mas não sou versado o suficiente na arte de definir permissões para descobrir uma correção mais simples. O fato de o arquivo unicorn.pid ter um grupo www-data parece ser a chave.

Parece que eu precisaria executar este procedimento toda vez que fizer um rebuild (ou seja, sempre que alterar o arquivo app.yml). Observe também que não parece ser um problema com um plugin específico.

Espero que isso seja informação suficiente para um dos desenvolvedores dar uma olhada e dizer: “Claro! Eu só tenho que mudar x para consertar isso.”

1 curtida

Talvez o seu problema seja diferente do de todos os outros. Qual versão do docker você está executando e como você a instalou?

Concordo que não faz sentido que seu docker, que funcionou por muito tempo, possa ser um problema.

Executar docker --version no meu servidor retorna

Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1

Parece que talvez eu não esteja atualizado?

2 curtidas

Esta versão do docker funcionou para mim @StanD.

Docker version 24.0.5, build ced0996.

Você pode tentar isso.

1 curtida

SIM! Isso funcionou para mim.

Com base na minha experiência e na do @Stand, parece que o Discourse não funciona mais em versões antigas do Docker.

1 curtida