내가 만든 프로젝트를 지속적으로 사용자가 쓸수 있게 배포하고 싶어 가격이 싼 fly.io로 db를 배포해보기로 했다.
원래 spring-boot 프로젝트에서 mysql을 사용했기 때문에 mysql로 만들어보려했지만 자료 부족과 처음 배포해보는 것 때문에 많이 헤맸었다.
fly.io는 postgresql을 밀고 있어 postgresql 앱을 만드는것이 타 db보다 간편하고 설명이 더 잘되어있다.
또한 구글에 정보가 그나마 많아 postgresql로 DB를 변경하였다.
먼저 fly 명령어로 postgres 앱을 만들어보자
PostgreSQL app을 만들기위해,
flyctl postgres create
을 해주고 아래와 같이 앱 이름, 지역, cpu 개수 RAM 설정을 골라준다.
fly postgres create
? Choose an app name (leave blank to generate one): jmctest
automatically selected personal organization: parksejoon313@gmail.com
? Select region: Tokyo, Japan (nrt)
For pricing information visit: https://fly.io/docs/about/pricing/#postgresql-clu
? Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
- app 이름은 jmctest
- 지역은 한국과 그나마 가까운 Tokyo, Japan
- machine Type은 Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk (무료)
을 골라 주었다.
그럼 다음과 같이 나온다
Creating postgres cluster in organization personal
Creating app...
Setting secrets on app jmctest...
Provisioning 1 of 1 machines with image flyio/postgres:14.6
Waiting for machine to start...
Machine e784773c219283 is created
==> Monitoring health checks
Waiting for e784773c219283 to become healthy (started, 3/3)
Postgres cluster jmctest created
Username: postgres
Password: <비밀번호>
Hostname: jmctest.internal
Proxy port: 5432
Postgres port: 5433
Connection string: postgres://postgres:<비밀번호>@jmctest.internal:5432
Save your credentials in a secure place -- you won't be able to see them again!
Connect to postgres
Any app within the parksejoon313@gmail.com organization can connect to this Postgres using the above connection string
Now that you've set up Postgres, here's what you need to understand: https://fly.io/docs/postgres/getting-started/what-you-should-know/
여기서 username, password, hostname을 저장하고 있어야한다.
다시 볼 수 없다고 안내 문구까지 나오고 있다.
terminal에서 fly.io PostgreSQL에 접속해보자
flyctl postgres connect -a jmctest
위 명령어를 입력하면 아래와 같이 postgres bash로 접속할 수 있다.
flyctl postgres connect -a jmctest
Connecting to fdaa:1:1904:a7b:d86c:94df:60a7:2... complete
psql (14.6 (Debian 14.6-1.pgdg110+1))
Type "help" for help.
postgres=#
아래와 같이 \l 을 입력하면 현재 jmctest 앱의 db list를 확인 할 수 있다.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+------------+----------+------------+------------+---------------------------
postgres | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/flypgadmin +
| | | | | flypgadmin=CTc/flypgadmin
template1 | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/flypgadmin +
| | | | | flypgadmin=CTc/flypgadmin
(3 rows)
새로운 DATABASE를 하나더 추가해보자
postgres=# CREATE DATABASE jmcdb;
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+------------+----------+------------+------------+---------------------------
jmcdb | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/flypgadmin +
| | | | | flypgadmin=CTc/flypgadmin
template1 | flypgadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/flypgadmin +
| | | | | flypgadmin=CTc/flypgadmin
(4 rows)
DATABASE가 잘 추가 된 것을 볼 수 있다.
이제 \q 으로 나가주자
로컬에서 편하게 데이터를 관리하기 위해 아래 명령어로 ssh tunneling을 할 수 있다. (ssh tunneling은 추후에 자세히 또 공부해보자)
flyctl proxy 5433 -a jmctest
이제, localhost 포트 5433로 datagrip 같은 SQL IDE를 통해 사용할 수 있다.
필자는 5432를 쓰고 있기 때문에 5433번으로 지정해놓았다.
Proxying local port 5433 to remote [jmctest.internal]:5433
다음 같은 문구가 뜨면 성공이다.
DataGrip에서 postgresql DB를 하나 만들고 맨처음 앱을 만들 때 있던 설정 정보를 가지고
Postgres cluster jmctest created
Username: postgres
Password: <비밀번호>
Hostname: jmctest.internal
Proxy port: 5432
Postgres port: 5433
Connection string: postgres://postgres:<비밀번호>@jmctest.internal:5432
- Host : localhost
- User : postgres
- Password : <비밀번호>
- Port : 5433 (기본은 5432)
- Database : jmcdb (아까 bash에서 만든 DATABASE 이름)
을 채워주자
apply를 누르고 Test Connection을 하면 정상적으로 localhost에서도 연결되는 모습이다.
fly.io Dashboard에도 성공적으로 DB가 배포가 되었다.
이제 DB를 배포하였으니 springboot 앱을 jmctest db와 연결하여 배포하면 될것이다.
이것은 2부에서 마저 진행하겠다.
후기
fly.io는 docker를 이용해 손쉽게 앱을 배포할 수 있다.
docker를 이용해 배포해본 경험이 없던 나는 (물론 배포 경험 자체가 없었다)
dockerfile 하나에 mysql image와 나의 springboot 앱 이미지를 한번에 묶어 fly.io에 Dockerfile build로 하면 손쉽게 될줄 알았다.
근데 두개의 앱 이미지를 묶는 방법을 모르겠다...?
맨 처음엔 docker-compose.yml 파일을 작성하면 dockerilfe이 하나의 이미지가 된줄 알았다.
하지만 docker-compose는 이미지가 실행되면 만들어지는 도커 컨테이너를 다중으로 관리해주는 도구였고 이것으로 배포할 수는 없었다.
결국 이 방법은 포기하고 (포기하지말고 공부를 하자.. 하지만 배포를 너무나도 해보고 싶었다. 여기서 aws로 갈까 고민했다.)
postgresql로 넘어갔고 document와 구글링을 통해 해나가니 DB server를 배포하고 spring app도 따로 배포해서 연결만 시키는 것이었다.
접근 방법이 완전 달랐었다..
mysql도 dockerfile로 만들고 fly.io로 배포한 후 spring app과 연결하면 됐었던 것 아닐까 싶다
'spring' 카테고리의 다른 글
[spring security] 왜 500번 에러도 401(Unauthorized)에러가 될까? (0) | 2024.04.07 |
---|---|
이미지 저장/조회 서버 만들기(3) - AWS Presigned URL 이미지 업로드 (0) | 2024.02.26 |
이미지 저장/조회 서버 만들기(2) - 이미지 파일 어떻게 받아오지? (0) | 2024.02.12 |
이미지 저장/조회 서버 만들기(1) - 저장 어디에..? (0) | 2024.02.11 |
SpringBoot+JPA 프로젝트에 mySQL를 적용해보자 (0) | 2022.09.30 |