https://github.com/haeunsong/welcome-game-back
κΈ°μ΄μ μΈ λ°°ν¬ κ°μλ€μ λ£κ³ λλ mysql μ μ¬μ©ν νλ‘μ νΈλ λ°°ν¬ν μ μμ κ² κ°λ€λ μκ°μ΄ λ€μλ€.
GitHub Actions λ₯Ό μ΄μ©νμ¬ CI/CD λ₯Ό ꡬμ±νκ³ , λ°°ν¬ μλνλ₯Ό μ€μ νλ€. μμ!
λ¨κ³λ³λ‘ μ νκ³ ν΄λ³΄λ©° λ§μ£Όν λ¬Έμ λ€μ μ μ΄λ³΄μ.
.github/workflows/deploy.yml νμΌλ μΆκ°νμ¬ Github Actions μ¬μ©)deploy.yml μ λ¨κ³λλ‘ μλ μ€ν.jar νμΌμ EC2 λ‘ μ μ‘nohup μΌλ‘ λ°±κ·ΈλΌμ΄λ μ€ν) μλλ welcome-game μ΄λΌλ ν° ν μμ welcome-game-front μ welcome-game-server μ΄λ°μμΌλ‘ κΉμ κ΄λ¦¬νλ €κ³ νλ€. νμ§λ§, Github Actions μ μ°λ€λ³΄λ νλ‘ νΈ λ°λ‘, λ°± λ°λ‘ λ ν¬μ§ν 리λ₯Ό κ΄λ¦¬νλκ² νΈν κ² κ°λ€λ μκ°μ΄ λ€μλ€.
μ²μμλ κΈ°μ‘΄μ ꡬ쑰λ₯Ό μ μ§ν μ±, welcome-game νλ‘μ νΈμ μ΅μλ¨μ .github/workflows/deploy.yml νμΌμ λ§λ€κ³ working directory λ₯Ό μΆκ°νμ¬ github actions κ²½λ‘λ₯Ό μ€μ ν΄λ³΄λ €νμ§λ§, μκ°λ³΄λ€ 볡μ‘ν΄μ§λ κ² κ°μμ κ²°κ΅ λ ν¬μ§ν 리λ₯Ό λΆλ¦¬νλ€.
κΈ°λ³Έμ μΌλ‘ .gitignore νμΌμ application.yml μ λ±λ‘ν΄λμλ€. κ·Έλ¦¬κ³ κΈ°μ‘΄μλ μΈν
리μ μ΄μμ νκ²½λ³μλ‘ λ°λ‘ μ€μ ν΄λ λΆλΆμ΄ μμλλ°,
1. μ΄μ°¨νΌ λ΄ μ»΄ν¨ν°μμλ§ μ΄ νλ‘μ νΈλ₯Ό μ§ννκ² λ κ² κ°μμ
2. github μλ ν΄λΉ νμΌμ μ¬λ¦¬μ§ μμ κ²μ΄κΈ° λλ¬Έμ
νκ²½λ³μλ₯Ό μ§μ°κ³ mysql κ³Ό κ΄λ ¨λ λΆλΆμ λͺ¨λ νλμ½λ© ν΄λμλ€.
(But, μ΄κ±΄ μΆνμ λ³κ²½νλκ² μ’μ λ―)
κ·Έλ¦¬κ³ deploy.yml νμΌμμ μ¬μ©λλ ${{ secrets.MYSQL_PASSWORD }} μ κ°μ λΆλΆλ€μ Github - Settings - Secrets and variables - Actions - New repository secret μ μ μ₯ν΄λμλ€.
μ€μ ν λ³μλ€μ μλμ κ°λ€.
EC2_HOST: EC2 νΌλΈλ¦ IPEC2_USERNAME: EC2 μ¬μ©μ μ΄λ¦(μ: ubuntu).EC2_PRIVATE_KEY: .pem νμΌ λ΄μ©.MYSQL_USERNAME, MYSQL_PASSWORD: MySQL μ μ μ 보.APPLICATION_PROPERTIES: application.yml λ΄μ©.
μ§κΈκΉμ§ ν λ°°ν¬μμλ MySQL μ μΆκ°νμ§ μμκΈ° λλ¬Έμ μλ μ¬μ§μ 보μκ·Έλ£ΉμΌλ‘ μΆ©λΆνλ€.

νμ§λ§ MySQL μ localhost:3306 μ μ¬μ©νκΈ° λλ¬Έμ μΆκ°μ μΌλ‘ 3306 ν¬νΈλ μ΄μ΄μ£Όμ΄μΌνλ€.

