将JHipster/MongoDB应用部署到Heroku

5
JHipster提供了子生成器,用于将应用部署到云提供商(如Heroku和Openshift),但由于Mongeez需要管理员权限,在PaaS环境中当然不可能实现。
然而,只要禁用Mongeez,就应该可以在云提供商上运行JHipster + MongoDB。我使用Heroku做了以下操作:
  • 首先,我手动导出了JHipster在我的本地开发机上创建的MongoDB数据库,并将其导入到Mongolab实例中。
  • 如果使用的配置文件是prod,则不会实例化Mongeez。
  • 在对JHipster的Heroku子生成器进行一些修改后,可以将应用程序部署到Heroku。生成器现在忽略_HerokuDatabaseConfiguration.java(用于JDBC),并且在使用的Procfile中,我将配置文件更改为prod(而不是prod,heroku),并删除了参数--spring.datasource.heroku-url=$DATABASE_URL

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

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


请澄清一下,您是否尝试将 --spring.data.mongodb.uri=$MONGOLAB_URI 放入您的 Procfile 中?只要您没有在 yml 文件中覆盖它,我认为这应该可以工作。 - codefinger
我基本上做了和你一样的事情,而且也运作良好。我希望能够在JHipster中“自动运行”,所以如果你找到了一种方法(主要是替换Mongeez),请不要犹豫,为项目做出贡献! - Julien Dubois
@codefinger 是的,我已经将它放在了 procfile 中。而且你是正确的,yml 文件似乎具有更高的优先级。但是当我从 yml 文件中删除 "data/mongo" 部分时,我会得到 Factory method 'mongoDbFactory' threw exception; nested exception is java.lang.IllegalArgumentException: Database name must not be empty 的错误提示。 - alapeno
@JulienDubois 我一定会关注的。我认为MongoDB + 云服务提供商是一个很好的组合。 - alapeno
@JulienDubois,我已经将我的项目和生成器迁移到mongobee。请随时在github上的PR中查看它。 - Matyas
1个回答

0

你可以使用mongobee来为你的应用程序提供迁移逻辑,而不是使用Mongeez。

我已经尝试了它,并且在Heroku上运行良好

这是我的默认 mongobee 迁移代码,对于 JHipster 具有与 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

我也打开了一个拉取请求,更新JHipster生成器。现在我们等待看看那些人是否同意 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接