Search

React ๋ฐฐํฌํ•˜๊ธฐ

React ์•ฑ Nginx๋กœ ๋ฐฐํฌํ•˜๊ธฐ

๊ฐœ์š”

React ์•ฑ์€ ๋นŒ๋“œ ํ›„ ์ƒ์„ฑ๋˜๋Š” ์ •์  ํŒŒ์ผ(HTML, CSS, JS)์„ Nginx๊ฐ€ ์ง์ ‘ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•œ๋‹ค.
React๋กœ ๋งŒ๋“  ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์„ ์‹ค์ œ ์„œ๋น„์Šค๋กœ ์˜ฌ๋ฆฌ๋ ค๋ฉด, npm start๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋นŒ๋“œ(Build)ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ Nginx๋กœ ์„œ๋น™ํ•ด์•ผ ํ•ด์š”.
React์˜ npm run build ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด build/ ํด๋”์— ์ตœ์ ํ™”๋œ ์ •์  ํŒŒ์ผ๋“ค์ด ์ƒ๊ฒจ์š”. ์ด ํŒŒ์ผ๋“ค์„ Nginx์˜ ์›น ๋ฃจํŠธ์— ์˜ฌ๋ ค๋†“์œผ๋ฉด ๋! Nginx๊ฐ€ HTML, CSS, JS ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์ •์  ํŒŒ์ผ ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.

๋ฐฐํฌ ์•„ํ‚คํ…์ฒ˜

graph LR
    A[๐Ÿ‘ค ์‚ฌ์šฉ์ž<br/>๋ธŒ๋ผ์šฐ์ €] -->|"<https://example.com>"| B[๐Ÿ–ฅ๏ธ Nginx<br/>ํฌํŠธ 443/80]
    B -->|์ •์  ํŒŒ์ผ ์„œ๋น™| C["๐Ÿ“ /var/www/frontend/<br/>build ๊ฒฐ๊ณผ๋ฌผ<br/>index.html, JS, CSS"]

    style B fill:#90EE90
    style C fill:#87CEEB
Mermaid
๋ณต์‚ฌ
flowchart TD
    A["๐Ÿ’ป ๋กœ์ปฌ ๊ฐœ๋ฐœ"] -->|npm run build| B["๐Ÿ“ฆ build/ ํด๋” ์ƒ์„ฑ"]
    B -->|"scp ๋˜๋Š” CI/CD"| C["๐Ÿ–ฅ๏ธ ์„œ๋ฒ„์— ์—…๋กœ๋“œ<br/>/var/www/frontend/"]
    C --> D["โš™๏ธ Nginx ์„ค์ •<br/>์ •์  ํŒŒ์ผ ์„œ๋น™"]
    D --> E["๐ŸŒ ์„œ๋น„์Šค ์˜คํ”ˆ!"]

    style B fill:#FFD700
    style D fill:#90EE90
Mermaid
๋ณต์‚ฌ

Step 1: React ์•ฑ ๋นŒ๋“œ

# ๋กœ์ปฌ (๊ฐœ๋ฐœ ํ™˜๊ฒฝ)์—์„œ ๋นŒ๋“œ cd my-react-app npm run build # build/ ํด๋” ๋‚ด์šฉ ํ™•์ธ ls build/ # index.html static/ asset-manifest.json ...
Bash
๋ณต์‚ฌ
build/ ํด๋”์— ๋งŒ๋“ค์–ด์ง€๋Š” ํŒŒ์ผ:
ํŒŒ์ผ/ํด๋”
์„ค๋ช…
index.html
์ง„์ž…์  HTML
static/js/
๋ฒˆ๋“ค๋ง๋œ JavaScript
static/css/
๋ฒˆ๋“ค๋ง๋œ CSS
static/media/
์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ
asset-manifest.json
์—์…‹ ๋งคํ•‘ ์ •๋ณด

Step 2: ์„œ๋ฒ„์— ํŒŒ์ผ ์—…๋กœ๋“œ

