Server, Deploy๐ŸŒ/Server๐Ÿ›œ

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด4 ์„œ๋ฒ„ ๊ตฌ์ถ•๊ธฐ - (4) ์™ธ๋ถ€์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ ์ ‘์†ํ•˜๊ธฐ

JanuDev 2026. 3. 30. 16:36

๊ธฐ์กด์— ๋‚ด๊ฐ€ ๊ฒŒ์‹œ๊ธ€์—์„œ

 

(4) ์™ธ๋ถ€ ์ ‘์† ์„ค์ • (์„ ํƒ)

1. ๊ณต์œ ๊ธฐ ํฌํŠธํฌ์›Œ๋”ฉ ์„ค์ • ์˜ˆ) 80 ํฌํŠธ๋ฅผ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์˜ 80 ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ

2. DDNS ์„ค์ • (์„ ํƒ): ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„๋ฉ”์ธ ์ฃผ์†Œ ํ• ๋‹น (No-IP, DuckDNS ๋“ฑ ์‚ฌ์šฉ)

3. SSL ์ ์šฉ (์„ ํƒ): certbot์œผ๋กœ Let's Encrypt ์ธ์ฆ์„œ ์„ค์ •ํ•˜๋ฉด HTTPS ์ ‘์† ๊ฐ€๋Šฅ...(์ƒ๋žต)

 

....๋ญ ์ด๋Ÿฐ์‹์œผ๋กœ ์ผ์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ๋„ AIํ•œํ…Œ ๋ฌผ์–ด๋ด์„œ ์ •๋ณด๋ฅผ ์–ป์€๊ฑฐ๋ผ ํ™•์‹คํ•˜์ง„ ์•Š์•„์„œ ๋‚ด๊ฐ€ ์ง์ ‘ ์ฐพ์•„๋ดค๋‹ค.

 

Let's Encrypt ์ธ์ฆ์„œ๋ž€?

๋ฌด๋ฃŒ๋กœ HTTPS ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€. 

์ธํ„ฐ๋„ท์—์„  ๋ณด์•ˆ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ํ•ด์ฃผ๋Š” HTTPS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค(์ด๊ฑด ๊ธฐ์กด์˜ ๋‚˜๋„ ์•Œ๊ณ  ์žˆ๋˜๊ฒƒ). HTTPS๋ฅผ ์“ฐ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋˜๊ณ , ๋กœ๊ทธ์ธ ์ •๋ณด ๋ฐ ์ฟ ํ‚ค๊ฐ€ ๋ณดํ˜ธ๋œ๋‹ค. 

์›นํŽ˜์ด์ง€๊ฐ€ HTTPS๊ฐ€ ๋˜๋ ค๋ฉด ์„œ๋ฒ„์— ์ธ์ฆ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ์ธ์ฆ์„œ๋Š” (1) ์ด ์„œ๋ฒ„๊ฐ€ ์ง„์งœ์ž„์„ ์ฆ๋ช… (2) ์•”ํ˜ธํ™” ํ†ต์‹  ์‹œ์ž‘์„ ์œ„ํ•œ ํ‚ค ์ œ๊ณต ๋“ฑ์˜ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

  • Let's Encrypt : ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๊ธฐ๊ด€(CA), ์‹ค์ œ ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‚ด๋ ค์คŒ
  • Certbot : ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ํ”„๋กœ๊ทธ๋žจ. Let's Encrypt์— ์š”์ฒญ ๋ณด๋‚ด๊ณ  ์ธ์ฆ์„œ ๋ฐ›์•„์„œ ์„œ๋ฒ„ ์„ค์น˜ํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜๋ฉด ์ž๋™ ๊ฐฑ์‹ ๊นŒ์ง€ ํ•ด์ฃผ๊ณ ....

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ Tailscale๋ฅผ ์•Œ๊ฒŒ๋ฌ๋‹ค. 

Tailscale์ด๋ž€?

WireGuard ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ˜„๋Œ€์ ์ธ ๋งค์‰ฌ VPN์†”๋ฃจ์…˜์œผ๋กœ, ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ์„ค์ •์—†์ด ์žฅ์น˜ ๊ฐ„ ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅธ ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ญ” ๋ง์ธ์ง€ ์ดํ•ด ์•ˆ๊ฐ„๋‹ค๋ฉด, "์ง‘ ๋ฐ–์—์„œ๋„ ์ง‘ ์•ˆ์— ์žˆ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ ‘์†ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ"๋ผ๊ณ  ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

๊ธฐ์กด์˜ ๋ฐฉ์‹์€ 

๋‹ค๋ฅธ ์žฅ์†Œ → ์ธํ„ฐ๋„ท → ๊ณต์œ ๊ธฐ(ํฌํŠธํฌ์›Œ๋“œ) → ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด(ํ™ˆ์„œ๋ฒ„)

