ArgumentError: Verzeichnis für pid=/.../unicorn.pid nicht beschreibbar

Hier ist das Ende meiner unicorn.stderr.log-Datei, falls es etwas nützt

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)

Frisch von einem Cloud-Hoster eingerichtet. Habe nichts weiter getan, als das System zu aktualisieren, Docker, zsh, nginx zu installieren und das Setup für Discourse auszuführen, was fehlschlug.

Bearbeiten:
Ich habe den Cloud-Server mit Fedora neu erstellt, nur Docker installiert und dann versucht, die frische Installation erneut durchzuführen.

Ein weiterer anderer Fehler

[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

Das interne Nginx will nicht laufen.

Moment mal, warum hast du nginx installiert? Eine Standardinstallation schlägt fehl, wenn bereits etwas auf dem Host Port 80 belegt.

Auf einem neuen Digital Ocean Droplet habe ich nichts getan, was nicht in der offiziellen Installationsanleitung stand, und es hat einwandfrei funktioniert. Ich habe den Discourse-Installer die Docker-Installation für mich erledigen lassen und alles.

Der Versuch, dies zu reproduzieren, erweist sich als schwierig.

2 „Gefällt mir“

Ja, das scheint so zu sein. Es scheint definitiv ein Problem zu sein, da ich mehrere Leute darüber berichten gesehen habe (@DarthLasciel , @Godmar_Back und vielleicht @kdambekalns ).

Lassen Sie mich wissen, wenn Sie etwas von meiner Installation sehen möchten.

1 „Gefällt mir“

Tritt das Problem immer noch auf, wenn Sie versuchen, unter einer neuen Subdomain auf einem brandneuen Server bereitzustellen und dabei strikt unsere offizielle Installationsanleitung befolgen, ohne zusätzliche Pakete auf dem Host zu installieren?

Können Sie uns außerdem bitte Ihre [redacted] app.yml mitteilen?

Bitte stellen Sie insbesondere sicher, dass die Umgebungsvariable DISCOURSE_SMTP_PASSWORD und alle anderen sensiblen Teile geschwärzt werden.

Außerdem:

Können Sie versuchen, dies zur URL hinzuzufügen? ?safe_mode=no_plugins

Wenn es erfolgreich ist, könnte dies auf Plugin-Fehler hinweisen.

Bis auf den Subdomain-Teil habe ich genau das getan.
Neuer Fedora Server, Docker installieren, Discourse installieren, Einrichtung ohne Installation von Nginx auf dem Server. Führt zu dem oben geposteten Fehler.

## Dies ist die All-in-One, Standalone Docker-Container-Vorlage für Discourse
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu erstellen
## /var/discourse/launcher rebuild app
##
## SEIEN SIE *SEHR* VORSICHTIG BEIM BEARBEITEN!
## YAML-DATEIEN SIND SUPER SUPER EMPFINDLICH GEGENÜBER FEHLERN BEI LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Auskommentieren der nächsten Zeile, um den IPv6-Listener zu aktivieren
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Welche TCP/IP-Ports soll dieser Container verfügbar machen?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder Nginx teilt,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
  - "9980:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Setzen Sie db_shared_buffers auf maximal 25% des Gesamtspeichers.
  ## wird automatisch von Bootstrap basierend auf dem erkannten RAM gesetzt, oder Sie können überschreiben
  #db_shared_buffers: "256MB"

  ## kann die Sortierleistung verbessern, erhöht aber den Speicherverbrauch pro Verbindung
  #db_work_mem: "40MB"

  ## Welche Git-Revision soll dieser Container verwenden? (Standard: 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

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt von Speicher und CPU-Kernen ab.
  ## wird automatisch von Bootstrap basierend auf den erkannten CPUs gesetzt, oder Sie können überschreiben
  #UNICORN_WORKERS: 3

  ## TODO: Der Domainname, unter dem diese Discourse-Instanz erreichbar sein wird
  ## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Nummer.
  DISCOURSE_HOSTNAME: 'redacted.de'

  ## Auskommentieren, wenn der Container mit demselben
  ## Hostnamen (-h Option) wie oben angegeben gestartet werden soll (Standard "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der per Komma getrennten E-Mails, die bei der ersten Anmeldung Administrator und Entwickler werden
  ## Beispiel 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

  ## TODO: Der SMTP-Mailserver, der zum Überprüfen neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-ADRESSE, Benutzername und Passwort sind erforderlich
  # ACHTUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  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           # (optional, Standard true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (von einigen Anbietern erforderlich)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (Adresse, von der Benachrichtigungen gesendet werden)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, kommentieren Sie unten aus, um ein kostenloses SSL-Zertifikat zu erhalten
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Die http- oder https-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Der Maxmind Geolocation IP-Adressschlüssel für die IP-Adressensuche
  ## siehe https://meta.discourse.org/t/-/137387/23 für Details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins kommen hierher
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Alle benutzerdefinierten Befehle, die nach dem Erstellen ausgeführt werden sollen
run:
  - exec: echo "Beginn der benutzerdefinierten Befehle"
  ## Wenn Sie die 'Von'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, kommentieren Sie sie aus und ändern Sie sie:
  ## Nachdem Sie die erste Registrierungs-E-Mail erhalten haben, kommentieren Sie die Zeile wieder aus. Sie muss nur einmal ausgeführt werden.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Ende der benutzerdefinierten Befehle"

Ich habe dasselbe Berechtigungsproblem, bei dem unicorn.pid nicht beschreibbar ist. Ich wollte Ihnen weitere Informationen geben, indem ich sehe, ob es mit der offiziellen Installationsanleitung reproduzierbar ist, aber das passt nicht zu meinem System. Zuerst beschwerte es sich, weil die Ports 80/443 bereits belegt sind, und dann führte es einige E-Mail-Prüfungen durch, die fehlschlugen. Haben Sie eine app.yml, die nur ein Docker-Image erstellt, das nichts Externes benötigt? Vermutlich sollte dasselbe Problem auch damit reproduzierbar sein.

Ich habe das Problem „behoben“, und ich fühle mich unglaublich dumm.

Anstatt Docker „richtig“ zu installieren, habe ich einfach „sudo apt install docker-compose“ eingegeben und bin damit losgelaufen. Docker schien zu funktionieren… schien…

Ich habe es auf die Art und Weise neu installiert, wie die Docker-Anleitung es mir sagt, indem ich ein weiteres Repository, Keyrings und all das Zeug hinzugefügt habe… Und Discourse läuft!

7 „Gefällt mir“

Eine fehlerhafte Docker-Installation war schuld. Ich verstehe wirklich nicht, warum es immer noch so schwierig ist, ein aktuelles und funktionierendes Docker zu installieren. Und es scheint, dass sie docker-compose endlich in Docker integriert haben (sodass man docker compose ... machen kann), obwohl ich dem noch keine genaue Aufmerksamkeit geschenkt habe.

@rtwfroody und @StanD, löst das auch euer Problem?

2 „Gefällt mir“

Aber wir verwenden gar kein Docker Compose

Gut zu wissen, aber unsere Anleitung verlangt nichts davon. Sie führen discourse-setup aus und es wird Docker für Sie installieren.

Ich bin ziemlich sicher, dass meine Docker-Installation in Ordnung ist und ich verwende kein Docker Compose. Ehrlich gesagt, alles, was ich getan habe, war, ein Plugin zu entfernen (das nicht mehr benötigte discourse-checklist Plugin) und einen Rebuild auf einer selbst gehosteten, aktuellen Instanz durchzuführen, die seit Jahren problemlos läuft.

Leider hat mich mein Hauptberuf davon abgehalten, mich in den letzten 24 Stunden darum zu kümmern. Ich werde mich heute Abend wieder darum kümmern. Ich werde sehen, ob ich weitere Informationen bereitstellen kann.

1 „Gefällt mir“

Ich hatte das gleiche Problem, als ich eine Neuinstallation auf einer EC2 (Ubuntu 22.04.3 LTS) durchführte.
Ich hatte bereits Erfahrung mit der Einrichtung von Discourse (etwa 2-3 Mal).

Anfangs dachte ich, es sei ein Build-Problem und führte mehrmals ./launcher rebuild app aus, wodurch ich das wöchentliche Limit für SSL-Zertifikate von Let’s Encrypt erschöpfte. Deshalb zeigte die Website die Fehlermeldung site cant be reached error.

Später versuchte ich ./launcher logs app. Es wurden die folgenden Fehler angezeigt:

  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 - Let’s Encrypt Rate-limit issue.

Das Einzige, was ich anders machte als im offiziellen Leitfaden war die Docker-Installation.
Ich installierte Docker mit sudo apt install docker.io. Ich deinstallierte dies vollständig und ließ die Docker-Installation über ./discourse-setup durchführen.

Und es funktionierte!!
Wie @pfaffman sagte, war es ein Problem mit der Docker-Installation.

PS: Ich habe bei der zweiten Installation eine neue Subdomain verwendet, da ich den Discourse-Server priorisieren musste.

Dem, was @pfaffman und @csgeek gesagt haben, stimme ich zu. Folgendes hat für mich funktioniert:

  1. apt remove docker.io, Entfernen von docker.io (20.10.25-0ubuntu1~22.04.1)
  2. Führen Sie ./discourse-setup aus, bis Docker installiert ist, und beenden Sie es dann.
  3. systemctl start docker
  4. ./launcher rebuild app

Dies geschieht auf einem System, auf dem Ubuntu 22.04.3 LTS ausgeführt wird.

1 „Gefällt mir“

Hallo @jeanas. Das sieht nach der Sache aus, die wir ausprobieren sollten. Könntest du das tun:

Und wenn das für dich funktioniert, markiere seinen Beitrag als Lösung?

[Hinweis: Mein Fall ist eigentlich kein #Installationsproblem, aber die Fehlermeldung ist dieselbe wie in diesem Thema und meine Lösung (unten) könnte für andere hilfreich sein. Moderatoren (@pfaffman?), könnt ihr das bitte passender kategorisieren.]

Die Meldung ArgumentError erscheint, nachdem ich ./launcher rebuild app auf meiner selbst gehosteten Docker-Instanz (seit vielen Jahren installiert und funktionierend) ausführe. Dies geschieht, weil Unicorn keine PID-Datei in das Verzeichnis /var/www/discourse/tmp/pids (innerhalb des Containers) schreiben kann. Das Protokoll zeigt eine Schleife von ArgumentError-Meldungen, da versucht wird, diese Datei alle paar Sekunden zu schreiben.

Ich melde mich vom Host-Rechner aus über

docker exec -it app bash

in den Container ein.

Innerhalb des Containers führe ich aus

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

Dies zeigt mir eine Liste der Besitzer:Gruppen in diesem Verzeichnis

root:root
discourse:discourse

Dann mache ich das Verzeichnis /var/www/discourse/tmp/pids für alle lesbar, indem ich

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

ausführe. An diesem Punkt wird eine unicorn.pid-Datei in dieses Verzeichnis geschrieben. Die Datei hat einen Besitzer:Gruppe von discourse:www-data.

Meine Lösung war, den Besitz von /var/www/discourse rekursiv auf discourse:www-data zu ändern.

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

Dies dauert lange, da es über 100.000 Dateien gibt. Wahrscheinlich ist es nicht notwendig, das gesamte Verzeichnis zu durchlaufen, aber das habe ich getan.

Zuletzt habe ich die Datei /etc/postgres/13/main/pb_hba.conf für alle lesbar gemacht.

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

Starte den Container neu und alles funktioniert.

Es scheint, dass die Einrichtung des Dateibesitzes nicht ganz richtig ist, aber ich bin nicht erfahren genug mit der Kunst der Berechtigungseinstellungen, um eine einfachere Lösung zu finden. Die Tatsache, dass die unicorn.pid-Datei eine Gruppe von www-data hat, scheint der Schlüssel zu sein.

Es scheint, dass ich diese Prozedur jedes Mal durchlaufen müsste, wenn ich einen rebuild durchführe (d. h. jedes Mal, wenn ich die app.yml-Datei ändere). Beachte auch, dass es sich nicht um ein Problem mit einem bestimmten Plugin zu handeln scheint.

Hoffentlich sind das genügend Informationen für einen der Entwickler, um sich das anzusehen und zu sagen: “Natürlich! Ich muss nur x ändern, um es zu beheben.”

1 „Gefällt mir“

Vielleicht ist Ihr Problem anders als das aller anderen. Welche Docker-Version verwenden Sie und wie haben Sie sie installiert?

Ich stimme zu, dass es keinen Sinn ergibt, dass Ihr seit langem funktionierendes Docker ein Problem darstellen könnte.

Wenn ich docker --version auf meinem Server ausführe, erhalte ich Folgendes:

Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1

Sieht so aus, als wäre ich nicht auf dem neuesten Stand?

2 „Gefällt mir“

Diese Version von Docker hat für mich funktioniert, @StanD.

Docker version 24.0.5, build ced0996.

Sie können dies versuchen.

1 „Gefällt mir“

JA! Das hat bei mir funktioniert.

Basierend auf meiner Erfahrung und der von @Stand scheint es, dass Discourse auf älteren Docker-Versionen nicht mehr funktioniert.

1 „Gefällt mir“