# SCP๋กœ ๋นŒ๋“œ ํŒŒ์ผ ์—…๋กœ๋“œ scp -r build/* ubuntu@์„œ๋ฒ„IP:/var/www/frontend/ # ๋˜๋Š” rsync (๋” ํšจ์œจ์  โ€” ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ์ „์†ก) rsync -avz --delete build/ ubuntu@์„œ๋ฒ„IP:/var/www/frontend/
Bash
๋ณต์‚ฌ
# ์„œ๋ฒ„์—์„œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ์„ค์ • sudo mkdir -p /var/www/frontend sudo chown -R www-data:www-data /var/www/frontend
Bash
๋ณต์‚ฌ

Step 3: Nginx ์„ค์ •

sudo nano /etc/nginx/sites-available/react-app
Bash
๋ณต์‚ฌ
server { listen 80; server_name example.com www.example.com; root /var/www/frontend; index index.html; # โญ React Router ๋Œ€์‘ (SPA ํ•ต์‹ฌ ์„ค์ •!) location / { try_files $uri $uri/ /index.html; } # ์ •์  ์—์…‹ ์บ์‹ฑ (JS, CSS ๋“ฑ) location /static/ { expires 1y; add_header Cache-Control "public, immutable"; } # ํŒŒ๋น„์ฝ˜ 404 ๋ฐฉ์ง€ location = /favicon.ico { log_not_found off; access_log off; } # robots.txt location = /robots.txt { log_not_found off; access_log off; } # gzip ์••์ถ• gzip on; gzip_types text/plain text/css application/json application/javascript text/xml; gzip_min_length 256; }
Plain Text
๋ณต์‚ฌ

try_files $uri $uri/ /index.html ์ด ๋ญ์•ผ?

์ด ์„ค์ •์ด React ๋ฐฐํฌ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•œ ์ค„์ด์—์š”!
flowchart TD
    A["์‚ฌ์šฉ์ž๊ฐ€ /about ์š”์ฒญ"] --> B{"ํŒŒ์ผ ์žˆ์Œ?<br/>/var/www/frontend/about"}
    B -->|"์žˆ์Œ ($uri)"| C["ํ•ด๋‹น ํŒŒ์ผ ๋ฐ˜ํ™˜"]
    B -->|"์—†์Œ"| D{"ํด๋” ์žˆ์Œ?<br/>/var/www/frontend/about/"}
    D -->|"์žˆ์Œ ($uri/)"| E["ํด๋”์˜ index ๋ฐ˜ํ™˜"]
    D -->|"์—†์Œ"| F["๐Ÿ”„ /index.html ๋ฐ˜ํ™˜<br/>React Router๊ฐ€ ์ฒ˜๋ฆฌ!"]

    style F fill:#90EE90
Mermaid
๋ณต์‚ฌ
React๋Š” SPA(Single Page Application)์ด๋ผ์„œ, /about, /users/123 ๊ฐ™์€ ๊ฒฝ๋กœ๊ฐ€ ์‹ค์ œ ํŒŒ์ผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์•„์š”. ๋ชจ๋“  ๋ผ์šฐํŒ…์€ JavaScript(React Router)๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋“ ์š”.
๊ทธ๋ž˜์„œ ํŒŒ์ผ์ด ์—†์„ ๋•Œ 404๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹ , index.html์„ ๋ฐ˜ํ™˜ํ•ด์„œ React Router๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”!

Step 4: ์‚ฌ์ดํŠธ ํ™œ์„ฑํ™”

# ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ํ™œ์„ฑํ™” sudo ln -s /etc/nginx/sites-available/react-app /etc/nginx/sites-enabled/ # ๊ธฐ๋ณธ ์‚ฌ์ดํŠธ ๋น„ํ™œ์„ฑํ™” (์ถฉ๋Œ ๋ฐฉ์ง€) sudo rm /etc/nginx/sites-enabled/default # ์„ค์ • ํ…Œ์ŠคํŠธ sudo nginx -t # ์ ์šฉ sudo systemctl reload nginx
Bash
๋ณต์‚ฌ

Step 5: HTTPS ์ ์šฉ

# Certbot์œผ๋กœ SSL ์ž๋™ ์„ค์ • sudo certbot --nginx -d example.com -d www.example.com
Bash
๋ณต์‚ฌ
HTTPS ์ ์šฉ ํ›„ ์ตœ์ข… ์„ค์ •:
server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; root /var/www/frontend; index index.html; location / { try_files $uri $uri/ /index.html; } location /static/ { expires 1y; add_header Cache-Control "public, immutable"; } gzip on; gzip_types text/plain text/css application/json application/javascript text/xml; } # HTTP โ†’ HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Plain Text
๋ณต์‚ฌ

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