์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ์ ‘์† ์‹œ ํฌํŠธํฌ์›Œ๋“œ ์„ค์ •, ๊ณต์ธIP ๋ฐ DDNS ์„ค์ •, ๋ณด์•ˆ ๋“ฑ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค. 

Talescale์€ ๊ณต์œ ๊ธฐ, ํฌํŠธํฌ์›Œ๋”ฉ ๋“ฑ์˜ ์„ ํ–‰ ์ž‘์—…์ด ๋ชจ๋‘ ๋ฌด์‹œ๋œ๋‹ค.

 

1๏ธโƒฃ ๊ฐ€์งœ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ฆ

์ง‘์ด๋“  ํšŒ์‚ฌ๋“  ์–ด๋А ์žฅ์†Œ๋“  ์ƒ๊ด€ ์—†์ด ๋ชจ๋“  ๊ธฐ๊ธฐ๋ฅผ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์ฃผ๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ํ™ˆ์„œ๋ฒ„์—๋Š” Tailscale ์ „์šฉ IP๊ฐ€ ์ƒ๊ธด๋‹ค.

100.x.x.x (Tailscale ์ „์šฉ IP)

 

2๏ธโƒฃ ๊ทธ ์ฃผ์†Œ๋กœ ๋ฐ”๋กœ ์ ‘์† ๊ฐ€๋Šฅ

ํ„ฐ๋ฏธ๋„(๋ฆฌ๋ˆ…์Šค, ์œˆ๋„์šฐ powershell, ๋งฅ)์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ์—ด๋ฆฐ๋‹ค. 

ssh pi@100.x.x.x

 

๋‹จ ์ €๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹น์—ฐํžˆ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋“ค์€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—.... ๋‚œ Tailscale Funnel ๋ฌด๋ฃŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

1. ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์— ์›น์„œ๋ฒ„ ์‹คํ–‰

npm run dev, http://localhost:3000 ๋“ฑ์œผ๋กœ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๋„ค๋ถ€์—์„œ ์ ‘์†์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. 

 

2. Tailscale ์„ค์น˜

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด os์—์„œ curl๋ช…๋ น์–ด๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ

curl -fsSL https://tailscale.com/install.sh | sh

๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์„ค์น˜ ํ›„

sudo tailscale up

๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ฐฝ์ด ๋œจ๋ฉด ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.

 

3. Funnel ํ™œ์„ฑํ™”

sudo tailscale funnel 3000

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์˜ 3000๋ฒˆ ํฌํŠธ๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜๊ฒ ๋‹ค๋Š” ๋œป์œผ๋กœ, ๊ฐ ํฌํŠธ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

4. URL ์ƒ์„ฑ ํ™•์ธ

๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด

https://xxxx.ts.net

๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด๊ฒŒ ๋ฐ”๋กœ ์™ธ๋ถ€์—์„œ ์ ‘์† ๊ฐ€๋Šฅํ•œ URL์ด๋‹ค. 

๋‹ค๋งŒ ๋‚˜์˜ ๊ฒฝ์šฐ Vite + Typescript + React๋ฅผ ์‚ฌ์šฉํ•œ web๋‹จ๊ณผ Spring Boot๋ฅผ ์‚ฌ์šฉํ•œ WAS๋‹จ์ด ๋”ฐ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Nginx)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


