ArgumentError: directory per pid=/.../unicorn.pid non scrivibile

Ecco la coda del mio unicorn.stderr.log per quello che vale

I, [2023-08-22T04:18:52.795267 #81]  INFO -- : Aggiornamento dell'elenco Gem
fatal: proprietà dubbia rilevata nel repository in '/var/www/discourse'
Per aggiungere un'eccezione per questa directory, chiama:

	git config --global --add safe.directory /var/www/discourse
I, [2023-08-22T04:18:57.742262 #81]  INFO -- : in ascolto su addr=127.0.0.1:3000 fd=10
fatal: proprietà dubbia rilevata nel repository in '/var/www/discourse'
Per aggiungere un'eccezione per questa directory, chiama:

	git config --global --add safe.directory /var/www/discourse
I, [2023-08-22T04:19:04.916798 #81]  INFO -- : avvio di 1 sidekiq supervisionati
I, [2023-08-22T04:19:04.927971 #81]  INFO -- : avvio del demone EmailSync
I, [2023-08-22T04:19:07.993280 #81]  INFO -- : processo master pronto
I, [2023-08-22T04:19:11.010040 #174]  INFO -- : worker=0 pronto
I, [2023-08-22T04:19:11.994849 #188]  INFO -- : worker=1 pronto
I, [2023-08-22T04:19:12.524936 #203]  INFO -- : worker=2 pronto

Ubuntu 22.04 (Server)

Appena configurato da un provider di servizi cloud. Non ho fatto altro che aggiornare il sistema, installare docker, zsh, nginx ed eseguire la configurazione per discourse, che è fallita.

Modifica:

Ho ricostruito il server cloud con Fedora, ho appena installato docker e poi ho riprovato l’installazione da zero.

Un altro errore diverso

[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

l’nginx interno non vuole avviarsi.

Aspetta, perché hai installato nginx? L’installazione predefinita fallirà se c’è già qualcosa sull’host che utilizza la porta 80.

Su un nuovo droplet Digital Ocean non ho fatto nulla che non fosse nella guida ufficiale di installazione, e ha funzionato bene. Lasciando che l’installer di Discourse installi docker per me e tutto il resto.

Cercare di riprodurre questo problema si sta rivelando complicato.

2 Mi Piace

Sì, sembra così. Sembra decisamente una cosa che accade, dato che ho visto più persone segnalarla (@DarthLasciel , @Godmar_Back e forse @kdambekalns ).

Fammi sapere se c’è qualcosa che vuoi vedere dalla mia installazione.

1 Mi Piace

Il problema si verifica ancora se si tenta di effettuare il provisioning con un nuovo sottodominio su un server nuovo di zecca, seguendo scrupolosamente la nostra guida ufficiale all’installazione ed evitando di installare pacchetti aggiuntivi sull’host?

Puoi anche condividere il tuo [redacted] app.yml?

In particolare, assicurati di oscurare la variabile d’ambiente DISCOURSE_SMTP_PASSWORD e qualsiasi altra informazione sensibile.

Inoltre:

Puoi provare ad aggiungere questo all’URL? ?safe_mode=no_plugins

Se ha successo, potrebbe indicare bug nei plugin.

Ad eccezione della parte del sottodominio, ho fatto esattamente questo.
Nuovo Fedora Server, installa docker, installa discourse, configurazione senza nginx installato sul server. Risulta nell’errore postato sopra.

## questo è il template del container Docker di Discourse tutto in uno, standalone
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI *MOLTA* ATTENZIONE QUANDO MODIFICHI!
## I FILE YAML SONO SUPER SUPER SENSIBILI A ERRORI DI SPAZIATURA O ALLINEAMENTO!
## visita http://www.yamllint.com/ per convalidare questo file secondo necessità

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Decommenta la riga successiva per abilitare il listener IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Decommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP deve esporre questo container?
## Se vuoi che Discourse condivida una porta con un altro webserver come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "9980:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Imposta db_shared_buffers al massimo del 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, o puoi sovrascriverlo
  #db_shared_buffers: "256MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git dovrebbe usare questo container? (default: 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

  ## Quante richieste web concorrenti sono supportate? Dipende da memoria e core CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, o puoi sovrascriverlo
  #UNICORN_WORKERS: 3

  ## TODO: Il nome del dominio a cui risponderà questa istanza di Discourse
  ## Obbligatorio. Discourse non funzionerà con un semplice numero IP.
  DISCOURSE_HOSTNAME: 'redacted.de'

  ## Decommenta se vuoi che il container venga avviato con lo stesso
  ## hostname (-h option) specificato sopra (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## alla prima registrazione, ad esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

  ## TODO: Il server di posta SMTP utilizzato per convalidare i nuovi account e inviare notifiche
  # SONO RICHIESTI INDIRIZZO SMTP, nome utente e password
  # ATTENZIONE il carattere '#' nella password SMTP può causare problemi!
  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           # (opzionale, default true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (richiesto da alcuni provider)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (indirizzo da cui inviare le notifiche)

  ## Se hai aggiunto il template Lets Encrypt, decommenta qui sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il pull)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La chiave dell'indirizzo IP di geolocalizzazione maxmind per la ricerca dell'indirizzo IP
  ## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Il container Docker è stateless; tutti i dati sono memorizzati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Qualsiasi comando personalizzato da eseguire dopo la build
run:
  - exec: echo "Inizio comandi personalizzati"
  ## Se vuoi impostare l'indirizzo email 'Da' per la tua prima registrazione, decommenta e modifica:
  ## Dopo aver ricevuto la prima email di registrazione, ri-commenta la riga. Deve essere eseguita solo una volta.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fine comandi personalizzati"

Ho lo stesso problema di permessi in cui unicorn.pid non è scrivibile. Volevo darti maggiori informazioni vedendo se si riproduce con la guida di installazione ufficiale, ma non si adatta al mio sistema. Prima si è lamentato perché le porte 80/443 sono già in uso, e poi ha eseguito alcuni controlli e-mail che sono falliti. Hai un file app.yml che crea solo un’immagine docker che non richiede nulla di esterno? Presumibilmente lo stesso problema si riprodurrà anche con quello.

Ho “risolto” il problema e mi sento incredibilmente stupido.

Invece di installare Docker “nel modo giusto”, ho semplicemente inserito “sudo apt install docker-compose” e sono andato avanti. Docker “sembrava” funzionare… sembrava…

L’ho reinstallato nel modo in cui la guida di Docker mi dice di fare, aggiungendo un altro repository, keyrings, tutte quelle cose… E Discourse funziona!

7 Mi Piace

Quindi un’installazione Docker fallita è stata la causa. Non capisco davvero perché sia ancora così difficile installare una versione aggiornata e funzionante di Docker. E sembra che abbiano finalmente integrato docker-compose in docker (quindi puoi fare docker compose ...), anche se non ci ho ancora prestato molta attenzione.

@rtwfroody e @StanD questo risolve anche il tuo problema?

2 Mi Piace

Ma noi non usiamo affatto docker-compose

Buono a sapersi, ma la nostra guida non chiede nulla di tutto ciò, esegui discourse-setup e installerà docker per te.

Sono abbastanza sicuro che la mia installazione di Docker vada bene e non sto usando Docker Compose. Onestamente, tutto quello che ho fatto è stato rimuovere un plugin (il plugin discourse-checklist non più necessario) ed eseguire un rebuild su un’istanza self-hosted e aggiornata che funziona bene da anni.

Sfortunatamente, il mio lavoro mi ha impedito di occuparmi di questo nelle ultime 24 ore. Dovrei riprenderlo di nuovo stasera. Vedrò se riesco a fornire maggiori informazioni.

1 Mi Piace

Ho riscontrato lo stesso problema durante una nuova installazione su EC2 (Ubuntu 22.04.3 LTS).
Ho avuto esperienze precedenti nell’impostazione di Discourse (circa 2-3 volte).

Inizialmente, ho pensato fosse un problema di compilazione ed ho eseguito ./launcher rebuild app più volte, motivo per cui ho esaurito il limite settimanale di certificati SSL offerto da Let’s Encrypt, ecco perché il sito restituiva l’errore site cant be reached error.

Successivamente, ho provato ./launcher logs app. Stava mostrando i seguenti errori:

  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 di rate-limit di Let’s Encrypt

L’unica cosa che ho fatto di diverso dalla guida ufficiale è stata l’installazione di Docker.
Ho installato Docker usando sudo apt install docker.io. L’ho disinstallato completamente e ho lasciato che l’installazione di Docker avvenisse con ./discourse-setup.

E ha funzionato!!

Come ha detto @pfaffman, era un problema con l’installazione di Docker.

PS: Ho proceduto con un nuovo sottodominio durante la seconda installazione poiché dovevo configurare il server Discourse con priorità.

Terzo quanto detto da @pfaffman e @csgeek, quanto segue ha funzionato per me:

  1. apt remove docker.io, rimuovendo docker.io (20.10.25-0ubuntu1~22.04.1)
  2. Esegui ./discourse-setup finché non ha installato docker, quindi esci.
  3. systemctl start docker
  4. ./launcher rebuild app

Questo è su un sistema che esegue Ubuntu 22.04.3 LTS.

1 Mi Piace

Ciao @jeanas. Sembra la cosa da provare. Potresti fare questo:

E se funziona per te, contrassegni il suo post come soluzione?

[Nota: Il mio caso non è propriamente un problema di #installazione, ma l’errore prodotto è lo stesso di questo topic e la mia soluzione (sottostante) potrebbe essere utile ad altri. Moderatori (@pfaffman?), sentitevi liberi di categorizzare questo in modo più appropriato.]

Il messaggio ArgumentError appare dopo aver eseguito ./launcher rebuild app sulla mia istanza self-hosted, dockerizzata (installata e funzionante da molti anni). Succede perché unicorn non è in grado di scrivere un file pid nella directory /var/www/discourse/tmp/pids (all’interno del container). Il log mostra un loop di messaggi ArgumentError mentre tenta di scrivere quel file ogni pochi secondi.

Accedo al container dalla macchina host tramite

docker exec -it app bash

Dall’interno del container eseguo

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

Questo mi mostra un elenco di proprietario:gruppo in quella directory

root:root
discourse:discourse

Quindi rendo la directory /var/www/discourse/tmp/pids leggibile da tutti tramite

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

A questo punto, un file unicorn.pid viene scritto in quella directory. Il file ha un proprietario:gruppo di discourse:www-data.

La mia soluzione è stata cambiare ricorsivamente la proprietà di /var/www/discourse in discourse:www-data.

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

Questo richiede molto tempo poiché ci sono oltre 100.000 file. Probabilmente non è necessario farlo per l’intera directory, ma è quello che ho fatto.

Infine, ho reso il file /etc/postgres/13/main/pb_hba.conf leggibile da tutti

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

Riavvio il container e tutto funziona.

Sembra che la configurazione della proprietà dei file non sia del tutto corretta, ma non sono abbastanza esperto nell’arte di impostare i permessi per trovare una soluzione più semplice. Il fatto che il file unicorn.pid abbia un gruppo www-data sembra essere la chiave.

Sembra che dovrei eseguire questa procedura ogni volta che faccio un rebuild (cioè ogni volta che modifico il file app.yml). Si noti inoltre che non sembra essere un problema con un plugin specifico.

Spero che queste informazioni siano sufficienti affinché uno degli sviluppatori dia un’occhiata e dica: “Certo! Devo solo cambiare x per risolvere”.

1 Mi Piace

Forse il tuo problema è diverso da quello di tutti gli altri. Che versione di docker stai eseguendo e come l’hai installata?

Concordo sul fatto che non abbia senso che il tuo docker, che funziona da tempo, possa essere un problema.

L’esecuzione di docker --version sul mio server restituisce

Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1

Sembra che potrei non essere aggiornato?

2 Mi Piace

Questa versione di docker ha funzionato per me @StanD.

Docker version 24.0.5, build ced0996.

Puoi provare questo.

1 Mi Piace

SÌ! Ha funzionato per me.

In base alla mia esperienza e a quella di @Stand, sembrerebbe che Discourse non funzioni più sulle vecchie versioni di Docker.

1 Mi Piace