๋ฌธ์ œ
์›์ธ
ํ•ด๊ฒฐ
์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด 404
try_files ๋ฏธ์„ค์ •
try_files $uri $uri/ /index.html ์ถ”๊ฐ€
ํฐ ํ™”๋ฉด (๋นˆ ํŽ˜์ด์ง€)
homepage ๊ฒฝ๋กœ ๋ถˆ์ผ์น˜
package.json์˜ homepage ํ™•์ธ
CSS/JS ๋กœ๋”ฉ ์•ˆ ๋จ
root ๊ฒฝ๋กœ ์˜ค๋ฅ˜
root ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ ํ™•์ธ
403 Forbidden
ํŒŒ์ผ ๊ถŒํ•œ ๋ฌธ์ œ
chown -R www-data:www-data /var/www/frontend
์บ์‹œ๋œ ์˜›๋‚  ๋ฒ„์ „ ํ‘œ์‹œ
๋ธŒ๋ผ์šฐ์ € ์บ์‹œ
๊ฐ•๋ ฅ ์ƒˆ๋กœ๊ณ ์นจ (Ctrl+Shift+R)

์‹ค์Šต

์‹ค์Šต ํ™˜๊ฒฝ

ํ•ญ๋ชฉ
๊ฐ’
๋กœ์ปฌ ํ”„๋กœ์ ํŠธ
Vite ๊ธฐ๋ฐ˜ React ์•ฑ
๋นŒ๋“œ ๊ฒฐ๊ณผ ํด๋”
dist/
์„œ๋ฒ„
alohaserver4.cafe24.com
๋ฐฐํฌ ๊ฒฝ๋กœ
/var/www/krules/frontend
SSH ์ ‘์†
Host alias alohaserver4 ์‚ฌ์šฉ
Vite๋Š” ๋นŒ๋“œ ๊ฒฐ๊ณผ๊ฐ€ build/ ๊ฐ€ ์•„๋‹ˆ๋ผ dist/ ํด๋”์— ์ƒ์„ฑ๋ผ์š”. CRA(Create React App)๊ณผ ๋‹ค๋ฅธ ์ ์ด์—์š”!

SSH Config ์„ค์ • (~/.ssh/config)

ํ„ฐ๋ฏธ๋„์—์„œ ๋งค๋ฒˆ ๊ธด ์ฃผ์†Œ๋ฅผ ์น˜๋Š” ๋Œ€์‹  ๋ณ„๋ช…(alias)์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ์–ด์š”.
# ~/.ssh/config Host alohaserver4 HostName alohaserver4.cafe24.com User root
Plain Text
๋ณต์‚ฌ
์„ค์ • ํ›„ ์ด๋ ‡๊ฒŒ ์งง๊ฒŒ ์ ‘์†:
ssh alohaserver4 # root@alohaserver4.cafe24.com ๊ณผ ๋™์ผ
Bash
๋ณต์‚ฌ

1๋‹จ๊ณ„: ์ˆ˜๋™ ๋ฐฐํฌ (SSH + SCP)

flowchart LR
    A["๐Ÿ’ป ๋กœ์ปฌ\\nnpm run build"] -->|"dist/ ์ƒ์„ฑ"| B["๐Ÿ“ฆ dist/ ํด๋”"]
    B -->|"scp ์—…๋กœ๋“œ"| C["๐Ÿ–ฅ๏ธ ์„œ๋ฒ„\\n/var/www/krules/frontend/"]
    C --> D["๐ŸŒ ๋ธŒ๋ผ์šฐ์ € ํ™•์ธ"]
