ArgumentError: directorio para pid=/.../unicorn.pid no es escribible

Aquí está la cola de mi unicorn.stderr.log por si sirve de algo

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)

Recién configurado desde un proveedor de hosting en la nube. No hice nada más que actualizar el sistema, instalar docker, zsh, nginx y ejecutar la configuración de discourse, que falló.

Editar:

Reconstruí el servidor en la nube con Fedora, solo instalé docker y luego intenté la instalación nueva de nuevo.

Otro error diferente

[Tue 22 Aug 2023 05:51:02 PM UTC] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Tue 22 Aug 2023 05:51:02 PM UTC] Reload error for :
Started runsvdir, PID is 2941
ok: run: redis: (pid 2953) 0s
ok: run: postgres: (pid 2954) 0s
supervisor pid: 2949 unicorn pid: 2981

el nginx interno no quiere ejecutarse.

Espera, ¿por qué instalaste nginx? La instalación predeterminada fallará si ya hay algo en el host usando el puerto 80.

En una nueva instancia de Digital Ocean no hice nada que no estuviera en la guía de instalación oficial, y funcionó bien. Dejé que el instalador de Discourse instalara docker por mí y todo.

Intentar reproducir esto está resultando complicado.

2 Me gusta

Sí, parece que sí. Definitivamente parece ser algo real, ya que he visto a varias personas informarlo (@DarthLasciel , @Godmar_Back y quizás @kdambekalns ).

Hazme saber si hay algo que quieras ver de mi instalación.

1 me gusta

¿Sigue ocurriendo el problema si intentas aprovisionar bajo un nuevo subdominio en un servidor completamente nuevo y siguiendo estrictamente nuestra guía de instalación oficial, absteniéndote de instalar paquetes adicionales en el host?

¿También puedes compartir tu app.yml [redacted]?

Específicamente, asegúrate de redactar la variable de entorno DISCOURSE_SMTP_PASSWORD y cualquier otra parte sensible.

También:

¿Puedes intentar agregar esto a la URL? ?safe_mode=no_plugins

Si tiene éxito, podría indicar errores en los plugins.

Excepto por la parte del subdominio, hice exactamente eso.
Nuevo servidor Fedora, instalo docker, instalo discourse, configuro sin instalar nginx en el servidor. El resultado es el error publicado anteriormente.

## esta es la plantilla de contenedor Docker de Discourse todo en uno e independiente
##
## Después de realizar cambios en este archivo, DEBE reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TENGA MUCHO CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON MUY, MUY SENSIBLES A ERRORES DE ESPACIO EN BLANCO O ALINEACIÓN!
## visite http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Descomente la siguiente línea para habilitar el oyente IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Descomente estas dos líneas si desea agregar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## ¿qué puertos TCP/IP debe exponer este contenedor?
## Si desea que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulte https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "9980:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establezca db_shared_buffers en un máximo del 25% de la memoria total.
  ## será establecido automáticamente por bootstrap según la RAM detectada, o puede anularlo
  #db_shared_buffers: "256MB"

  ## puede mejorar el rendimiento de ordenación, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: 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

  ## ¿Cuántas solicitudes web concurrentes se admiten? Depende de la memoria y los núcleos de CPU.
  ## será establecido automáticamente por bootstrap según las CPU detectadas, o puede anularlo
  #UNICORN_WORKERS: 3

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Requerido. Discourse no funcionará con un número IP simple.
  DISCOURSE_HOSTNAME: 'redacted.de'

  ## Descomente si desea que el contenedor se inicie con el mismo
  ## nombre de host (-h option) que se especifica arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que se convertirán en administradores y desarrolladores
  ## en el registro inicial, por ejemplo, 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # Se requieren la DIRECCIÓN SMTP, el nombre de usuario y la contraseña
  # ADVERTENCIA: el carácter '#' en la contraseña SMTP puede 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, predeterminado true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requerido por algunos proveedores)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (dirección para enviar notificaciones desde)

  ## Si agregó la plantilla Lets Encrypt, descomente a continuación para obtener un certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulte https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La clave de dirección IP de geolocalización de Maxmind para la búsqueda de direcciones IP
  ## consulte https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker no tiene estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulte https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Comienzo de comandos personalizados"
  ## Si desea establecer la dirección de correo electrónico 'De' para su primer registro, descomente y cambie:
  ## Después de recibir el primer correo electrónico de registro, vuelva a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fin de comandos personalizados"

Tengo el mismo problema de permisos donde unicorn.pid no se puede escribir. Quería darte más información viendo si se reproduce con la guía de instalación oficial, pero eso no se ajusta a mi sistema. Primero se quejó porque los puertos 80/443 ya estaban en uso, y luego hizo algunas comprobaciones de correo electrónico que fallaron. ¿Tienes un app.yml que simplemente crea una imagen de docker que no requiere nada externo? Presumiblemente, el mismo problema debería reproducirse con eso también.

Arreglé el problema y me siento increíblemente estúpido.

En lugar de instalar Docker “de la manera correcta”, simplemente ingresé “sudo apt install docker-compose” y seguí adelante. Docker “parecía” funcionar… parecía…

Lo reinstalé de la manera que me indica la guía de Docker, agregando otro repositorio, llaves, todo eso… ¡Y Discourse funciona!

7 Me gusta

