【问题标题】:Deploying a JHipster/MongoDB application to Heroku将 JHipster/MongoDB 应用程序部署到 Heroku
【发布时间】:2015-09-09 22:31:13
【问题描述】:

JHipster 提供子生成器用于将应用程序部署到云提供商(例如 Heroku 和 Openshift),但不适用于使用 MongoDB 的应用程序,因为 Mongeez requires admin privileges 这在 PaaS 环境中当然是不可能的。

但是,只要停用 Mongeez,就应该可以在云提供商上运行 JHipster + MongoDB。我做了以下(使用 Heroku):

  • 首先,我在本地开发机器上手动导出了由 JHipster 创建的 MongoDB 数据库,并在 Mongolab 实例上导入。
  • 如果使用的配置文件是prod,Mongeez 不会被实例化。
  • 在对 JHipster 的Heroku subgenerator 进行一些修改后,可以将应用程序部署到 Heroku。生成器现在忽略 _HerokuDatabaseConfiguration.java(用于 JDBC),在使用的 Procfile 中,我将配置文件更改为 prod(而不是 prod,heroku)并删除了参数 --spring.datasource.heroku-url=$DATABASE_URL

它工作得很好,但是我在注入 MongoDB 连接字符串时遇到了问题。目前,凭据被“硬编码”到application-prod.yml,因此如果凭据发生更改,则有必要重新部署整个应用程序。在另一次尝试中,我在 Procfile 中添加了spring.data.mongodb.uri=$MONGOLAB_URI,但没有任何效果(除非我错过了什么)。

那么我该如何解决这个问题呢?正如我所说,该应用程序在 Heroku 上运行没有任何问题,但最好从例如获取连接详细信息。 MONGOLAB_URI 环境变量。在其他新闻中,我感觉我不了解cloud 配置文件(我目前不使用)。

【问题讨论】:

  • 澄清一下,您确实尝试将--spring.data.mongodb.uri=$MONGOLAB_URI 放在您的Procfile 中?只要您不在 yml 文件中覆盖它,我希望它可以工作。
  • 我做了和你基本一样的事情,而且它也很有效。我想让它与 JHipster 一起“自动工作”,所以如果你找到了一种方法(主要是替换 Mongeez),请不要犹豫回馈项目!
  • @codefinger 是的,我把它放在 procfile 中。你是对的,yml 文件似乎有更高的优先级。但是当我从 yml 文件中删除“data/mongo”部分时,我得到Factory method 'mongoDbFactory' threw exception; nested exception is java.lang.IllegalArgumentException: Database name must not be empty
  • @JulienDubois 我一定会关注它。我认为 MongoDB + Cloud Providers 是一个很好的组合。
  • @JulienDubois 我已将我的项目和生成器迁移到 mongobee。欢迎在 github 上的PR 中查看它

标签: java spring mongodb heroku jhipster


【解决方案1】:

您可以使用 mongobee 代替 Mongeez 来为您的应用提供迁移逻辑。

我已经尝试过了,它可以在 heroku 上运行

这是我默认的 jhipster mongobee 迁移代码,效果与 mongeez 相同。

package your.package.name.config.dbmigrations;

import com.github.mongobee.changeset.ChangeLog;
import com.github.mongobee.changeset.ChangeSet;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Creates the initial database setup
 */
@ChangeLog(order = "001")
public class InitialSetupMigration {


    private Map<String, String>[] authoritiesUser = new Map[]{new HashMap<>()};

    private Map<String, String>[] authoritiesAdminAndUser = new Map[]{new HashMap<>(), new HashMap<>()};

    {
        authoritiesUser[0].put("_id", "ROLE_USER");

        authoritiesAdminAndUser[0].put("_id", "ROLE_USER");
        authoritiesAdminAndUser[1].put("_id", "ROLE_ADMIN");
    }

    @ChangeSet(order = "01", author = "initiator", id = "01-addAuthorities")
    public void addAuthorities(DB db) {
        DBCollection authorityCollection = db.getCollection("jhi_authority");
        authorityCollection.insert(
            BasicDBObjectBuilder.start()
                .add("_id", "ROLE_ADMIN")
                .get());
        authorityCollection.insert(
            BasicDBObjectBuilder.start()
                .add("_id", "ROLE_USER")
                .get());
    }


    @ChangeSet(order = "02", author = "initiator", id = "02-addUsers")
    public void addUsers(DB db) {
        DBCollection usersCollection = db.getCollection("jhi_user");
        usersCollection.createIndex("login");
        usersCollection.createIndex("email");
        usersCollection.insert(BasicDBObjectBuilder.start()
            .add("_id", "user-0")
            .add("login", "system")
            .add("password", "$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG")
            .add("first_name", "")
            .add("last_name", "System")
            .add("email", "system@localhost")
            .add("activated", "true")
            .add("lang_key", "en")
            .add("created_by", "system")
            .add("created_date", new Date())
            .add("authorities", authoritiesAdminAndUser)
            .get()
        );
        usersCollection.insert(BasicDBObjectBuilder.start()
            .add("_id", "user-1")
            .add("login", "anonymousUser")
            .add("password", "$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO")
            .add("first_name", "Anonymous")
            .add("last_name", "User")
            .add("email", "anonymous@localhost")
            .add("activated", "true")
            .add("lang_key", "en")
            .add("created_by", "system")
            .add("created_date", new Date())
            .add("authorities", new Map[]{})
            .get()
        );
        usersCollection.insert(BasicDBObjectBuilder.start()
            .add("_id", "user-2")
            .add("login", "admin")
            .add("password", "$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC")
            .add("first_name", "admin")
            .add("last_name", "Administrator")
            .add("email", "admin@localhost")
            .add("activated", "true")
            .add("lang_key", "en")
            .add("created_by", "system")
            .add("created_date", new Date())
            .add("authorities", authoritiesAdminAndUser)
            .get()
        );
        usersCollection.insert(BasicDBObjectBuilder.start()
            .add("_id", "user-3")
            .add("login", "user")
            .add("password", "$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K")
            .add("first_name", "")
            .add("last_name", "User")
            .add("email", "user@localhost")
            .add("activated", "true")
            .add("lang_key", "en")
            .add("created_by", "system")
            .add("created_date", new Date())
            .add("authorities", authoritiesUser)
            .get()
        );
    }

    @ChangeSet(author = "initiator", id = "03-addSocialUserConnection", order = "03")
    public void addSocialUserConnection(DB db) {
        DBCollection socialUserConnectionCollection = db.getCollection("jhi_social_user_connection");
        socialUserConnectionCollection.createIndex(BasicDBObjectBuilder
                .start("user_id", 1)
                .add("provider_id", 1)
                .add("provider_user_id", 1)
                .get(),
            "user-prov-provusr-idx", true);
    }
}

DatabaseConfiguration.java 文件中删除 mongeez 并添加

@Bean
public Mongobee mongobee() {

    log.debug("Configuring Mongobee");

    Mongobee mongobee = new Mongobee(mongo);
    mongobee.setDbName(mongoProperties.getDatabase());
    mongobee.setChangeLogsScanPackage(
        "de.shaere.sharecore.config.dbmigrations"); // package to scan for changesets
    mongobee.setEnabled(true);
    return mongobee;
}

最后更新你的 gradle 文件删除 mongeez 依赖并添加:

compile group: 'com.github.mongobee', name: 'mongobee', version: mongobee_version

我还打开了pull request 来更新 JHipster 生成器。现在我们等着看他们是否同意:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2017-01-26
    • 2018-07-26
    • 2012-07-16
    • 2019-09-04
    • 2012-11-22
    相关资源
    最近更新 更多