์™ธ๋ถ€ (https://xxx.ts.net)
        ↓
     nginx
   โ”œโ”€ /        → React (์ •์  ํŒŒ์ผ)
   โ””โ”€ /api     → Spring Boot (8080)

 

์ „์ฒด ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(1) React ๋นŒ๋“œ

(2) NGINX ์„ค์น˜

(3) NGINX ์„ค์ •

(4) Spring Boot ์‹คํ–‰

(5) Tailscale Funnel ์—ฐ๊ฒฐ

1. React ๋นŒ๋“œ

๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ react ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.

npm run build

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„๊ฑฐ๋‹ค.

dist/
 โ”œโ”€ index.html
 โ”œโ”€ assets/

 

2. nginx ์„ค์น˜

sudo apt update
sudo apt install nginx -y

์„ค์น˜ ํ™•์ธ์€

nginx -v

๋กœ ํ™•์ธํ•œ๋‹ค.

 

3. nginx ์„ค์ •

์„ค์ • ํŒŒ์ผ ์—ด๊ธฐ

sudo nano /etc/nginx/sites-available/default

 ๊ธฐ์กด ๋‚ด์šฉ ๋‹ค ์ง€์šฐ๊ณ  ์•„๋ž˜๋กœ ๊ต์ฒดํ•œ๋‹ค.

server {
    listen 80;
    server_name _;

    # React (ํ”„๋ก ํŠธ)
    root /home/pi/project/dist;
    index index.html;

    location / {
        try_files $uri /index.html;
    }

    # Spring Boot (๋ฐฑ์—”๋“œ)
    location /api/ {
        proxy_pass http://localhost:8080/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

์ค‘์š” ํฌ์ธํŠธ๋Š”, root๊ฒฝ๋กœ๋ฅผ ๋‚ด dist ํด๋” ์œ„์น˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค.

root /home/pi/project/dist;

 

4. nginx ์žฌ์‹œ์ž‘

sudo systemctl restart nginx

 

5. Spring Boot ์‹คํ–‰

maven ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ jar ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

mvn clean package
  • clean : ์ด์ „์— ๋นŒ๋“œํ–ˆ๋˜ ์ฐŒ๊บผ๊ธฐ ํŒŒ์ผ์„ ์ง€์›€
  • package: ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑธ์ณ targetํด๋” ์•ˆ์— .jarํŒŒ์ผ์„ ์ƒ์„ฑํ•จ

์„ฑ๊ณต ์‹œ target/ ํด๋” ์•ˆ์— ํ”„๋กœ์ ํŠธ๋ช…-0.0.1-SNAPSHOT.jar๊ณผ ๊ฐ™์€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํŒŒ์ผ์„ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ์ปดํ“จํ„ฐ๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

# ํ˜•์‹: scp [ํŒŒ์ผ๊ฒฝ๋กœ] [์‚ฌ์šฉ์ž]@[๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ดIP]:[๋ณต์‚ฌํ• ๊ฒฝ๋กœ]
scp target/*.jar pi@raspberrypi.local:/home/pi/project/app.jar

์œ„ ๋ช…๋ น์–ด ์ž‘์„ฑ ์‹œ ๋‚ด pc์— ์žˆ๋˜ jarํŒŒ ์ผ์ด ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์˜ /home/pi/project/ํด๋”๋กœ app.jar๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณต์‚ฌ๋œ๋‹ค.

 

6. Tailscale Funnel ์—ฐ๊ฒฐ

sudo tailscale funnel 80

 

 

[์ฐธ๊ณ  ์ž๋ฃŒ]

https://velog.io/@zvyg1023/Certbot-ssl-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B0%9C%EA%B8%89%EB%B0%9B%EA%B8%B0

 

Let's Encrypt - Certbot์œผ๋กœ ssl ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ

์ด์ œ ๋ณธ๊ฒฉ์ ์ธ https ์„ธํŒ…์„ ์‹œ์ž‘ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. Let's Encrypt ๋ผ๋Š” ๋น„์˜๋ฆฌ ๊ธฐ๊ด€์„ ํ†ตํ•ด ๋ฌด๋ฃŒ๋กœ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์„ ์œ„ํ•ด Certbot์„ ์‚ฌ์šฉํ•ด๋ณด์ž. 1. certbot ์„ค์น˜ํ•˜๊ธฐ Certbot ์„ค์น˜๋Š”

velog.io

https://devopslog.tistory.com/169

 

Tailscale ๊ฐ€์ด๋“œ - ์•ˆ์ „ํ•œ ๋งค์‰ฌ VPN ํ™œ์šฉ๋ฒ•

Tailscale์˜ ํ•ต์‹ฌ ๊ฐœ๋…, VPN ์ •์˜, ๋™์ž‘ ๋ฐฉ์‹, ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•, ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ, ํฌํŠธ ์ œ์–ด, ๋‹ค๋ฅธ ๋‹จ๋ง ์ ‘์†, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ ์„ค์ • ๋ฐฉ๋ฒ•Tailscale์ด๋ž€?Tailscale์€ WireGuard ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ˜„๋Œ€์ ์ธ

devopslog.tistory.com

https://www.youtube.com/watch?v=vCM-demQ4MY

https://github.com/jacking75/NewbieGameServerProgrammerLearningMaterials/blob/main/Tailscale.md

 

NewbieGameServerProgrammerLearningMaterials/Tailscale.md at main · jacking75/NewbieGameServerProgrammerLearningMaterials

๋‰ด๋น„ ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ํ•™์Šต ์ž๋ฃŒ. Contribute to jacking75/NewbieGameServerProgrammerLearningMaterials development by creating an account on GitHub.

github.com

https://cwpack0730.tistory.com/117

 

[NGINX] nginx reverse proxy

1. ๊ฐœ์š”ํ˜„์žฌ ๋งค ์›”๋งˆ๋‹ค ์„œ๋น„์Šค ์ •๊ธฐ์ ๊ฒ€์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๋ณดํ†ต ์ƒˆ๋ฒฝ์‹œ๊ฐ„๋Œ€์— ์ ๊ฒ€์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์ด ๋•Œ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ์ ๊ฒ€์ค‘์ธ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์ ๊ฒ€ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ

cwpack0730.tistory.com