μ΄λ κ² μ΄ 5κ°μ μΈλ°μ΄λ 보μκ·Έλ£Ήμ μ¬μ©νλ€.
(μμλ°μ΄λ 보μκ·Έλ£Ήμ λν΄νΈλ‘ μ 체 ν¬νΈ/νλ‘ν μ½/λμ μ΄μ΄μ£Όλ 1κ° μ‘΄μ¬)
λ‘컬μμ $ ssh -i pem/welcome-game-server.pem ubuntu@13.124.172.186 λͺ
λ Ήμ΄λ‘ ec2 μ μ κ·Όνλ €νλλ° μλμ κ°μ μ€λ₯κ° λ°μνλ€.
WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'pem/welcome-game-server.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "pem/welcome-game-server.pem": bad permissions
μ΄κ±΄ pem νμΌμ κΆν μ€μ μ΄ νμ¬ 0644λ‘ λ무 λμ¨ν΄μ μκΈ°λ λ¬Έμ μλ€.
μλ λͺ
λ Ήμ΄λ‘ pem νμΌμ κΆνμ 0600μΌλ‘ μ€μ νμλ€.
$ chmod 600 pem/welcome-game-server.pem
νμ¬ λ°°ν¬ λ°©μμ λΉλ ν μμ±λλ jar νμΌμ SCP λ‘ EC2 λ‘ μ μ‘νλ λ°©μμ μ¬μ©νκ³ μλ€. κ·Έλ κΈ°μ λ무λ λΉμ°ν μ΄μΌκΈ°μ§λ§, λΉλνκΈ° μ μ mysql μ€μ μ ν΄μ£Όμ΄μΌνλ€. Github Actions μ mirromutth/mysql-action@v1.1 λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€.
- name: MySQL μ€μ νκΈ°
uses: mirromutth/mysql-action@v1.1
with:
host port: 3306
container port: 3306
mysql database: 'welcome_game_db'
mysql root password: ${{ secrets.MYSQL_PASSWORD }}
λλ νμ¬ μ¬μ©μ μ΄λ¦μ΄ root μ΄κΈ° λλ¬Έμ μ΄λ κ² μ μ΄μ£Όμλ€.
EC2_HOST, EC2_USERNAME, EC2_PRIVATE_KEY λ‘ EC2 μ μ μνλ©΄ κΈ°λ³Έμ μΌλ‘ java, mysql μ μ€μ ν΄μ£Όμ΄μΌνλ€. μ²μμλ μ΄κ±Έ νμ§ μμμ μ€λ₯κ° λ¬λ€. deploy.yml νμΌμ script λΆλΆμ μΆκ°ν μ½λμ΄λ€.
script: |
sudo apt update
sudo apt install -y openjdk-17-jdk
sudo apt install -y mysql-server
java -version
sudo systemctl start mysql || true
auth_socket -> mysql_native_password νλ¬κ·ΈμΈμΌλ‘ μμ μλ²λ₯Ό μ€ννλ€κ° λ§λ μ€λ₯ μ€μ λ€μκ³Ό κ°μ μ€λ₯λ₯Ό λ§λ¬λ€.
[welcome-game-back] [main] o.h.engine.jdbc.spi.SqlExceptionHelper : Access denied for user 'root'@'localhost'
μ¬μ€ μ΄ μ€λ₯λ μλΉν μμ£Ό λ§λλ μ€λ₯μΈλ°, λλ§λ€ μ΄μ λ λ¬λμ§λ§ μ΄λ²μλ λͺ μΎν ν΄λ΅μ΄ μμλ€.
MySQL μ΄ auth_socket νλ¬κ·ΈμΈμ μ¬μ©νλλ‘ μ€μ λμ΄μμΌλ©΄, λΉλ°λ²νΈ μΈμ¦μ΄ μλ Unix μμΌ κΈ°λ° μΈμ¦λ§ νμ©λλ€.
μ€νλ§λΆνΈ μ ν리μΌμ΄μ
μ μΌλ°μ μΌλ‘ λΉλ°λ²νΈ κΈ°λ° μΈμ¦μ ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°νλ€. νμ§λ§, auth_socket μ€μ μ λΉλ°λ²νΈκ° μλ Unix μμΌ μΈμ¦μ μ¬μ©νκΈ° λλ¬Έμ λ¬Έμ κ° λ°μνλ€.
μ€νλ§λΆνΈλ μ격 ν΄λΌμ΄μΈνΈλ auth_socket λ°©μμ μ§μνμ§ μλλ€!
auth_socket νλ¬κ·ΈμΈμ mysql_native_password νλ¬κ·ΈμΈμΌλ‘ μμ ν΄μ£Όλ©΄ λλ€.
# mysql μ μ
$ sudo mysql -u root
# νμ¬ root μ¬μ©μ μ€μ νμΈ
> SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
# μΆλ ₯ μμ
+------+-----------+-------------+
| user | host | plugin |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+
# λ§μ½ auth_socket λ‘ λμ΄μλ€λ©΄ mysql_native_password λ‘ λ°κΎΈμ΄μΌνλ€.
> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
> FLUSH PRIVILEGES;
# λ³κ²½ ν μ¬μ©μ νμΈ
> SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
# μΆλ ₯ μμ
+------+-----------+-----------------------+
| user | host | plugin |
+------+-----------+-----------------------+
| root | localhost | mysql_native_password |
+------+-----------+-----------------------+
λΉμ°ν λ§μ΄μ§λ§ νμ¬ EC2 μ mysql μλ λ΄κ° μμ±ν DB κ° μλ€. μ§μ μμ±ν΄μ€λ λμ§λ§, application.yml νμΌμ μμ νμ¬ μλμΌλ‘ μμ±λλλ‘ μ€μ νλ λ°©μμ΄ λ νΈν΄λ³΄μ¬μ ννλ€.
spring:
datasource:
url: jdbc:mysql://localhost:3306/welcome_game_db?createDatabaseIfNotExist=true
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
createDatabaseIfNotExist=true μ΄ μ΅μ
μ λΆμ΄λ©΄ DB κ° μμκ²½μ° μλμΌλ‘ μμ±λλ€.
deploy.yml μ½λμ μ΅μ’ μ μΌλ‘ nohup μ ν΅ν΄ μλ²λ₯Ό μ€νμν¬ λ μλμ κ°μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ€.
nohup java -jar project.jar > ./output.log 2>&1 &
μ΄λ project.jar νμΌμ μ€νμν€κ³ , κ·Έ νμ€μΆλ ₯ λ° μ€λ₯λ₯Ό output.log νμΌμ μ
λ ₯νλ λͺ
λ Ήμ΄λ€.
output.log νμΌμ νμΈνλ©° μ€λ₯λ₯Ό μ°Ύμλ΄μ΄κ°λ€.
μΈμ€ν΄μ€λ₯Ό μμ±νκ³ νλ ₯μ IP λ₯Ό λ°μλλ° IPμ£Όμ:ν¬νΈλ²νΈ μ΄λ κ² ν΄μ μ μνλ©΄ λλ€.
λλ swagger λ₯Ό μ¬μ©νκΈ° λλ¬Έμ, swagger νμ΄μ§λ₯Ό λμ λ€.

