ON-AIR mateλ μΉκ΅¬, ν¬, νΉμ μλ‘μ΄ μ¬λλ€κ³Ό μ νλΈ μμμ ν¨κ» 보며 μ€μκ°μΌλ‘ μν΅ν μ μλ μμ λΉλμ€ νλ«νΌμ λλ€. μμμ μκ°μ λΆλ§ν¬λ‘ κΈ°λ‘νκ³ , κ°μ ν¬μΈνΈλ₯Ό λͺ¨μ λλ§μ μμΉ΄μ΄λΈλ₯Ό λ§λ€λ©°, AIκ° λν λ΄μ©μ μμ½ν΄ λμΉκΈ° μ¬μ΄ μκ°μ μ 리ν΄μ€λλ€.
- μ€μκ° λμμ μμ² + μ±ν : μ¬λ¬ μ¬λμ΄ λμμ μμ²νκ³ λννλ©° μμν λ°μ 곡μ
- νμλΌμΈ λΆλ§ν¬ & μμΉ΄μ΄λΈ: νΉμ μκ°μ κΈ°λ‘νκ³ μ»¬λ μ μΌλ‘ μ 리
- μΉκ΅¬ & DM: μλ‘μ΄ μΉκ΅¬ μΆμ², 1:1 λ©μμ§, 컬λ μ 곡μ
- AI μ±ν μμ½: μ±ν λ°© μ’ λ£ μ λν λ΄μ© μλ μμ½ λ° κ°μ λΆμ
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
| κΉλ€μ€ | λ―ΌλμΌ | μ΄μμ§ | μκ°ν¬ |
π λ°°ν¬ μ 보 (μ΄μ μ€) π νλ‘λμ μλ²
- μλ² URL: https://onairmate.duckdns.org/
- Swagger URL: https://onairmate.duckdns.org/
- ν¬μ€μ²΄ν¬: https://onairmate.duckdns.org/health μν: π’ ONLINE (24μκ° μ΄μ) 보μ: π HTTPS νμ±ν (μ체 μλͺ μΈμ¦μ)
βοΈ AWS μΈνλΌ
EC2: i-0a91a4de26d731d88 (t2.micro, Amazon Linux 2023) RDS: MySQL 8.0 (db.t3.micro) 리μ : ap-northeast-2 (μμΈ) 보μκ·Έλ£Ή: HTTP(80), HTTPS(443), SSH(22) μ€ν μΉμλ²: Nginx (리λ²μ€ νλ‘μ)
π λ°°ν¬ μν
νλ‘μΈμ€ κ΄λ¦¬: PM2 μλ μ¬μμ: νμ±ν λ‘κ·Έ λ‘ν μ΄μ : νμ±ν GitHub Actions: μλ λ°°ν¬ μ€μ μλ£ HTTPS: μ체 μλͺ SSL μΈμ¦μ μ μ©
π οΈ κΈ°μ μ€ν
Language: TypeScript Runtime: Node.js 20.x Framework: Express.js ORM: Prisma Database: MySQL 8.0 (AWS RDS) Process Manager: PM2 Web Server: Nginx (리λ²μ€ νλ‘μ) CI/CD: GitHub Actions
κ°λ° λꡬ
Linting: ESLint Formatting: Prettier API λ¬Έμ: Swagger UI
π λ‘컬 κ°λ° νκ²½ μ€μ
- νλ‘μ νΈ ν΄λ‘ bash# λ ν¬μ§ν 리 ν΄λ‘ git clone https://github.com/ON-AIR-mate/Node.js.git cd Node.js
npm install 2. νκ²½ λ³μ μ€μ .env νμΌ λ΄μ© (νμλ³λ‘ λ³λ 곡μ ): env# μλ² μ€μ PORT=3000 NODE_ENV=development
JWT_ACCESS_SECRET=your_jwt_access_secret_key_here JWT_REFRESH_SECRET=your_jwt_refresh_secret_key_here
DATABASE_URL="mysql://username:password@host:3306/database" DB_HOST=localhost DB_USER=root DB_PASSWORD=your_password DB_NAME=onairmate_dev DB_PORT=3306
AWS_REGION=ap-northeast-2 AWS_ACCESS_KEY_ID=your_dev_access_key AWS_SECRET_ACCESS_KEY=your_dev_secret_key S3_BUCKET_NAME=your_dev_bucket 3. κ°λ° μλ² μ€ν bash# κ°λ° μλ² μμ (μλ μ¬μμ) npm run dev μ μ URL:
API μλ²: http://localhost:3000 API λ¬Έμ: http://localhost:3000/api-docs ν¬μ€μ²΄ν¬: http://localhost:3000/health
π λ°°ν¬ κ°μ΄λ π€ μλ λ°°ν¬ (κΆμ₯) GitHub Actions μ¬μ© - main λΈλμΉ push μ μλ λ°°ν¬ bash# λ‘컬μμ μμ git add . git commit -m "[feat] μλ‘μ΄ κΈ°λ₯ μΆκ°" git push origin main
λ°°ν¬ νλ‘μΈμ€:
β μ½λ νμ§ κ²μ¬ (ESLint) β TypeScript λΉλ β EC2 SSH μ μ β μ½λ pull λ° μμ‘΄μ± μ€μΉ β νλ‘λμ λΉλ β PM2 μ¬μμ β ν¬μ€μ²΄ν¬ νμΈ
GitHub Actions μ€μ :
Settings β Secrets and variables β Actionsμμ μ€μ μλ£ EC2_KEY: SSH ν€ νμΌ μ€μ μλ£ β EC2_HOST: 54.180.254.48 β EC2_USER: ec2-user β
π¨βπ» μλ λ°°ν¬ (λΉμμ) bash# EC2 μ μ ssh -i your-key.pem ec2-user@54.180.254.48
cd /home/ec2-user/on-air-mate
git pull origin main
npm ci npm run format npm run build
pm2 restart onairmate-api
pm2 status curl https://localhost:3000/health
π HTTPS/SSL μ€μ Nginx 리λ²μ€ νλ‘μ ꡬμ±
Nginx: 80/443 ν¬νΈ β Node.js 3000 ν¬νΈλ‘ νλ‘μ SSL: μ체 μλͺ μΈμ¦μ μ¬μ© (κ°λ°/ν μ€νΈ νκ²½) μμΉ: /etc/nginx/conf.d/app.conf
μΈμ¦μ κ΄λ¦¬ bash# μΈμ¦μ μμΉ /etc/nginx/ssl/certificate.crt /etc/nginx/ssl/private.key
sudo systemctl restart nginx ν₯ν κ³ν
Let's Encrypt λ¬΄λ£ μΈμ¦μ μ μ© (λλ©μΈ ꡬ맀 ν) AWS Certificate Manager + ALB κ³ λ €
π§ κ°λ° λꡬ μ€μ VS Code μλ ν¬λ§·ν (κΆμ₯) νλ‘μ νΈμ VS Code μ€μ μ΄ ν¬ν¨λμ΄ μμ΄ νμΌ μ μ₯ μ μλ ν¬λ§·ν λ©λλ€:
νμ νμ₯ νλ‘κ·Έλ¨:
esbenp.prettier-vscode (Prettier) dbaeumer.vscode-eslint (ESLint)
μ μ₯ μ μλ μ μ© β¨
μ½λ νμ§ κ΄λ¦¬ bash# π₯ ν¬λ§·ν + λ¦°ν (νλ²μ) npm run format
npm run check
npm run build
npm run dev
NODE_ENV=production npm start
ποΈ λ°μ΄ν°λ² μ΄μ€ Prisma μ€μ bash# μ€ν€λ§ λ³κ²½ ν λ§μ΄κ·Έλ μ΄μ npm run db:migrate
npx prisma migrate dev --name migration_name
npx prisma generate
npx prisma studio MySQL μ°κ²° μ 보
νΈμ€νΈ: AWS RDS (μμΈ λ¦¬μ ) μμ§: MySQL 8.0 (db.t3.micro) ν¬νΈ: 3306 λ°μ΄ν°λ² μ΄μ€: onairmate μ°κ²° ν: 10κ° μ°κ²° μ ν
π― μ΄μ κ΄λ¦¬ PM2 λͺ λ Ήμ΄ bash# μν νμΈ pm2 status
pm2 logs onairmate-api
pm2 monit
pm2 restart onairmate-api
pm2 stop onairmate-api pm2 start onairmate-api
pm2 show onairmate-api
NODE_ENV=production pm2 start ecosystem.config.js Nginx κ΄λ¦¬ bash# μν νμΈ sudo systemctl status nginx
sudo nginx -t
sudo systemctl restart nginx
sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/nginx/error.log μμ€ν λͺ¨λν°λ§ bash# μλ² λ¦¬μμ€ νμΈ htop # CPU/λ©λͺ¨λ¦¬ μ€μκ° free -h # λ©λͺ¨λ¦¬ μ¬μ©λ df -h # λμ€ν¬ μ¬μ©λ
sudo ss -tulpn | grep :3000 # Node.js ν¬νΈ sudo ss -tulpn | grep :443 # HTTPS ν¬νΈ netstat -an | grep :443 # HTTPS μ°κ²° μν
ps aux | grep node ps aux | grep nginx




