일상 코딩
[윈도우 개발 환경 설정] 14편: 통합 Docker Compose & 최종 점검 (시리즈 완결) 본문
[윈도우 개발 환경 설정] 14편: 통합 Docker Compose & 최종 점검 (시리즈 완결)
polarcompass 2026. 3. 31. 22:31Now I have all the information needed. Let me write the comprehensive 14편.
14편: 통합 Docker Compose & 최종 점검 (시리즈 완결)
시리즈: 윈도우 네이티브 개발 환경에서 리눅스 서버 배포까지
드디어 시리즈의 마지막 편입니다. 1편에서 윈도우 터미널을 설치하고, 12편까지 개발 도구와 컨테이너를 하나씩 세팅해 왔습니다. 13편에서 클라우드를 선택했으니, 이제 모든 서비스를 하나의
docker-compose.yml로 통합하고 리눅스 프로덕션 서버에서 전체 스택을 기동하겠습니다.
1. 최종 프로젝트 폴더 구조
먼저 리눅스 서버에 배포할 프로젝트의 전체 디렉터리 구조를 확인합니다. 로컬(윈도우)에서 작업한 소스를 Git으로 서버에 클론한 뒤, 아래 구조를 기준으로 운영합니다.
my-project/
├── docker-compose.yml # 통합 컴포즈 파일
├── .env # 환경변수 (Git에 커밋하지 않음)
├── .env.example # 환경변수 템플릿 (Git에 커밋)
├── Caddyfile # Caddy 설정 파일
│
├── frontend/ # React SPA 소스
│ ├── src/
│ ├── public/
│ ├── package.json
│ ├── vite.config.ts
│ └── Dockerfile # 프론트엔드 빌드용 Dockerfile
│
├── backend-go/ # Go + Gin 소스
│ ├── main.go
│ ├── go.mod
│ ├── go.sum
│ └── Dockerfile # Go 빌드용 Dockerfile
│
├── backend-python/ # Python + FastAPI 소스
│ ├── main.py
│ ├── requirements.txt
│ └── Dockerfile # FastAPI 빌드용 Dockerfile
│
├── caddy/
│ └── data/ # Caddy TLS 인증서 저장 (볼륨 마운트)
│
├── postgres/
│ └── data/ # PostgreSQL 데이터 (볼륨 마운트)
│
├── minio/
│ └── data/ # MinIO 오브젝트 데이터 (볼륨 마운트)
│
└── n8n/
└── data/ # n8n 워크플로우 데이터 (볼륨 마운트)
핵심 원칙은 다음과 같습니다. 컨테이너의 영속 데이터는 모두 프로젝트 하위의 named volume 또는 bind mount로 관리합니다. .env 파일에 민감 정보를 모아두고 Git에는 .env.example만 커밋합니다. 각 백엔드 서비스는 자체 Dockerfile로 이미지를 빌드합니다.
2. 환경변수 관리 (.env)
.env.example 파일을 먼저 작성하고, 서버에서 복사하여 .env로 실제 값을 채웁니다.
# .env.example — 이 파일을 복사하여 .env로 만들고 실제 값을 채우세요.
# ─── 도메인 ───
DOMAIN=example.com
# ─── PostgreSQL ───
POSTGRES_USER=myuser
POSTGRES_PASSWORD=CHANGE_ME_postgres_password
POSTGRES_DB=mydb
# ─── MinIO ───
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=CHANGE_ME_minio_password
# ─── n8n ───
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=CHANGE_ME_n8n_password
N8N_ENCRYPTION_KEY=CHANGE_ME_random_32_char_string
WEBHOOK_URL=https://n8n.example.com/
# ─── Go Gin ───
GIN_MODE=release
DATABASE_URL=postgres://myuser:CHANGE_ME_postgres_password@postgres:5432/mydb?sslmode=disable
# ─── FastAPI ───
FASTAPI_DATABASE_URL=postgresql://myuser:CHANGE_ME_postgres_password@postgres:5432/mydb
서버에서 .env를 생성하는 방법은 다음과 같습니다.
cp .env.example .env
nano .env # 실제 비밀번호와 도메인 입력
.gitignore에 .env를 반드시 추가해야 합니다.
# .gitignore
.env
postgres/data/
minio/data/
n8n/data/
caddy/data/
3. 각 서비스 Dockerfile
3-1. 프론트엔드 (React SPA 빌드)
React SPA는 빌드 결과물(정적 파일)만 Caddy에 넘기면 됩니다. 멀티스테이지 빌드로 Node.js에서 빌드하고, 최종 이미지에는 빌드 결과물만 남깁니다. 이 이미지 자체를 서빙하지 않고, 빌드된 파일을 Caddy 컨테이너와 공유 볼륨으로 전달합니다.
# frontend/Dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# 빌드 결과물만 가벼운 이미지에 복사
FROM alpine:3.21
COPY --from=builder /app/dist /frontend-dist
# 이 컨테이너는 실행할 프로세스가 없으므로,
# docker compose에서 볼륨 복사 용도로만 사용
CMD ["echo", "Frontend build complete"]
3-2. Go + Gin 백엔드
# backend-go/Dockerfile
FROM golang:1.24-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
FROM alpine:3.21
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
3-3. Python + FastAPI 백엔드
# backend-python/Dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
4. Caddyfile (프로덕션)
Caddy는 도메인을 지정하면 Let's Encrypt 인증서를 자동으로 발급하고 갱신합니다. 별도의 certbot 설정이 필요 없습니다. 아래 Caddyfile은 하나의 도메인에서 React SPA 정적 서빙 + Go Gin API + FastAPI API + n8n + MinIO Console을 모두 서브도메인 또는 경로로 라우팅하는 프로덕션 설정입니다.
# Caddyfile
# ─── 메인 도메인: React SPA + API 라우팅 ───
{$DOMAIN} {
# React SPA 정적 파일 서빙
root * /srv/frontend
encode gzip
# /api/go/* → Go Gin 백엔드
handle_path /api/go/* {
reverse_proxy backend-go:8080
}
# /api/py/* → FastAPI 백엔드
handle_path /api/py/* {
reverse_proxy backend-python:8000
}
# 나머지 모든 요청 → React SPA (클라이언트 라우팅 지원)
handle {
try_files {path} /index.html
file_server
}
}
# ─── n8n 서브도메인 ───
n8n.{$DOMAIN} {
reverse_proxy n8n:5678
}
# ─── MinIO API (S3 호환) ───
s3.{$DOMAIN} {
reverse_proxy minio:9000
}
# ─── MinIO Console ───
minio.{$DOMAIN} {
reverse_proxy minio:9001
}
이 Caddyfile에서 {$DOMAIN}은 환경변수를 참조합니다. Docker Compose에서 .env의 DOMAIN 값이 자동으로 주입됩니다.
Caddy의 자동 HTTPS가 정상 작동하려면 서버의 80번과 443번 포트가 외부에서 접근 가능해야 하고, DNS에 example.com, n8n.example.com, s3.example.com, minio.example.com 모두 서버 IP를 가리키는 A 레코드가 설정되어 있어야 합니다.
5. 통합 docker-compose.yml
이제 모든 서비스를 하나로 합칩니다. 이 파일은 리눅스 프로덕션 서버에서 실행하는 것을 전제로 합니다.
# docker-compose.yml
services:
# ──────────────────────────────────────────────
# PostgreSQL
# ──────────────────────────────────────────────
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- internal
# ──────────────────────────────────────────────
# MinIO (오브젝트 스토리지)
# ──────────────────────────────────────────────
minio:
image: minio/minio:latest
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 10s
timeout: 5s
retries: 5
networks:
- internal
# ──────────────────────────────────────────────
# n8n (워크플로우 자동화)
# ──────────────────────────────────────────────
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- WEBHOOK_URL=${WEBHOOK_URL}
- N8N_HOST=n8n.${DOMAIN}
- N8N_PROTOCOL=https
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- internal
# ──────────────────────────────────────────────
# 프론트엔드 빌드 (초기 1회만 실행)
# ──────────────────────────────────────────────
frontend-builder:
build:
context: ./frontend
dockerfile: Dockerfile
volumes:
- frontend_dist:/frontend-dist
# 빌드 완료 후 종료되는 일회성 컨테이너
restart: "no"
# ──────────────────────────────────────────────
# Go + Gin 백엔드
# ──────────────────────────────────────────────
backend-go:
build:
context: ./backend-go
dockerfile: Dockerfile
restart: unless-stopped
environment:
GIN_MODE: ${GIN_MODE}
DATABASE_URL: ${DATABASE_URL}
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
networks:
- internal
# ──────────────────────────────────────────────
# Python + FastAPI 백엔드
# ──────────────────────────────────────────────
backend-python:
build:
context: ./backend-python
dockerfile: Dockerfile
restart: unless-stopped
environment:
DATABASE_URL: ${FASTAPI_DATABASE_URL}
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
interval: 10s
timeout: 5s
retries: 3
networks:
- internal
# ──────────────────────────────────────────────
# Caddy (웹 서버 / 리버스 프록시 / 자동 HTTPS)
# ──────────────────────────────────────────────
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3 (QUIC)
environment:
DOMAIN: ${DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data # TLS 인증서 저장
- caddy_config:/config
- frontend_dist:/srv/frontend:ro # React 빌드 결과물
depends_on:
- frontend-builder
- backend-go
- backend-python
- n8n
- minio
networks:
- internal
# ──────────────────────────────────────────────
# 네트워크
# ──────────────────────────────────────────────
networks:
internal:
driver: bridge
# ──────────────────────────────────────────────
# 볼륨
# ──────────────────────────────────────────────
volumes:
postgres_data:
minio_data:
n8n_data:
frontend_dist:
caddy_data:
caddy_config:
5-1. 구성 해설
네트워크: 모든 컨테이너가 internal 브리지 네트워크를 공유합니다. 컨테이너 간 통신은 서비스 이름(예: postgres, backend-go)으로 이루어집니다. 외부에 노출되는 포트는 Caddy의 80/443뿐입니다.
볼륨: PostgreSQL, MinIO, n8n의 데이터와 Caddy의 TLS 인증서는 named volume으로 영속화합니다. frontend_dist 볼륨은 빌더 컨테이너가 React 빌드 결과물을 넣으면 Caddy 컨테이너가 읽기 전용으로 마운트하는 구조입니다.
헬스체크: PostgreSQL은 pg_isready, MinIO는 mc ready local, Go/FastAPI는 /health 엔드포인트를 체크합니다. n8n과 백엔드 서비스는 depends_on에서 PostgreSQL의 service_healthy 조건을 사용해 DB가 준비된 후에야 기동합니다.
frontend-builder: restart: "no"로 설정되어 있어 빌드가 끝나면 종료됩니다. 프론트엔드 소스를 수정한 후에는 docker compose build frontend-builder && docker compose up frontend-builder 로 다시 빌드하면 됩니다.
6. 서버 초기 세팅 & 배포
리눅스 서버(Ubuntu 22.04 이상 기준)에서 최초 배포하는 과정입니다. 13편에서 선택한 클라우드에 서버를 생성하고 SSH로 접속한 상태를 가정합니다.
6-1. Docker & Docker Compose 설치
# 패키지 업데이트
sudo apt update && sudo apt upgrade -y
# Docker 공식 설치 스크립트
curl -fsSL https://get.docker.com | sudo sh
# 현재 사용자를 docker 그룹에 추가 (sudo 없이 docker 사용)
sudo usermod -aG docker $USER
# 재로그인 후 확인
docker --version
docker compose version
6-2. 방화벽 설정
# UFW로 필요한 포트만 허용
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP (Caddy → HTTPS 리디렉트)
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 443/udp # HTTP/3 (QUIC)
sudo ufw enable
sudo ufw status
6-3. 프로젝트 클론 & 환경변수 설정
# 프로젝트 클론
git clone https://github.com/your-username/my-project.git
cd my-project
# 환경변수 파일 생성
cp .env.example .env
nano .env
# → DOMAIN, 각 비밀번호, ENCRYPTION_KEY 등 실제 값 입력
6-4. DNS 설정
도메인 관리 패널(Cloudflare, Route 53 등)에서 아래 A 레코드를 추가합니다.
A example.com → 서버 IP
A n8n.example.com → 서버 IP
A s3.example.com → 서버 IP
A minio.example.com → 서버 IP
DNS 전파에 수 분에서 수십 분이 걸릴 수 있습니다. ping example.com으로 IP가 올바르게 응답하는지 확인한 후 다음 단계로 진행합니다.
6-5. 전체 스택 기동
# 이미지 빌드 & 컨테이너 기동
docker compose up -d --build
# 로그 확인 (전체)
docker compose logs -f
# 특정 서비스 로그만 보기
docker compose logs -f caddy
docker compose logs -f backend-go
최초 기동 시 Caddy가 Let's Encrypt에서 TLS 인증서를 발급받는 과정이 있으므로, 1~2분 정도 기다린 후 브라우저에서 https://example.com에 접속합니다.
7. 전체 스택 헬스체크
모든 서비스가 정상인지 한 번에 확인합니다.
7-1. 컨테이너 상태 확인
docker compose ps
출력 예시:
NAME STATUS PORTS
my-project-caddy-1 Up (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
my-project-postgres-1 Up (healthy) 5432/tcp
my-project-minio-1 Up (healthy) 9000/tcp, 9001/tcp
my-project-n8n-1 Up 5678/tcp
my-project-backend-go-1 Up (healthy) 8080/tcp
my-project-backend-python-1 Up (healthy) 8000/tcp
my-project-frontend-builder-1 Exited (0)
frontend-builder가 Exited (0)인 것은 정상입니다. 빌드가 성공적으로 완료되었다는 뜻입니다. 나머지 서비스는 모두 Up 또는 Up (healthy) 상태여야 합니다.
7-2. 각 엔드포인트 접속 테스트
서버 터미널에서 curl로 각 엔드포인트를 확인합니다.
# React SPA (메인 페이지)
curl -s -o /dev/null -w "%{http_code}" https://example.com
# 기대값: 200
# Go Gin API 헬스체크
curl -s https://example.com/api/go/health
# 기대값: {"status":"ok"}
# FastAPI 헬스체크
curl -s https://example.com/api/py/health
# 기대값: {"status":"ok"}
# n8n 대시보드
curl -s -o /dev/null -w "%{http_code}" https://n8n.example.com
# 기대값: 200 또는 302 (로그인 리디렉트)
# MinIO Console
curl -s -o /dev/null -w "%{http_code}" https://minio.example.com
# 기대값: 200 또는 302
# MinIO S3 API
curl -s -o /dev/null -w "%{http_code}" https://s3.example.com/minio/health/live
# 기대값: 200
7-3. PostgreSQL 접속 테스트
docker compose exec postgres psql -U myuser -d mydb -c "SELECT 1;"
1이 반환되면 정상입니다.
7-4. TLS 인증서 확인
curl -vI https://example.com 2>&1 | grep -E "subject:|issuer:|expire"
issuer: ... Let's Encrypt가 표시되면 자동 HTTPS가 정상 작동하는 것입니다.
8. 운영 팁
8-1. 프론트엔드 업데이트 시
로컬에서 React 소스를 수정하고 Git push한 뒤, 서버에서 다음 명령을 실행합니다.
git pull
docker compose build frontend-builder
docker compose up frontend-builder
# Caddy가 자동으로 새 빌드 결과물을 서빙 (볼륨 공유)
# Caddy 재시작이 필요하면:
docker compose restart caddy
8-2. 백엔드 업데이트 시
git pull
docker compose up -d --build backend-go backend-python
--build 플래그가 있으면 Dockerfile을 다시 빌드하고, -d로 백그라운드 실행합니다. Caddy가 리버스 프록시하고 있으므로 별도 설정 변경 없이 새 컨테이너로 트래픽이 전환됩니다.
8-3. 데이터 백업
# PostgreSQL 덤프
docker compose exec postgres pg_dump -U myuser mydb > backup_$(date +%Y%m%d).sql
# MinIO 데이터는 볼륨 또는 mc mirror 명령으로 백업
docker run --rm -v my-project_minio_data:/data -v $(pwd):/backup \
alpine tar czf /backup/minio_backup_$(date +%Y%m%d).tar.gz /data
8-4. 전체 스택 중지 & 재시작
# 중지 (데이터 유지)
docker compose down
# 재시작
docker compose up -d
# 볼륨까지 삭제 (⚠️ 데이터 완전 삭제)
docker compose down -v
8-5. 로그 관리
프로덕션에서는 로그가 디스크를 가득 채우지 않도록 Docker 로그 드라이버를 설정합니다. /etc/docker/daemon.json에 다음을 추가합니다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
설정 후 Docker를 재시작합니다.
sudo systemctl restart docker
9. 최종 아키텍처 다이어그램
전체 스택의 트래픽 흐름을 정리하면 다음과 같습니다.
┌─── 인터넷 ───┐
│ 사용자 브라우저 │
└──────┬───────┘
│ HTTPS (443)
┌──────▼───────┐
│ Caddy │ ← 자동 TLS, HTTP/3
│ (리버스 프록시) │
└──┬───┬───┬───┘
┌──────────┤ │ ├──────────┐
│ │ │ │ │
┌──────▼──┐ ┌───▼───▼┐ ┌▼────────┐ ┌──────────┐
│ React │ │ Go Gin │ │ FastAPI │ │ n8n │
│ SPA │ │ :8080 │ │ :8000 │ │ :5678 │
│(정적파일)│ └───┬────┘ └──┬──────┘ └────┬─────┘
└─────────┘ │ │ │
┌─────▼──────────▼───────────────▼─────┐
│ PostgreSQL :5432 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│ MinIO :9000 / :9001 │
└──────────────────────────────────────┘
※ 모든 컨테이너는 internal 브리지 네트워크로 연결
※ 외부 노출 포트는 Caddy의 80/443만 해당
10. 최종 확인 체크리스트
배포 후 아래 항목을 하나씩 체크합니다.
-
docker compose ps에서 모든 서비스가Up또는Up (healthy)상태인가 -
https://example.com에서 React SPA가 정상 로드되는가 - React Router의 서브 경로(예:
https://example.com/about)에 직접 접속해도 404가 아닌 SPA가 로드되는가 -
https://example.com/api/go/health가 정상 응답하는가 -
https://example.com/api/py/health가 정상 응답하는가 -
https://n8n.example.com에서 n8n 대시보드에 접속 가능한가 -
https://minio.example.com에서 MinIO Console에 접속 가능한가 - PostgreSQL에
docker compose exec로 쿼리가 실행되는가 - TLS 인증서가 Let's Encrypt로 정상 발급되었는가 (브라우저 자물쇠 아이콘 확인)
-
.env파일이 Git에 커밋되지 않았는가 - 방화벽에서 80, 443 외의 포트는 차단되어 있는가
- Docker 로그 로테이션이 설정되어 있는가
11. 시리즈 회고
14편에 걸쳐 새 윈도우 PC에서 클라우드 배포까지의 전체 여정을 함께 했습니다. 시리즈 전체를 간략히 돌아보겠습니다.
1~3편 (기반 환경) 에서는 Windows Terminal과 PowerShell 7을 설치하고, Winget/Scoop으로 패키지 매니저를 구성했습니다. Git과 GitHub을 연동하고, Google Antigravity(VS Code 포크)를 IDE로 세팅했습니다. WSL 없이 윈도우 네이티브만으로 충분히 쾌적한 개발 환경을 만들 수 있다는 것을 확인한 구간이었습니다.
4~6편 (런타임 & 프레임워크) 에서는 Node.js로 React SPA(TypeScript + Tailwind + Vite + React Router)를, Go로 Gin 웹 서버를, Python으로 FastAPI를 각각 세팅했습니다. 세 가지 언어·프레임워크를 하나의 프로젝트에서 조합하는 풀스택 구조를 잡았습니다.
7~10편 (Docker & 인프라 서비스) 에서는 Docker Desktop을 설치하고, PostgreSQL·MinIO·n8n을 각각 컨테이너로 띄웠습니다. 로컬에서 docker compose로 인프라를 관리하는 워크플로우에 익숙해진 구간이었습니다.
11~12편 (서버 & AI 도구) 에서는 리눅스 서버에 Caddy를 올려 리버스 프록시와 자동 HTTPS를 구성하고, Claude Code CLI를 로컬에 설치해 AI 기반 코딩 워크플로우를 경험했습니다.
13~14편 (배포 & 통합) 에서는 클라우드 선택지를 비교하고, 최종적으로 모든 서비스를 하나의 Docker Compose로 통합하여 프로덕션 서버에 배포했습니다.
이 시리즈의 핵심 메시지는 세 가지입니다. 첫째, WSL 없이도 윈도우에서 충분히 생산적인 개발 환경을 구축할 수 있습니다. PowerShell 7 + Windows Terminal + Docker Desktop 조합은 대부분의 웹 개발 시나리오를 커버합니다. 둘째, Docker Compose 하나로 로컬 개발 환경과 프로덕션 배포를 통일할 수 있습니다. 로컬에서 동작하는 컴포즈 파일을 서버에 그대로 올리면 됩니다. 셋째, Caddy는 소규모 배포에서 Nginx의 훌륭한 대안입니다. 자동 HTTPS, 간결한 설정 파일, 리버스 프록시 기능만으로도 1인 개발자의 프로덕션 요구사항을 충족합니다.
시리즈에서 다루지 못한 주제(CI/CD 파이프라인, 모니터링/알림, 로드 밸런싱, Kubernetes 전환 등)는 프로젝트가 성장하면서 자연스럽게 다음 단계로 이어질 것입니다. 이 시리즈가 그 출발점이 되었기를 바랍니다.
14편에 걸친 긴 여정을 끝까지 읽어주셔서 감사합니다. 즐거운 개발 되세요.
'Windows 개발환경 세팅' 카테고리의 다른 글
| [윈도우/리눅스/맥] OpenClaw가 열어준 시대, Anthropic은 어떻게 대응했나 — Claude Code의 Channels · Remote Control · Dispatch 완전 가이드 (0) | 2026.04.01 |
|---|---|
| [윈도우 개발 환경 설정] 13편: 클라우드 서버 비교 & 선택 가이드 (1) | 2026.03.31 |
| [윈도우 개발 환경 설정] 12편: Claude Code 설치 & 활용 (0) | 2026.03.31 |
| [윈도우 개발 환경 설정] 11편: Caddy 웹 서버 & 리버스 프록시 (리눅스 서버 기준) (0) | 2026.03.31 |
| [윈도우 개발 환경 설정] 10편: n8n 워크플로우 자동화 설정 (0) | 2026.03.31 |