μ¨ν νλ‘μ νΈμμ κΈ°λ₯μ΄ μ΄λ μ λ μμ±λμλ§μ κ°μ₯ λ¨Όμ λ μ€λ₯Έ 건 λ± νλμλ€.
βμ΄μ β¦ μ§μ§ μλΉμ€μ²λΌ μ£Όμ μ°κ³ μ μν΄λ³΄κ³ μΆλ€.β
μ΄λ² κΈμ Next.js + Supabase κΈ°λ° μ¨ν(on-fit) νλ‘μ νΈλ₯Ό AWS EC2μ μ²μ λ°°ν¬ν κ³Όμ μ μ 리ν κΈ°λ‘μ΄λ€.
νΉν ν리ν°μ΄ νλ μμμ μ΄λ»κ² μ€μ νλμ§, κ·Έλ¦¬κ³ GitHub Actionsλ‘ CI/CDκΉμ§ μ°κ²°νλ©΄μ μ΄λ€ μ½μ§μ νλμ§ λ¨κ³λ³λ‘ μ μ΄λ³Έλ€.
μ΄λ² λ°°ν¬μ λͺ©ν μν€ν μ²λ μμ£Ό μ¬ννλ€.
git pull + build + pm2 restartμ¦, κ·Έλ¦ΌμΌλ‘ 그리면:
GitHub(dev/main) βββΆ GitHub Actions ββSSHβββΆ EC2
β
ββ pm2: onfit (Next.js)
μ¬μ©μ λΈλΌμ°μ βββΆ onfit.today ββDNSβββΆ EC2 ββNginxβββΆ localhost:3000 (Next)
ν리ν°μ΄λ§ μΈ μ μμ΄μ κ°μ₯ κΈ°λ³Έμ μΈ μΈν μΌλ‘ μμνλ€.
onfit.pem (μΆν GitHub Actionsμμ μ¬μ©ν ν΅μ¬)보μ κ·Έλ£Ήμ μ²μμ μ΄λ κ² μ΄μ΄λλ€.
0.0.0.0/00.0.0.0/0 (μ²μμ μ§μ μ μ ν
μ€νΈ μν΄, λμ€μ Nginx λΆμΈ νμ μ μ¨λ λ¨)μΈμ€ν΄μ€κ° λ¨κ³ λλ©΄ νΌλΈλ¦ IPλ₯Ό νλ λ°κ² λλ€.
μλ₯Ό λ€μ΄:
EC2 Public IP: 35.74.238.231 (μμ)
λ§₯μμ pem νμΌ κΆνμ λ¨Όμ μ‘°μ νλ€.
chmod 400 ~/Downloads/onfit.pem
κ·Έλ¦¬κ³ μλμ²λΌ μ μ:
ssh -i ~/Downloads/onfit.pem ubuntu@35.74.238.231
μ²μ μ μν λλ μ΄λ° λ©μμ§κ° λ¬λ€.
The authenticity of host '35.74.238.231 (...)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
μ¬κΈ°μ yes μΉλ©΄ λλ€.
sudo apt update
sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v # v20.x νμΈ
npm -v
sudo apt install -y git nginx
sudo apt install -y certbot python3-certbot-nginx
sudo npm install -g pm2
pm2 -v
μ΄μ EC2 μμμ GitHub λ ν¬λ₯Ό ν΄λ‘ νλ€.
cd ~
git clone https://github.com/Jojunhyeong/on-fit.git
cd on-fit/on-fit-next
μ¨ν λ ν¬ κ΅¬μ‘°κ° λλ΅ μ΄λ° λλμ΄λ€.
on-fit/
ββ on-fit-next/ # Next.js νλ‘ νΈ + μλ²
ββ ... (κΈ°ν)
μ€μν 건 νκ²½λ³μλ μ λ GitHubμ μ¬λ¦¬μ§ μλλ€λ μ .
κ·Έλμ EC2 μμμ μ§μ .env νμΌμ λ§λ€μλ€.
cd ~/on-fit/on-fit-next
nano .env
κ·Έλ¦¬κ³ λ‘컬μμ μ¬μ©νλ κ°λ€μ κ·Έλλ‘ λ£μ΄μ€¬λ€. μμ:
NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
SUPABASE_SERVICE_ROLE_KEY=...
NEXT_PUBLIC_SITE_URL=https://onfit.today
...
μ μ₯(Ctrl+O) ν nano μ’ λ£(Ctrl+X).
λ¨Όμ μμ‘΄μ± μ€μΉ:
npm install --omit=dev
λΉλ:
npm run build
μλ¬ μμ΄ μ λλλ©΄, μΌλ¨ λ°λ‘ μ€νν΄λ³Έλ€.
npm start # λλ package.jsonμ start μ€ν¬λ¦½νΈ
μλ²μμ λ°λ‘ νμΈ:
curl -I http://127.0.0.1:3000
200 OKκ° λ¨μ΄μ§λ©΄, λΈλΌμ°μ μμ http://EC2_PUBLIC_IP:3000 μΌλ‘ μ μν΄μ νμΈνλ€.
μ¬κΈ°κΉμ§κ° βμλ λ°°ν¬βμ 첫 λ¨κ³μλ€.
npm startλ₯Ό ν°λ―Έλμμ μ§μ λ리면 μΈμ
μ’
λ£ μ μλ²λ κ°μ΄ μ£½λλ€.
κ·Έλμ pm2λ‘ Next.jsλ₯Ό λ°λͺ¬μΌλ‘ λμ λ€.
cd ~/on-fit/on-fit-next
pm2 start npm --name "onfit" -- start
pm2 status
μ΄λ κ² λ¨λ©΄ μ±κ³΅:
βββββββ¬ββββββββ¬βββββββββ¬ββββββ¬βββββββββ¬βββββββββ¬βββββββββ
β id β name β mode β ... β status β cpu β memory β
βββββββΌββββββββΌβββββββββΌββββββΌβββββββββΌβββββββββΌβββββββββ€
β 0 β onfit β fork β ... β online β 0.1% β 80MB β
βββββββ΄ββββββββ΄βββββββββ΄ββββββ΄βββββββββ΄βββββββββ΄βββββββββ
μλ² μ¬λΆν νμλ μλμΌλ‘ λ¨κ² νλ €λ©΄:
pm2 save
pm2 startup
# μΆλ ₯λλ λͺ
λ Ή ν μ€μ sudoλ‘ μ€ν
μ΄μ μ΄κ±Έ μ μ λλ©μΈ(onfit.today) + HTTPSλ‘ λ¬Άκ³ ,
κ·Έ μμ GitHub Actionsλ‘ CI/CD μλνλ₯Ό μ¬λ €μΌ νλ€.