LoginSignup
4
4

More than 5 years have passed since last update.

Dropwizardで作ったアプリをHerokuにデプロイする

Posted at

仕掛けを作る

HerokuのPostgeSQLを使うための仕掛け

HerokuのPostgreSQLを使うためにデータベース設定を少しだけ細工する。

ローカルでもHerokuでも動かせるためにHeroku用のDataSourceFactoryを作る。

public class HerokuDataSourceFactory {

    private static Logger logger = LoggerFactory.getLogger(HerokuDataSourceFactory.class);

    public static DataSourceFactory get(String databaseUrl){
        logger.info("Creating DB for " + Objects.requireNonNull(databaseUrl));
        try {
            URI dbUri = new URI(databaseUrl);
            final String user = dbUri.getUserInfo().split(":")[0];
            final String password = dbUri.getUserInfo().split(":")[1];
            final String url = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath()
                    + "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory";
            DatabaseConfiguration<Configuration> databaseConfiguration = new DatabaseConfiguration<Configuration>() {
                @Override
                public DataSourceFactory getDataSourceFactory(Configuration configuration) {
                    //TODO 接続設定以外は設定ファイルから読みたい
                    DataSourceFactory dsf = new DataSourceFactory();
                    dsf.setUser(user);
                    dsf.setPassword(password);
                    dsf.setUrl(url);
                    dsf.setDriverClass("org.postgresql.Driver");
                    dsf.setAutoCommitByDefault(false);
                    return dsf;
                }
            };
            return databaseConfiguration.getDataSourceFactory(null);
        } catch (URISyntaxException e) {
            logger.error(e.getMessage());
            return null;
        }
    }
}

続いてConfigurationクラスに仕掛けする。

    @Valid
    @NotNull
    @JsonProperty("database")
    private DataSourceFactory database = new DataSourceFactory();

    public DataSourceFactory getDataSourceFactory() {
        String databaseUrl = System.getenv("DATABASE_URL");
        if(databaseUrl == null){
            logger.info("Standard DataSourceFactory url=" + database.getUrl());
            return database;
        }
        DataSourceFactory dsf = HerokuDataSourceFactory.get(databaseUrl);
        logger.info("Heroku DataSourceFactory url=" + dsf.getUrl());
        return dsf;
    }

これでローカルで実行するときは設定ファイルから、Heroku上で実行するときにはSystem.getenv("DATABASE_URL")で取得することができる。

Herokuで実行するための仕掛け

Procfileを作成する。

web: java $JAVA_OPTS -jar target/dropwizard-app.jar db migrate dropwizard-app.yml && java $JAVA_OPTS -Ddw.server.connector.port=$PORT -jar target/dropwizard-app.jar server dropwizard-app.yml

設定ファイルをsimpleサーバーモードで起動するようにする。

server:
  type: simple
  applicationContextPath: /
  connector:
    type: http
    port: 8080

ローカルで動かしてみる

mvn package

foremanを使用して起動する。

foreman start

http://localhost:5000にアクセスして確認する。

Herokuにデプロイしてみる

一応最初から。
プロジェクトルートをgitレポジトリ化してコミットする。

git init
git add .
git commit -m "Initial commit"

Herokuアプリを作成。

heroku create <application name>

PostgreSQLアドオンを追加。

heroku addons:create heroku-postgresql:dev

Herokuにpushする。

git push heroku master

アプリを開く。

heroku open

問題なく稼働することが確認できました。

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4