μ μμ λͺ©μ μ Github Actionsμ λΉλ νκ²½μμ μλ°λ₯Ό μ¬μ©νκΈ° μν΄ μ€μΉνλ κ²μ΄λ€. μ΄ λλ EC2 μλ²κ° μλλΌ GitHub μ κ°μλ¨Έμ μ μ€μΉλλ€. Gradle λΉλλ₯Ό μ€ννκΈ° μν΄ νμμ μ΄λ€.
νμμ λͺ©μ μ Spring Boot μ ν리μΌμ΄μ μ μ€ννκΈ° μν΄ JDK λ₯Ό μ€μΉνλ€. λΉλλ .jar νμΌμ΄ java λ‘ μ€νλκΈ° λλ¬Έμ λΉμ°ν μμ΄μΌνλ€. EC2 μλ²μ JDK κ° μ€μΉλλ€.
GitHub Actionsλ λΉλ λ¨Έμ , EC2 μλ²λ μ ν리μΌμ΄μ μ΄ μ€μ λ‘ λ°°ν¬λκ³ μ€νλλ νκ²½μ΄λΌκ³ μκ°νλ©΄ λλ€.
κ°μ₯ ν΅μ¬μν μ νλ application.yml νμΌκ³Ό deploy.yml μ μλμ κ°λ€.(λ―Όκ°ν μ 보 μ μΈ)
spring:
application:
name: welcome-game-back
datasource:
url: jdbc:mysql://localhost:3306/welcome_game_db?createDatabaseIfNotExist=true
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jackson:
date-format: yyyy-MM-dd
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
dialect: org.hibernate.dialect.MySQLDialect
open-in-view: false
name: EC2 λ‘ λ°°ν¬νκΈ°
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository μ μ¬λ¦° νμΌλ€μ λΆλ¬μ€κΈ°
uses: actions/checkout@v4
- name: μ λκ³ μλμ§ Test νκΈ°
run: |
ls
pwd
- name: JDK 17λ²μ μ€μΉ
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml νμΌ λ§λ€κΈ°
run: |
pwd
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.yml
- name: MySQL μ€μ νκΈ°
uses: mirromutth/mysql-action@v1.1
with:
host port: 3306
container port: 3306
mysql database: 'welcome_game_db'
mysql root password: ${{ secrets.MYSQL_PASSWORD }}
- name: ν
μ€νΈ λ° λΉλνκΈ°
run: |
./gradlew clean build
- name: λΉλλ νμΌ μ΄λ¦ λ³κ²½νκΈ°
run: |
mv ./build/libs/*SNAPSHOT.jar ./project.jar
- name: SCPλ‘ EC2μ λΉλλ νμΌ μ μ‘νκΈ°
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar
target: /home/ubuntu/welcome-game-server/tobe
- name: SSH(μ격 μ μ)λ‘ EC2μ μ μνκΈ°
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
sudo apt update
sudo apt install -y openjdk-17-jdk
sudo apt install -y mysql-server
java -version
sudo systemctl start mysql || true
rm -rf /home/ubuntu/welcome-game-server/current
mkdir /home/ubuntu/welcome-game-server/current
mv /home/ubuntu/welcome-game-server/tobe/project.jar /home/ubuntu/welcome-game-server/current/project.jar
cd /home/ubuntu/welcome-game-server/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/welcome-game-server/tobe