【问题标题】:MongoError: not authorized on local to execute command while deploy on meteor galaxyMongoError:在流星星系上部署时,本地未授权执行命令
【发布时间】:2025-12-17 14:55:01
【问题描述】:

我正在尝试使用以下命令使用流星星系部署我的应用程序

DEPLOY_HOSTNAME=us-east-1.galaxy-deploy.meteor.com meteor deploy icrm.meteorapp.com --settings scalingo.json

但我收到此错误

MongoError: not authorized on local to execute command { find: "oplog.rs", filter: {}, sort: { $natural: -1 }, projection: { ts: 1 }, limit: 1 } 在日志中

在我的 scalingo.json 中,我设置如下

"galaxy.meteor.com": {
        "env": {
            "MONGO_URL": "mongodb://username:password@ds137100.mlab.com:37100/icrm",
            "MONGO_OPLOG_URL": "mongodb://username:password@ds137100.mlab.com:37100/local?authSource=icrm",
            "ROOT_URL": "http://icrm.meteorapp.com/"
        }
    }

当我访问 http://icrm.meteorapp.com/ 时,我得到了

503 Service Unavailable: No healthy endpoints to handle the request.

我知道我在设置 MONGO_OPLOG_URL 时犯了一些错误,我在 MONGO_URL 和 MONGO_OPLOG_URL 中写了相同的用户名和密码,我使用的是免费沙盒版本,请帮我解决这个问题,如果可能的话建议我免费解决沙盒版...

非常感谢

【问题讨论】:

  • 由于您使用的是 Scalingo MongoDB,您可能可以直接跳到我的回答中的第 4 步(假设 Scalingo 为您执行了第 1-3 步)。

标签: mongodb meteor meteor-galaxy mlab


【解决方案1】:

听起来您的 mongodb 配置确实有问题。不幸的是,各种 mongodb 服务提供商之间存在很多差异,但让我与您分享我的设置(也许这会在某种程度上对您有所帮助)。我确实想指出,我正在从云 linux 服务器管理我自己的 mongodb 实例(而不是使用 mongodb 服务)。

  1. 启用安全授权(例如,它在mongod.conf 中启用)并确保您已创建一个管理员用户(您将用于创建所有其他用户)和一个您的流星应用程序将用于访问 mongodb 的用户。

    首先,您必须创建一个具有正确角色的“管理员”用户才能添加新用户。您可以从 mongo shell 执行此操作。

    admin = db.getSiblingDB("admin");
    admin.createUser(
      {
        user: "admin",
        pwd: "admin-password",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    );
    

    然后从 shell,以上述用户身份登录并创建您的流星应用程序使用的帐户。请注意,在此示例中,我调用了我的流星应用程序数据库meteor_db。将其更改为您想要的任何内容。

    db.getSiblingDB("admin").auth("admin", "admin-password" );
    
    use meteor_db;
    
    db.createUser(
      {
        user: "meteor",
        pwd: "meteor",
        roles: [ { role: "readWrite", db: "meteor_db" } ]
      }
    );
    
  2. 完成后,您需要配置 mongodb 以启用 oplog(meteor 将用于拖尾)。为此,您必须通过编辑 mongod.conf 并修改 replication 部分来设置复制和 1 个复制集。

    replication:
        replSetName: rs0
    

    重新启动 mongodb,然后从 mongo shell 启动对新成员的复制(您必须以 root 身份执行此操作)。如果您没有在默认本地主机和端口号上运行 mongodb,请使用您的特定主机名和端口修改以下示例。

    rs.initiate({_id:"rs0", members: [{"_id":0, "host":"127.0.0.1:27017"}]});
    
  3. 现在启用了 oplog,您必须创建一个可以访问 oplog 的用户。这是您将用来配置MONGO_OPLOG_URL(由meteor 使用)的用户。在 mongo shell 中,以 admin 用户(如上创建)身份登录并创建新的 oplogger 用户。

    db.getSiblingDB("admin").auth("admin", "admin-password" );
    
    admin = db.getSiblingDB("admin");
    
    admin.createUser(
      {
        user: "oplogger",
        pwd: "oplogger-password",
        roles: [ { role: "read", db: "local" } ]
      }
    );
    
  4. 所有设置完成后,您只需要设置您的流星环境变量并重新启动您的应用程序。

    export MONGO_URL='mongodb://meteor:meteor@<hostname>:<port>/meteor_db'
    export MONGO_OPLOG_URL='mongodb://oplogger:oplogger-password@<hostname>:<port>/local?authSource=admin'
    

如果您遇到任何问题或有其他问题,请告诉我。此外,当我尝试进行所有这些设置时,我发现这里有一些额外的资源很有帮助(也许它们也会有所帮助)。

【讨论】:

  • 没有帮助,我在使用 mLab 方面需要解决方案
  • 很抱歉这对你没有帮助,但是我看到没有人试图为你提供任何帮助,所以我想我至少会分享一下,看看你是否能发光任何帮助......否则你将没有任何回复。您是否尝试为您的MONGO_OPLOG_URL env var 使用不同的用户?显然,这与您尝试做的事情和常见的事情有很大不同?试着想想我的答案的主要概念,而不是具体的细节,看看它是否对你的问题有帮助。例如,MONGO_OPLOG_URLMONGO_URL 需要不同的用户。