Así que la culpa fue de una instalación defectuosa de Docker. Realmente no entiendo por qué todavía es tan difícil instalar un Docker actualizado y funcional. Y parece que finalmente integraron docker-compose en Docker (así que puedes hacer docker compose ...), aunque todavía no le he prestado mucha atención a eso.

@rtwfroody y @StanD, ¿esto también resuelve su problema?

2 Me gusta

Pero no usamos docker-compose en absoluto.

Bueno saberlo, pero nuestra guía no pide nada de eso, ejecutas discourse-setup y te instalará docker.

Estoy bastante seguro de que mi instalación de Docker está bien y no estoy usando docker compose. Honestamente, lo único que hice fue eliminar un plugin (el plugin discourse-checklist que ya no es necesario) y ejecutar una reconstrucción en una instancia autoalojada y actualizada que ha estado funcionando bien durante años.

Desafortunadamente, mi trabajo principal me ha impedido investigar esto durante las últimas 24 horas. Debería retomarlo esta noche. Veré si puedo proporcionar más información.

1 me gusta

Tuve el mismo problema cuando estaba haciendo una instalación limpia en una EC2 (Ubuntu 22.04.3 LTS).
Tenía experiencia previa en la configuración de Discourse (alrededor de 2-3 veces).

Inicialmente, pensé que era un problema de compilación y ejecuté ./launcher rebuild app varias veces, lo que agotó el límite semanal de certificados SSL ofrecido por Let’s Encrypt, razón por la cual el sitio web mostraba el error site cant be reached error.

Más tarde, intenté ./launcher logs app. Mostraba los siguientes errores:

  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 límite de Let’s Encrypt.

Lo único que hice diferente de la guía oficial fue la instalación de Docker.
Instalé Docker usando sudo apt install docker.io. Desinstalé esto por completo y dejé que la instalación de Docker se realizara con ./discourse-setup.

¡Y funcionó!
Como dijo @pfaffman, fue un problema con la instalación de Docker.

PD: Avancé con un nuevo subdominio durante la segunda instalación, ya que tuve que configurar el servidor de Discourse con prioridad.

Apoyando lo que dijeron @pfaffman y @csgeek, lo siguiente funcionó para mí:

  1. apt remove docker.io, eliminando docker.io (20.10.25-0ubuntu1~22.04.1)
  2. Ejecuta ./discourse-setup hasta que haya instalado docker, luego sal de él.
  3. systemctl start docker
  4. ./launcher rebuild app

Esto es en un sistema que ejecuta Ubuntu 22.04.3 LTS.

1 me gusta

Hola @jeanas. Esto parece ser lo que hay que probar. ¿Podrías hacer esto?

Y si eso funciona para ti, ¿marcas su publicación como la solución?

[Nota: Mi caso no es realmente un problema de #instalación, pero el error producido es el mismo que en este tema y mi solución (a continuación) puede ser útil para otros. Moderadores (@pfaffman?), siéntanse libres de categorizar esto de manera más apropiada.]

El mensaje ArgumentError aparece después de ejecutar ./launcher rebuild app en mi instancia autohospedada de Docker (instalada y funcionando durante muchos años). Ocurre porque unicorn no puede escribir un archivo pid en el directorio /var/www/discourse/tmp/pids (dentro del contenedor). El registro muestra un bucle de mensajes ArgumentError mientras intenta escribir ese archivo cada pocos segundos.

Inicio sesión en el contenedor desde la máquina host a través de

docker exec -it app bash

Desde dentro del contenedor ejecuto

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

Esto me muestra una lista de los propietario:grupos en ese directorio

root:root
discourse:discourse

Luego hago que el directorio /var/www/discourse/tmp/pids sea legible por todos a través de

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

En este punto, se escribe un archivo unicorn.pid en ese directorio. El archivo tiene un propietario:grupo de discourse:www-data.

Mi solución fue cambiar recursivamente la propiedad de /var/www/discourse a discourse:www-data.

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

Esto lleva mucho tiempo ya que hay más de 100.000 archivos. Probablemente no sea necesario hacerlo en todo el directorio, pero eso es lo que hice.

Por último, hice que el archivo /etc/postgres/13/main/pb_hba.conf fuera legible por todos

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

Reinicie el contenedor y todo funciona.

Parece que la configuración de propiedad de archivos no es del todo correcta, pero no tengo suficientes conocimientos sobre el arte de establecer permisos para encontrar una solución más simple. El hecho de que el archivo unicorn.pid tenga un grupo www-data parece ser clave.

Parece que tendría que pasar por este procedimiento cada vez que ejecute un rebuild (es decir, cada vez que cambie el archivo app.yml). Tenga en cuenta también que no parece ser un problema con ningún plugin en particular.

Espero que sea suficiente información para que uno de los desarrolladores lo revise y diga: “¡Por supuesto! Solo tengo que cambiar x para solucionarlo”.

1 me gusta

Quizás tu problema sea diferente al de los demás. ¿Qué versión de docker estás ejecutando y cómo la instalaste?

Estoy de acuerdo en que no tiene sentido que tu docker, que ha funcionado durante mucho tiempo, pueda ser un problema.

Ejecutar docker --version en mi servidor devuelve

Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1

¿Parece que podría no estar actualizado?

2 Me gusta

Esta versión de docker me funcionó @StanD.

Docker version 24.0.5, build ced0996.

Puedes probar esto.

1 me gusta

¡SÍ! Eso funcionó para mí.

Según mi experiencia y la de @Stand, parece que Discourse ya no funciona en versiones anteriores de Docker.

1 me gusta