ArgumentError: pid=/.../unicorn.pid のディレクトリに書き込めません

unicorn.stderr.log の末尾を参考までに示します。

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 (サーバー)

クラウドホスティングから新規セットアップしました。システムを更新し、docker、zsh、nginxをインストールし、Discourseのセットアップを実行しただけで、失敗しました。

編集:
クラウドサーバーをFedoraで再構築し、dockerをインストールしてから、新規インストールを再度試しました。

別のエラーが発生しました。

[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

内部のnginxが実行したくないようです。

待ってください、なぜnginxをインストールしたのですか?ホスト上のポート80をすでに使用しているものがあると、デフォルトのインストールは失敗します。

新しいDigital Oceanドロップレットで、公式のインストールガイドに記載されていること以外は何も行いませんでしたが、うまくいきました。DiscourseインストーラーにDockerをインストールさせるなど、すべてです。

これを再現しようとしていますが、難しいことが証明されています。

「いいね!」 2

ええ、そうみたいですね。複数の人が報告しているのを見たので、間違いなくそうだと思います(@DarthLasciel@Godmar_Back、そしておそらく@kdambekalns)。

私のインストールから何か見たいものがあれば教えてください。

「いいね!」 1

新しいサーバーで新しいサブドメインでプロビジョニングを試した場合、また、ホストに余分なパッケージをインストールせずに、公式のインストールガイドに厳密に従った場合でも、問題はまだ発生しますか?

また、[redacted] app.yml を共有していただけますか?

Specifically, please be sure to redact the DISCOURSE_SMTP_PASSWORD environment variable and any other sensitive bits.

Also:

Can you try adding this to the URL? ?safe_mode=no_plugins

If it succeeds, it might point to plugin bugs.

サブドメインの部分を除いて、まったく同じことをしました。
新しいFedoraサーバーにDockerをインストールし、Discourseをインストールし、サーバーにnginxをインストールせずにセットアップしました。結果として、上記のエラーが発生しました。

## これは、オールインワンのスタンドアロンDiscourse Dockerコンテナテンプレートです
##
## このファイルを変更した後は、必ず再構築してください
## /var/discourse/launcher rebuild app
##
## 編集は*非常に注意深く*行ってください!
## YAMLファイルは、空白や配置の誤りに非常に敏感です!
## 必要に応じて、このファイルを検証するために http://www.yamllint.com/ を参照してください。

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## IPv6リスナーを有効にするには、次の行のコメントを解除してください
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Let's Encrypt (https) を追加したい場合は、これらの2行のコメントを解除してください
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## このコンテナはどのTCP/IPポートを公開しますか?
## Apacheやnginxのような他のWebサーバーとポートを共有したい場合は、
## 詳細については https://meta.discourse.org/t/17247 を参照してください。
expose:
  - "9980:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers を総メモリの最大25%に設定してください。
  ## ブートストラップによって検出されたRAMに基づいて自動的に設定されますが、上書きすることもできます。
  #db_shared_buffers: "256MB"

  ## ソートパフォーマンスを向上させることができますが、接続ごとのメモリ使用量が増加します。
  #db_work_mem: "40MB"

  ## このコンテナはどのGitリビジョンを使用しますか? (デフォルト: 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

  ## 同時に処理できるWebリクエスト数はいくつですか?メモリとCPUコアに依存します。
  ## ブートストラップによって検出されたCPUに基づいて自動的に設定されますが、上書きすることもできます。
  #UNICORN_WORKERS: 3

  ## TODO: このDiscourseインスタンスが応答するドメイン名
  ## 必須。Discourseは単なるIPアドレスでは機能しません。
  DISCOURSE_HOSTNAME: 'redacted.de'

  ## 上記で指定されたホスト名 (-h オプション) と同じホスト名でコンテナを起動したい場合は、コメントを解除してください (デフォルトは "$hostname-$config")。
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期サインアップ時に管理者および開発者となるメールアドレスのカンマ区切りリスト
  ## 例: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

  ## TODO: 新規アカウントの検証や通知の送信に使用されるSMTPメールサーバー
  # SMTPアドレス、ユーザー名、パスワードが必要です
  # 注意: SMTPパスワードの '#' 文字は問題を引き起こす可能性があります!
  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           # (オプション、デフォルトはtrue)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (一部のプロバイダーで必要)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (通知を送信するアドレス)

  ## Lets Encryptテンプレートを追加した場合、SSL証明書を取得するには下のコメントを解除してください
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## このDiscourseインスタンスのHTTPまたはHTTPS CDNアドレス (プル用に設定)
  ## 詳細については https://meta.discourse.org/t/14857 を参照してください
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## IPアドレスルックアップ用のMaxMindジオロケーションIPアドレスキー
  ## 詳細については https://meta.discourse.org/t/-/137387/23 を参照してください
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Dockerコンテナはステートレスです。すべてのデータは /shared に保存されます。
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## プラグインはここに配置します
## 詳細については https://meta.discourse.org/t/19157 を参照してください
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## ビルド後に実行するカスタムコマンド
run:
  - exec: echo "カスタムコマンドの開始"
  ## 初回登録時の「差出人」メールアドレスを設定したい場合は、コメントを解除して変更してください。
  ## 初回のサインアップメールを受信したら、行をコメントアウトしてください。一度だけ実行する必要があります。
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "カスタムコマンドの終了"

unicorn.pid が書き込み可能でないという同じ権限の問題が発生しています。公式のインストールガイドで再現するかどうかを確認して、さらに詳しい情報を提供したかったのですが、私のシステムには適合しません。まず、ポート 80/443 が既に使用されているという苦情があり、その後、失敗したいくつかのメールチェックが行われました。外部を何も必要としない Docker イメージを作成するだけの app.yml はありますか?おそらく、この同じ問題も同様に再現するはずです。

問題を「修正」しました。信じられないほど愚かだと感じています。

Docker を「正しい方法」でインストールする代わりに、「sudo apt install docker-compose」と入力して実行しました。Docker は「動作しているように見えました」…見えただけでした…

Docker のガイドに記載されている方法で再インストールしました。別のリポジトリ、キーリングなどを追加しました…そして Discourse が動作しました!

「いいね!」 7

ひどいDockerのインストールが原因でした。最新で機能的なDockerのインストールがまだこんなに難しいとは、本当に理解できません。そして、ついにdocker-composeがDockerに統合されたようです(docker compose ...ができるようになります)が、まだ詳しく見ていません。

@rtwfroody@StanD、これで皆さんの問題も解決しますか?

「いいね!」 2

しかし、私たちはdocker-composeを全く使用していません。

参考になりました。しかし、私たちのガイドではそのようなことは要求されていません。discourse-setupを実行すると、Dockerが自動的にインストールされます。

Dockerのインストールは問題ないはずで、Docker Composeも使用していません。正直なところ、やったことといえば、不要になったdiscourse-checklistプラグインを削除し、長年正常に稼働していたセルフホスト型の最新インスタンスを再構築しただけです。

残念ながら、ここ24時間は本業で忙しく、この問題に取り組むことができませんでした。今晩、改めて取り掛かる予定です。追加情報を提供できるか確認します。

「いいね!」 1

EC2(Ubuntu 22.04.3 LTS)でクリーンインストールした際にも同様の問題が発生しました。
以前にもDiscourseのセットアップ経験(2〜3回)がありました。

当初はビルドの問題だと思い、SSL証明書の週ごとの上限に達するまで何度も ./launcher rebuild app を実行しました。その結果、ウェブサイトで「サイトにアクセスできません」というエラーが表示されるようになりました。

その後、./launcher logs app を試したところ、以下のエラーが表示されました。

  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 のレート制限の問題

公式ガイドと唯一異なっていたのは、Dockerのインストール方法でした。
sudo apt install docker.io を使用してDockerをインストールしましたが、これを完全にアンインストールし、./discourse-setup でDockerのインストールを行いました。

すると、うまくいきました!
@pfaffman が言っていたように、Dockerのインストールに問題がありました。

追伸:Discourseサーバーを優先的にセットアップする必要があったため、2回目のインストール時には新しいサブドメインを使用しました。

@pfaffman@csgeek が言ったことに賛成します。以下の手順でうまくいきました。

  1. apt remove docker.iodocker.io (20.10.25-0ubuntu1~22.04.1) を削除します。
  2. ./discourse-setup を実行し、docker がインストールされるまで実行してから終了します。
  3. systemctl start docker
  4. ./launcher rebuild app

これは Ubuntu 22.04.3 LTS を実行しているシステムでの手順です。

「いいね!」 1

@jeanas さん、試してみるべきことのようですね。これを試していただけますか?

そして、それがうまくいったら、彼の投稿を解決策としてマークしていただけますか?

[Note: 私のケースは実際には Installation の問題ではありませんが、生成されるエラーはこのトピックと同じであり、私の修正(下記)は他の人にとって役立つかもしれません。モデレーター(@pfaffman?)、これをより適切に分類してください。]

ArgumentError メッセージは、セルフホストされた Docker インスタンス(長年インストールされ、動作していました)で ./launcher rebuild app を実行した後に表示されます。これは、unicorn がコンテナ内の /var/www/discourse/tmp/pids ディレクトリに pid ファイルを書き込めないことが原因です。ログには、数秒ごとにそのファイルを書き込もうとする ArgumentError メッセージのループが表示されます。

ホストマシンからコンテナに次のようにログインします。

docker exec -it app bash

コンテナ内から次を実行します。

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

これにより、そのディレクトリの所有者:グループのリストが表示されます。

root:root
discourse:discourse

次に、/var/www/discourse/tmp/pids ディレクトリを世界読み取り可能にします。

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

この時点で、unicorn.pid ファイルがそのディレクトリに書き込まれます。ファイルは discourse:www-data の所有者:グループを持ちます。

私の修正は、/var/www/discourse の所有権を再帰的に discourse:www-data に変更することでした。

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

100,000 を超えるファイルがあるため、これには時間がかかります。ディレクトリ全体を行う必要はないかもしれませんが、私はそうしました。

最後に、/etc/postgres/13/main/pb_hba.conf ファイルを世界読み取り可能にしました。

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

コンテナを再起動すると、すべてが機能します。

ファイル所有権の設定が少し間違っているようですが、より簡単な修正を見つけるほど権限設定の技術に精通していません。unicorn.pid ファイルのグループが www-data であるという事実は重要であるようです。

rebuild を行うたびに(つまり、app.yml ファイルを変更するたびに)、この手順を実行する必要があるようです。また、特定のプラグインの問題ではないことも注目してください。

開発者のいずれかが確認して、「もちろん!x を変更するだけで修正できます」と言えるだけの十分な情報が提供されていることを願っています。

「いいね!」 1

もしかしたら、あなたの問題は他の人とは違うのかもしれません。どのバージョンのDockerを実行していて、どのようにインストールしましたか?

長年動作していたDockerが問題になるというのは、確かに理にかなっていませんね。

サーバーで docker --version を実行すると、次の結果が返されます。

Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1

最新の状態ではない可能性がありますか?

「いいね!」 2

このバージョンのDockerは私には使えましたよ、@StanDさん

Docker version 24.0.5, build ced0996 です。

これを試してみてはいかがでしょうか。

「いいね!」 1

はい!うまくいきました。
私の経験と@Standさんの経験に基づくと、Discourseは古いDockerバージョンではもう機能しないようです。

「いいね!」 1