删除用户功能在 staging/production docker 设置上停止工作,但在本地(无 docker 设置)上工作

大家好,

我遇到了一个问题:删除用户的辅助窗口(实际删除用户的那个窗口)在暂存/生产环境(docker 设置)中不显示,但在本地(非 docker 设置)却能正常工作。


当我只点击删除时,什么都不会发生。在本地,它会显示“正在删除…”并删除用户。

这个问题是几周前才出现的。我去年 12 月还在用它删除用户。

1 个赞

你好 Stephan :wave:

可以分享一下你的 Discourse 版本吗?

浏览器开发者工具控制台有报错吗?

你的 Discourse 管理后台日志有报错吗?

1 个赞

到处都没有,好像代码没有被调用。我在本地检查并调试了它,一切都运行正常。这真的很奇怪。

已安装

2.5.0.beta7

( 2a17124a5b )

2.5 现在已经相当老旧了——大约两年半了,Discourse 刚刚发布了 3.0。

你有什么不升级的原因吗?

3 个赞

嗯,事实上有很多 :slight_smile:

我们有一个自定义插件来运行所有逻辑,让 Discourse 仅作为数据存储和处理基本授权与认证的工具。我们运行一个移动优先的 API,它还负责支付验证和社交登录(自定义流程)以及其他高级功能 :slight_smile:

我的问题并非出在整个 Discourse 设置或版本上,因为它已经运行了 3 年,并且在未来几年内仍将继续运行,因为它没有任何严格的依赖项,并且我们将其托管在专用服务器上。

我真的需要有人告诉我如何找出按下操作按钮后没有任何反应的原因……在我看来,这都是 JavaScript。

destroy(opts) {
    const user = this;
    const message = I18n.t("admin.user.delete_confirm");
    const location = document.location.pathname;

    const performDestroy = function(block) {
      bootbox.dialog(I18n.t("admin.user.deleting_user"));
      let formData = { context: location };
      if (block) {
        formData["block_email"] = true;
        formData["block_urls"] = true;
        formData["block_ip"] = true;
      }
      if (opts && opts.deletePosts) {
        formData["delete_posts"] = true;
      }
      return ajax(`/admin/users/${user.get("id")}.json`, {
        type: "DELETE",
        data: formData
      })
        .then(function(data) {
          if (data.deleted) {
            if (/^\\/admin\\/users\\/list\\//.test(location)) {
              document.location = location;
            } else {
              document.location = getURL("/admin/users/list/active");
            }
          } else {
            bootbox.alert(I18n.t("admin.user.delete_failed"));
            if (data.user) {
              user.setProperties(data.user);
            }
          }
        })
        .catch(function() {
          AdminUser.find(user.get("id")).then(u => user.setProperties(u));
          bootbox.alert(I18n.t("admin.user.delete_failed"));
        });
    };

    const buttons = [
      {
        label: I18n.t("composer.cancel"),
        class: "btn",
        link: true
      },
      {
        label:
          `${iconHTML("exclamation-triangle")} ` +
          I18n.t("admin.user.delete_and_block"),
        class: "btn btn-danger",
        callback: function() {
          performDestroy(true);
        }
      },
      {
        label: I18n.t("admin.user.delete_dont_block"),
        class: "btn btn-primary",
        callback: function() {
          performDestroy(false);
        }
      }
    ];

    bootbox.dialog(message, buttons, { classes: "delete-user-modal" });
  },

您是否查看了该特定版本之后的提交?

这可能只是该版本特有的一个 bug。如果它在该构建上曾经正常工作过,我会调查还有什么其他变化。

自锁定到该构建以来,您是否更新了任何内容?任何第三方插件?

1 个赞

不……它在大约一月中旬停止工作,而应用程序已在运行。这很奇怪。

1 个赞

并且 /logs 或您的浏览器控制台中没有错误?

1 个赞

这是我的插件列表 :slight_smile:

docker_manager 的人最近做了一些事情,https://github.com/discourse/docker_manager/commit/98205ea281ca73f0a255e6fbc919699b0623311f,导致我的设置几天都无法使用,直到我发现它……但大概就是这样。

1 个赞

您是否已在 app.yml 中固定 Discourse 版本?

1 个赞

如果你有一个自定义插件,为什么它没有出现在插件列表中?这个实例是如何安装的?

在配置文件中移动东西有点困难 :slight_smile:

我发送了已部署版本的版本,docker 使用该版本创建,并且所有内容都已固定。

我写的 :slight_smile:
它在容器构建和运行时拉取数据 :slight_smile: 所以它只在代码中可见。

1 个赞

基础镜像会不会有更新的风险?Discourse_docker 在一月份升级到了 ruby 3.1,我们已经看到一些旧环境在这次更新后行为变得不可预测

1 个赞

不,代码链接到我们仓库中的克隆分支,并且我们构建 Docker 镜像的方式,没有人可以构建另一个。不可能。

1 个赞

我大约在 5-6 个月前创建了最后一个 Docker 镜像……而且我仍然认为它指向的是 Discourse 版本发布时所用的 Docker 版本 :slight_smile: 因为我们提前保存了所有东西。 - 是的,2020 年 6 月 24 日 :slight_smile:

供参考:也删除了 docker_manager。没有任何变化

1 个赞

目前,我决定在我们的管理员仪表板中创建一个删除流程。我不太确定 UI 中会发生什么,但 DELETE 端点可以正常工作,并且对于普通用户(非管理员、非版主)不会失败。

如果有人能帮忙,那就太好了 :slight_smile: