はじめに
Herokuを使い始めて、色々とデプロイを試しているかなの忘却録です。
spring-boot(gradle) × postgresのでもアプリを作成し、Herokuへのデプロイ方法を記述しています。
基本的には色々な方が挙げているものと似通っていますが
postgresの設定ファイルをgitignoreするとherokuへpushされず少し困ったのでその解決策なども書いています。
※デモアプリのベースやHerokuの初期設定は、前の記事で上げたものを流用しています。
環境
- windows 10 Home
- java 11
- spring-boot 2.3.5
- gradle 7.1.1 (gradlew)
- heroku/7.56.1 win32-x64 node-v12.21.0
- spring jpa 2.5.3
ソース
https://github.com/Takeuchi713/spring-boot-gradle-heroku
目次
#1. herokuの設定
Herokuのマイページでpostgresの設定をしていきます。
postgresを追加
マイページへログインし、アプリのダッシュボードへ移動する。
ResoucesからHeroku Postgresをアプリへ追加していく。
Add-onsにpostgresと入力すると選択肢が表示されるのでクリック。
追加するプランを聞かれるので、今回は無料のHobby Dev-Freeを選択。
Submit Order Formをクリックすると、Add-onsに追加され使用可能に。
Add-onsのHeroku Postgresをクリックすると自分専用のページが開く。
Setting => View Credenticalsをクリックすると、URLやpasswordなどpostgresへ接続するための情報が確認出来る。
#2. デモアプリ作成
前回のアプリに単純なpostgresとの連携処理を追記していきます。
build-gradle
postgresとspring-jpaの依存性を追加。
dependencies {
//追加
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.postgresql:postgresql'
}
Entity
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name="MyUser")
public class MyUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Column(name = "name", nullable = false, length = 100)
private String name;
@Column(name = "email", unique = true, nullable = false, length = 200)
private String email;
@Column(name = "age", nullable = true, length = 3)
private Integer age;
@Column(name="gender", nullable =true , length = 1)
private Integer gender;
}
Controller
@RestController
@RequestMapping("/api")
public class UserController {
private final MyUserRepository repository;
UserController(MyUserRepository repository) {
this.repository = repository;
}
@GetMapping("/users")
public ResponseEntity<List<MyUser>> getUsers() {
//本来はService等に切り出すべき
String email = "test@test.com";
MyUser user = repository.findByEmail(email).orElse(new MyUser(null, "takeuchi", "test@test.com", 18, 1));
repository.save(user);
List<MyUser> users = repository.findAll();
return new ResponseEntity<List<MyUser>>(users, new HttpHeaders(), HttpStatus.OK);
}
}
Heroku Postgresに接続するための設定
Heroku PostgresのSettingに記載されている内容を設定。
※{Host},{Port}などはHerokuのSettingに書かれているものに置き換えて考えてください。
spring:
datasource:
url: jdbc:postgresql://{Host}:{Port}/{Database}?sslmode=require
username: {User}
password: {Password}
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
show-sql: true #sqlをconsoleへ表示するか否か
hibernate:
ddl-auto: create #起動時にEntityからテーブルを自動生成し、終了時に削除する。ちなみに、updateとすると作成のみに変更可
動作確認
curl http://localhost:8080/api/users
[{"id":"1","name":"takeuchi","email":"test@test.com","age":18,"gender":1}]
#3. deploy
特に特殊なことなく、commitしpushすると自動でdeployされる
git add .
git commit -m "add postgres"
git push heroku main
#4. gitignore対策
以上で問題なくデプロイできましたが、、、
githubにソース登録しようとして、ymlをgitignoreすると
Herokuへpush時もymlが無視されてしまい、デプロイに失敗し動かず...
隠したい部分をHerokuで環境変数として設定する方法で解決しました。
Herokuで環境変数を設定
アプリのページからSetting => Reveal Config Varsを選択し環境変数を表示する
環境変数を追加
POSTGRES_PASS, POSTGRES_USER, POSTGRES_URLを追加
※DATABASE_URLはデフォであるので特に変更しないで大丈夫です。
spring-bootの設定を変更
${}で囲った部分が環境変数で置き換えられます。
spring:
datasource:
url: ${POSTGRES_URL}
username: ${POSTGRES_USER}
password: ${POSTGRES_PASS}
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
show-sql: true #sqlをconsoleへ表示するか否か
hibernate:
ddl-auto: create #起動時にEntityからテーブルを自動生成し、終了時に削除する。ちなみに、updateとすると作成のみに変更可
動作確認
gitignoreからymlを外して、上と同じようにdeployする。
git add .
git commit -m "add postgres"
git push heroku main
問題なく、動いていることを確認
curl "https://spring-gradle-deploy.herokuapp.com/api/users"
[{"id":"1","name":"takeuchi","email":"test@test.com","age":18,"gender":1}]