Mermaid
๋ณต์‚ฌ
# 1. ๋กœ์ปฌ์—์„œ ๋นŒ๋“œ (Vite โ†’ dist/) npm run build # 2. ์„œ๋ฒ„์˜ ๋ฐฐํฌ ๊ฒฝ๋กœ ์ƒ์„ฑ (์ตœ์ดˆ 1ํšŒ) ssh root@alohaserver4.cafe24.com "mkdir -p /var/www/krules/frontend" # 3. dist/ ๋‚ด์šฉ ์„œ๋ฒ„๋กœ ์—…๋กœ๋“œ # (dist/* ๋กœ dist ํด๋” ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋‚ด์šฉ๋ฌผ๋งŒ ๋ณต์‚ฌ) scp -r dist/* root@alohaserver4.cafe24.com:/var/www/krules/frontend/ # 4. ์„œ๋ฒ„์—์„œ ํŒŒ์ผ ํ™•์ธ ssh root@alohaserver4.cafe24.com "ls -la /var/www/krules/frontend/"
Bash
๋ณต์‚ฌ

2๋‹จ๊ณ„: Nginx ์„ค์ • (์„œ๋ฒ„์—์„œ)

# ์„œ๋ฒ„ ์ ‘์† ssh root@alohaserver4.cafe24.com # ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ - ๋ฐฉ๋ฒ•1 (conf.d) nano /etc/nginx/conf.d/krules.conf # ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ - ๋ฐฉ๋ฒ•2 (sites-available) nano /etc/nginx/sites-available/krules.conf # sites-available โ†’ sites-enabled ์‹ฌ๋ณผ๋ฆญ ๋งํฌ sudo ln -s /etc/nginx/sites-available/krules.conf /etc/nginx/sites-enabled/
Bash
๋ณต์‚ฌ
server { listen 80; server_name xn--3e0b91t.com www.xn--3e0b91t.com; root /var/www/krules/frontend; index index.html; # SPA ๋ผ์šฐํŒ… ๋Œ€์‘ location / { try_files $uri $uri/ /index.html; } # Vite ๋นŒ๋“œ ์—์…‹ ์บ์‹ฑ (assets/ ํด๋”์— hash ํŒŒ์ผ๋ช…์œผ๋กœ ์ƒ์„ฑ๋จ) location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; } gzip on; gzip_types text/plain text/css application/json application/javascript text/xml; }
Plain Text
๋ณต์‚ฌ
sudo nginx -t && systemctl reload nginx
Bash
๋ณต์‚ฌ

3๋‹จ๊ณ„: .bat ํŒŒ์ผ๋กœ ๋ฐฐํฌ ์ž๋™ํ™”

๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒŒ ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ๋นŒ๋“œ + ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™ํ™”ํ•ด์š”!
๋น„๋ฐ€๋ฒˆํ˜ธ ์ž๋™ ์ž…๋ ฅ์„ ์œ„ํ•ด PuTTY์˜ pscp.exe ๋ฅผ ์‚ฌ์šฉํ•ด์š”. ์„ค์น˜: https://www.putty.org/ โ†’ pscp.exe ๋‹ค์šด๋กœ๋“œ ํ›„ PATH์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ bat ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํด๋”์— ๋‘์„ธ์š”.
๋˜๋Š” SSH ํ‚ค ์ธ์ฆ์„ ์„ค์ •ํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ scp ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋” ์•ˆ์ „, ์•„๋ž˜ ์ฐธ๊ณ )
deploy.bat (ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ €์žฅ)
@echo off chcp 65001 > nul echo. echo ============================================= echo React Vite Build ^& Deploy to alohaserver4 echo ============================================= echo. :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ :: ์„ค์ •๊ฐ’ :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ set PROJECT_DIR=%~dp0 set REMOTE_USER=root set REMOTE_HOST=alohaserver4.cafe24.com set REMOTE_PATH=/var/www/krules/frontend/ :: ๐Ÿ” ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ (์•ˆ ๋ณด์ด๊ฒŒ) for /f "delims=" %%p in ('powershell -Command "$p = Read-Host ''SSH Password'' -AsSecureString; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($p); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"') do set REMOTE_PASS=%%p echo. :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ :: [1] ๋นŒ๋“œ :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ echo [1/2] ๋นŒ๋“œ ์ค‘... cd /d %PROJECT_DIR% call npm run build if errorlevel 1 ( echo. echo [์˜ค๋ฅ˜] ๋นŒ๋“œ ์‹คํŒจ! ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. pause exit /b 1 ) echo ๋นŒ๋“œ ์™„๋ฃŒ - dist/ ํด๋” ์ƒ์„ฑ๋จ echo. :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ :: [2] ์„œ๋ฒ„ ์—…๋กœ๋“œ :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ echo [2/2] ์„œ๋ฒ„์— ์—…๋กœ๋“œ ์ค‘... pscp -pw %REMOTE_PASS% -r dist\* %REMOTE_USER%@%REMOTE_HOST%:%REMOTE_PATH% if errorlevel 1 ( echo. echo [์˜ค๋ฅ˜] ์—…๋กœ๋“œ ์‹คํŒจ! ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜์„ธ์š”. pause exit /b 1 ) :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ :: [3] ์™„๋ฃŒ :: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ echo. echo ============================================= echo ๋ฐฐํฌ ์™„๋ฃŒ! echo http://xn--3e0b91t.com ์—์„œ ํ™•์ธํ•˜์„ธ์š”. echo ============================================= echo. pause
Shell
๋ณต์‚ฌ
์‹คํ–‰ ๋ฐฉ๋ฒ•: deploy.bat ๋”๋ธ”ํด๋ฆญ โ†’ ๋นŒ๋“œ + ์—…๋กœ๋“œ ์ž๋™ ์ง„ํ–‰

