2015-06-23 3 views
4

JHipster предлагает подгенераторы для развертывания приложений для облачных провайдеров (таких как Heroku и Openshift), но не для приложений, использующих MongoDB из-за того, что Mongeez requires admin privileges, что, конечно, невозможно в пределах PaaS.Развертывание приложения JHipster/MongoDB на Heroku

Однако должно быть возможно запустить JHipster + MongoDB в облачных провайдерах, если Mongeez отключен. Я сделал следующее (с использованием Heroku):

  • Во-первых, я вручную экспортировал базу данных MongoDB, которая была создана JHipster на моей локальной машине развития и импортировать его на экземпляре Mongolab.
  • В случае использования профиля prod, Mongeez не получает экземпляр.
  • После некоторых изменений в Heroku subgenerator JHipster было возможно развернуть приложение в 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 (которого я сейчас не использую).

+0

Чтобы уточнить, вы попытались положить '--spring.data.mongodb.uri = $ MONGOLAB_URI' в свой' Procfile'? Я бы ожидал, что это сработает до тех пор, пока вы не отмените его в файле yml. – codefinger

+0

Я сделал в основном то же самое, что и вы, и он тоже работает. Я бы хотел, чтобы он «автоматически работал» с JHipster, поэтому, если вы найдете способ (в основном, для замены Mongeez), не стесняйтесь вносить свой вклад в проект! –

+0

@codefinger Да, я положил его в procfile. И вы правы, файл yml, кажется, имеет более высокий приоритет.Но когда я удаляю «data/mongo» -part из yml-файла, я получаю 'Factory method 'mongoDbFactory', делающий исключение; inested exception is java.lang.IllegalArgumentException: имя базы данных не должно быть пустым. – alapeno

ответ

0

Вместо Mongeez вы можете использовать mongobee, чтобы обеспечить логику миграции для вашего приложения.

Я пробовал и работает на 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", "[email protected]") 
      .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", "[email protected]") 
      .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", "[email protected]") 
      .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", "[email protected]") 
      .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); 
    } 
} 

В REMOVE mongeez DatabaseConfiguration.java файл и добавить

@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. Теперь мы подождем, чтобы увидеть, согласны ли парни :)