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 (Server)

从云主机商那里全新设置的。除了更新系统、安装 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?

特别是,请务必隐藏 DISCOURSE_SMTP_PASSWORD 环境变量和任何其他敏感部分。

另外:

您可以尝试将此添加到 URL 吗? ?safe_mode=no_plugins

如果成功,这可能指向插件错误。

除了子域名部分,我做的完全一样。
新的 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),请取消注释这两行
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 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%。
  ## 将由 bootstrap 根据检测到的 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 核心。
  ## 将由 bootstrap 根据检测到的 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    # (用于发送通知的地址)

  ## 如果您添加了 Let's 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 次)。

起初,我以为是构建问题,并多次运行 ./launcher rebuild app,因此耗尽了 Let’s Encrypt 提供的 SSL 证书每周限制,这就是为什么网站会显示“无法访问网站”错误。

后来,我尝试了 ./launcher logs app。它显示了以下错误:

  1. 目录 pid=/var/www/discourse/tmp/pids/unicorn.pid 不可写 (ArgumentError)
  2. “detail”:“创建新订单时出错 :: 过去 168 小时内为此确切的域名集已颁发了过多的证书 (5)” - [Let's Encrypt 速率限制问题](https://community.letsencrypt.org/t/there-were-too-many-requests-of-a-given-type-error-creating-new-order-too-many-certificates-5-already-issued-for-this-exact-set-of-domains-in-the-last-168-hours/176622)

我与官方指南唯一不同的地方是 Docker 的安装。
我使用 sudo apt install docker.io 安装了 Docker。我将其完全卸载,然后让 Docker 通过 ./discourse-setup 进行安装。

然后就好了!!

正如 @pfaffman 所说,这是 Docker 安装的问题。

PS:由于我必须优先设置 Discourse 服务器,因此在第二次安装时我使用了新的子域名。

正如 @pfaffman@csgeek 所说,以下方法对我有用:

  1. apt remove docker.io,移除 docker.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。这看起来是值得尝试的方法。你能这样做吗:

如果这对你有用,请将他的帖子标记为解决方案?

[注意:我的情况并非真正的#installation问题,但产生的错误与此主题中的相同,我的修复(如下)可能对其他人有帮助。版主(@pfaffman?),请随意更恰当地分类此内容。]

在我运行 ./launcher rebuild app 命令后,在我的自托管 Docker 实例(已安装并运行多年)上出现了 ArgumentError 消息。这是因为 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 个赞