(์„ ํƒ) SSH ํ‚ค ์ธ์ฆ์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ๋ฐฐํฌ

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ฑด ๋ณด์•ˆ์ƒ ์ข‹์ง€ ์•Š์•„์š”. SSH ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.
# Windows PowerShell ๋˜๋Š” CMD์—์„œ # 1. SSH ํ‚ค ์ƒ์„ฑ (์ด๋ฏธ ์žˆ์œผ๋ฉด ์ƒ๋žต) ssh-keygen -t ed25519 -C "deploy-key" # 2. ๊ณต๊ฐœํ‚ค๋ฅผ ์„œ๋ฒ„์— ๋“ฑ๋ก ssh-copy-id alohaserver4 # ๋˜๋Š” ์ง์ ‘ ๋ถ™์—ฌ๋„ฃ๊ธฐ: # type %USERPROFILE%\\.ssh\\id_ed25519.pub | ssh alohaserver4 "cat >> ~/.ssh/authorized_keys"
Bash
๋ณต์‚ฌ
ํ‚ค ๋“ฑ๋ก ํ›„ deploy.bat ์—์„œ pscp -pw ๋Œ€์‹  ์ผ๋ฐ˜ scp ์‚ฌ์šฉ:
:: pscp ์ค„์„ ์•„๋ž˜๋กœ ๊ต์ฒด scp -r dist\\* alohaserver4:%REMOTE_PATH%
Shell
๋ณต์‚ฌ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

~/.ssh/config ์— alohaserver4 Host ์„ค์ • ์™„๋ฃŒ?
ssh alohaserver4 ์ ‘์† ํ™•์ธ?
์„œ๋ฒ„์— /var/www/krules/frontend ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ?
npm run build โ†’ dist/ ํด๋” ์ƒ์„ฑ ํ™•์ธ?
scp -r dist/* alohaserver4:/var/www/krules/frontend/ ์—…๋กœ๋“œ ์„ฑ๊ณต?
Nginx conf.d/krules.conf ์„ค์ • ์™„๋ฃŒ?
try_files $uri $uri/ /index.html ํฌํ•จ?
nginx -t ํ†ต๊ณผ ๋ฐ systemctl reload nginx ์™„๋ฃŒ?
๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์† ํ™•์ธ?
deploy.bat ์ƒ์„ฑ ํ›„ ์ž๋™ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ?

ํ•ต์‹ฌ ์ •๋ฆฌ

React ๋ฐฐํฌ = npm run build โ†’ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ Nginx๋กœ ์ •์  ์„œ๋น™
ํ•ต์‹ฌ ์„ค์ •: try_files $uri $uri/ /index.html (SPA ๋ผ์šฐํŒ… ๋Œ€์‘)
์ •์  ์—์…‹(/static/)์—๋Š” ์žฅ๊ธฐ ์บ์‹ฑ ์ ์šฉ โ†’ ์„ฑ๋Šฅ ํ–ฅ์ƒ
gzip ์••์ถ•์œผ๋กœ ์ „์†ก ํฌ๊ธฐ ์ ˆ์•ฝ
Certbot์œผ๋กœ HTTPS ์ ์šฉ ํ•„์ˆ˜