✔️ 오늘은 여러분의 서랍 속에 잠자고 있던 '옛 스마트폰'을 활용해서 홈페이지, 블로그, n8n 서버 등으로 다양하게 활용가능한, '나만의 홈서버'를 만드는 방법을 준비했습니다 📱
전문가가 아니어도, 코딩을 몰라도 괜찮습니다! '바이브코딩'을 통해, 누구나 쉽게 따라 할 수 있도록 자세히 알려드리겠습니다.
도메인 검색 및 구매 (cloudflare에서 도메인을 구매하지 않고 타사에서 구매한 경우는 Skip 하세요)
타사 도메인 등록 (Cloudflare 도메인 구입한 경우 Skip 하세요)
도메인 연결 선택
Free 요금제 선택
활성화 진행
타사 도메인 입력
타사 네임서버 정보 삭제 / cloudflare 네임서버 확인
타사로 접속하여 네임서버를 cloudflare로 변경
(여기서는 ‘Gabia.com’)
포트폴리오 웹사이트 바이브 코딩 및 호스팅하기
❗
이번 바이브 코딩은 안드로이드의 리눅스에 Ubuntu 22 배포판을 Proot-distro 방식으로 설치한 환경에서 root 계정으로 진행하게 됩니다.
완전한 우분투 환경이 아닌 컨테이너 방식으로, 제약사항들이 있습니다.
Docker 는 지원되지 않고, servicectl이나 ps 같은 프로세스 명령어들이 동작하지 않는 점이 있습니다.
claude code에 이런 환경적인 부분을 컨텍스트에 제공하면 서버 설정과 코딩을 더 수월하게 하실수 있습니다.
제가 수차례 테스트한 프롬프트이지만, LLM의 특성상 ‘의외성’과 ‘무작위성’이 있어 결과가 달라질수 있습니다.
만약 바이브코딩으로 설정이 실패한다면,
중고급자 분들은 발생하는 에러를 컨텍스트에 추가하면서 수정하시는 것을 추천드리고,
초급자 분들은 모두 지우고 처음부터 다시 하시는것을 추천드립니다.
VSCode 서버 접속 / 컨텍스트 문서 준비
vscode서버를 내부망 IP주소로 접속 (예시 : http://192.168.219.117:8080 여러분은 주소가 다릅니다)
접속한뒤에 컨텍스트 파일을 ref 폴더를 만들어 하나씩 저장합니다.
prompt.md (각자에 맞게 내용을 수정하세요, Figma 템플릿 주소를 수정하셔야 합니다.)
# 생성 요청 프롬프트 (강화버전)
## 1) 역할 / 페르소나
당신은 개인 포트폴리오 웹사이트 제작 전문 개발자이다. 다음 MCP 도구를 활용해서 맥락을 파악하여 포트폴리오 웹사이트를 완성해야한다.
## 2) 목표 / 의도
* Figma 참고 포트폴리오 웹사이트 디자인 템플릿을 기반으로 개인 포트폴리오 웹사이트를 구축한다.
* 디자인 → 구조 → 콘텐츠 삽입 → 테스트 → 배포의 일관된 워크플로우를 따른다.
* 사용자가 제공하는 1)포트폴리오 웹사이트 템플릿 컨텍스트와 2)개인 스펙 문서를 기반으로 개별 맞춤 콘텐츠를 반영한다.
## 3) 배경정보
* 템플릿 프로젝트 : https://www.figma.com/design/fzR2M4whnQv4KdKIiE6Bdx/Picto---Personal-Portfolio-Free-Template--Community---Community-
* 개인 스펙 문서 : /root/vibe-portfolio/ref/my-info.md 파일에 저장되어 있다.
* 이메일 전송 코드 스니펫 : /root/vibe-portfolio/ref/resend-example.md
## 4) 사용해야할 MCP도구
* Context7: Vite + React.js, Node.js의 최신 문법과 사용 예제 들을 확인한다.
* SequentialThinking: 전체 절차를 단계별로 계획하고, 각 단계가 다음 단계로 이어지도록 한다.
* Pexels: 필요한 이미지를 조회하고 다운로드하고 ./public/images에 저장하고 웹페이지에 연결한다.
* Playwright: 생성된 웹사이트를 브라우저 테스트하고 브라우저 동작을 시뮬레이션한다.
* FigmaDev: 피그마 디자인 문서를 조회하여 웹사이트의 기본 구조와 스타일 가이드를 제공한다. 단, 피그마 디자인 문서의 크기가 허용치 초과시, 하위 노드들을 조회하고 하위 노드를 하나씩 조회하여 전체 구조와 디자인, 색상 및 폰트 테마를 파악한다.
* ssh / scp : 원격 서버로 코드를 배포 및 스크립트 실행 등의 작업을 한다.
## 5) 기술 스택 및 아키텍처 (중요)
### 프로젝트 구조
```
├── public/
│ └── images/ # 이미지 파일 (Pexels에서 다운로드)
├── src/
│ ├── components/ # React 컴포넌트
│ ├── content.json # 한글 콘텐츠 관리
│ ├── App.jsx
│ ├── main.jsx
│ └── index.css
├── server.js # Express 서버 (ES6 모듈 사용)
├── vite.config.js # Vite 설정
├── package.json
└── .env # 환경 변수 (RESEND_API_KEY, PORT)
```
### 핵심 기술 선택
* **프론트엔드**: React 19 + Vite
* **백엔드**: Node.js Express (ES6 모듈 - `"type": "module"` 필수)
* **빌드 도구**: Vite
* **이메일 서비스**: Resend.com API
### package.json 필수 설정
```json
{
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"server": "node server.js",
"start": "npm run server"
}
}
```
## 6) 중요 구현 지침 (시행착오 방지)
### 6.1) Express 서버 구현 시 주의사항
#### ✅ 올바른 라우트 순서 (매우 중요!)
```javascript
import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import { Resend } from 'resend';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
dotenv.config();
const app = express();
const resend = new Resend(process.env.RESEND_API_KEY);
app.use(cors());
app.use(express.json());
// 1. API 라우트를 먼저 정의 (중요!)
app.post('/api/send-email', async (req, res) => {
// 이메일 전송 로직
});
// 2. 정적 파일 서빙은 API 라우트 다음에 (순서 중요!)
app.use(express.static(path.join(__dirname, 'dist')));
// 3. Express 5에서는 와일드카드 라우트 사용 안함
// app.get('*', ...) 또는 app.get('/*', ...) 사용하지 말 것
const PORT = process.env.PORT || 5001; // 5000번 포트는 macOS에서 충돌 가능
```
### 6.2) Vite 프록시 설정
```javascript
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
server: {
port: 3001, // 3000번 대신 3001 사용
proxy: {
'/api': {
target: 'http://localhost:5001', // Express 서버 포트와 일치
changeOrigin: true,
},
},
},
});
```
### 6.3) 환경 변수 설정
```env
RESEND_API_KEY=your_actual_api_key_here
PORT=5001
```
### 6.4) 이미지 경로 설정
* Pexels 이미지는 `/public/images/` 디렉토리에 저장
* React 컴포넌트에서 참조 시: `<img src="/images/filename.jpg" />`
* CSS에서 참조 시: `url('/images/filename.jpg')`
### 6.5) API 호출 시 주의사항
```javascript
// Contact.jsx에서 이메일 전송
const handleSubmit = async (e) => {
e.preventDefault();
try {
const response = await fetch('/api/send-email', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
const data = await response.json();
if (data.success) {
// 성공 처리
} else {
// 실패 처리
}
} catch (error) {
console.error('Email send error:', error);
}
};
```
## 7) 출력형식 및 제약조건
* 단계적 접근: SequentialThinking 도구로 각 단계별 액션을 계획하고 실행한다.
* 1단계) 피그마 웹페이지디자인의 구조, 스타일, 테마, 폰트, 색상 등을 먼저 정리해서 design.md 에 저장한다.
* 2단계) Vite + React 프로젝트를 생성하고 Express 서버를 설정한다.
* 3단계) 컴포넌트별로 하나씩 구현하며 content.json에서 한글 콘텐츠를 관리한다.
* 4단계) 정적파일과 이미지를 생성하고, 컴포넌트에 내용을 연결한다.
* 5단계) 기능과 디자인을 점검 테스트한다 (특히 이메일 전송 기능).
* 6단계) 프로젝트를 빌드한다 (`npm run build`).
* 7단계) README.md 파일을 만들어서 프로젝트 명세를 작성한다.
* 8단계) 원격서버에 프로젝트를 복사(배포) 하고, 프로덕션을 위해 서버(3001번 포트)를 가동한다.
* 9단계) cloudflare 터널링을 사용해서 정해진 주소로 웹사이트 페이지를 외부로 노출한다.
* 사용 기술:
- Frontend: React + Vite
- Backend: Node.js Express (ES6 모듈)
- Email: Resend.com API
* 페이지 구성 지침: 1페이지를 여러 섹션으로 나누고 Nav바에서 선택된 항목에 해당하는 섹션으로 자동 스크롤로 구성한다.
* 정적 내용 관리지침: 정적 내용 (카피, 제목, 아티클)은 모두 한글로 작성되어야 하며, content.json 파일 하나에서 관리한다.
* 템플릿 일관성: 템플릿 코드의 수정하여 개발함으로서 디자인과 구조의 일관성을 유지한다. 개인스펙문서에 없는 정보의 템플릿 섹션은 제거한다. 템플릿에 있는 예시 이미지(인물사진 등)은 모두 Pexels에서 가져온 이미지로 교체한다.
* 폰트 및 테마:
- 테마는 템플릿의 정보를 유지
- 한글 폰트는 '나눔스퀘어' 사용
- CSS에서: `@import url('https://hangeul.pstatic.net/hangeul_static/css/nanum-square.css');`
- font-family: `'Nanum Square', sans-serif;`
* 정확성: 개인스펙문서의 정보는 그대로 반영해야 한다.
* 검증 완료: Playwright 도구 테스트에서 오류가 없는 상태로 마무리한다. Playwright로 인터랙티브 동작으로 기능 구현을 확인하고, 스크린샷을 찍어서 화면 상태와 UI을 확인한다.
## 8) 세부기능
### 이메일 전송 기능
* Resend.com 라이브러리를 활용해서 서버사이드에 구축한다.
* 수신 이메일 주소는 개인스펙문서의 이메일 또는 사용자가 지정한 주소를 사용한다.
* 발신자는 'Portfolio Contact <onboarding@resend.dev>' 형식을 사용한다.
* 한글 제목과 내용을 지원해야 한다.
## 9) 테스트 체크리스트
개발 완료 전 다음 사항을 반드시 확인:
- [ ] React 개발 서버가 3001 포트에서 정상 작동
- [ ] Express 서버가 5001 포트에서 정상 작동
- [ ] 이메일 전송 API가 정상 작동 (`/api/send-email`)
- [ ] 모든 이미지가 정상적으로 로드됨
- [ ] 네비게이션 스크롤이 부드럽게 작동
- [ ] 반응형 디자인이 모바일/태블릿/데스크톱에서 정상 작동
- [ ] 빌드된 프로덕션 버전이 정상 작동
## 10) Cloudflare
## 11) 자주 발생하는 문제와 해결책
### 문제 1: API 엔드포인트가 HTML을 반환
**원인**: Express에서 정적 파일 서빙이 API 라우트보다 먼저 처리됨
**해결**: API 라우트를 정적 파일 서빙보다 먼저 정의
### 문제 2: Express 5 와일드카드 라우트 에러
**원인**: Express 5에서 `app.get('*')` 구문 변경
**해결**: 와일드카드 라우트 제거, 정적 파일 서빙만 사용
### 문제 3: ES6 모듈 import 에러
**원인**: package.json에 `"type": "module"` 누락
**해결**: package.json에 `"type": "module"` 추가
### 문제 4: __dirname is not defined 에러
**원인**: ES6 모듈에서 __dirname 사용 불가
**해결**: `import.meta.url`과 `fileURLToPath` 사용
my-info.md (각자에 맞게 내용을 수정하세요, 개인 스펙 문서 정보를 수정해주셔야합니다.)
## 1. 기본 정보
* **이름**: 김준서 (Junseo Kim)
* **닉네임 / 작명**: digitmarketer
* **프로필 사진 URL**: `pexels에서 샘플이미지로 대체`
* **간단한 소개**:
데이터 기반 마케팅 전략과 디지털 캠페인 자동화에 특화된 디지털마케터. 최신 AI·데이터 분석 기술을 활용해 브랜드 성장과 고객 경험 혁신을 이끌어냅니다. 다양한 산업군에서 실전 마케팅 프로젝트를 리딩하며, 성과 중심의 데이터 마케팅 솔루션을 제공합니다.
---
## 2. 연락처 정보
* **이메일**: `datapod.k@gmail.com`
* **전화번호**: `+82-10-9876-5432`
* **Youtube** : [https://www.youtube.com/@junseo-marketing](https://www.youtube.com/@junseo-marketing)
* **Homepage** : [https://junseo-marketing.com](https://junseo-marketing.com)
* **LinkedIn**: [www.linkedin.com/in/junseo-kim-marketing](www.linkedin.com/in/junseo-kim-marketing)
* **개인 블로그**: [junseo-marketing.dev](https://junseo-marketing.dev)
---
## 3. 경력 / 경험
* **현재 직무**: 디지털마케팅 컨설턴트 / 데이터 기반 마케팅 자동화 전문가
* **경력 요약**:
10년 이상 디지털 마케팅, 데이터 분석, AI 기반 마케팅 자동화 프로젝트를 리딩. 이커머스, 플랫폼, B2B/B2C 등 다양한 산업에서 마케팅 전략 수립과 실행 경험 보유. 데이터 기반 퍼포먼스 마케팅, 고객 여정 분석, 마케팅 자동화 시스템 구축에 강점.
* **주요 경력**:
* **2024–현재**: 데이터마케팅랩 – 디지털마케팅 컨설팅 및 자동화 솔루션 개발
* **2022–2023**: 넥스트커머스 – 데이터 기반 마케팅 전략 및 캠페인 운영
* **2021–2022**: 테크솔루션즈 – AI 기반 고객 데이터 분석 및 마케팅 솔루션 개발
* **2019–2021**: 그린라이프 그룹 – 이커머스 마케팅 데이터 분석 및 최적화
* **2017–2019**: 푸드테크 그룹 – 브랜드 마케팅 데이터 분석 및 캠페인 기획
---
## 4. 학력
* **대학교**: 서울디지털대학교 디지털마케팅학과 (B.S. in Digital Marketing, 2017 졸업)
---
## 5. 기술 스택
* **마케팅 툴**: Google Analytics, Tableau, Power BI, Salesforce Marketing Cloud, HubSpot, Braze, Google Ads, Facebook Ads Manager
* **데이터 분석/엔지니어링**: Python, SQL, BigQuery, AWS Redshift, PySpark, ElasticSearch
* **마케팅 자동화/AI**: MCP 기반 마케팅 자동화, AI 추천 시스템, 퍼널 분석, 텍스트 마이닝, AARRR 프레임워크
* **기타**: Docker, GitHub Actions, Figma
---
## 6. 프로젝트
* **프로젝트명**: 스마트 마케팅 자동화 플랫폼
* **설명**: 고객 행동 데이터 분석을 통한 맞춤형 마케팅 자동화 플랫폼 구축
* **역할**: 프로젝트 리딩, 데이터 분석, 마케팅 자동화 설계 및 실행
* **기술**: Python, BigQuery, Salesforce Marketing Cloud, MCP
* **프로젝트명**: 실시간 캠페인 성과 분석 시스템
* **설명**: 실시간 광고 성과 및 고객 여정 시각화 대시보드 개발
* **역할**: 데이터 파이프라인 설계, 대시보드 구축, 마케팅 인사이트 도출
* **기술**: SQL, Tableau, Google Analytics, Python
---
## 7. 수상 및 자격증
* **2021**: 디지털 마케팅 혁신 컨퍼런스 – 최우수상 (AI 기반 마케팅 자동화 솔루션 개발)
* **2018**: Google Analytics Individual Qualification (GAIQ)
* **2017**: ADsP 데이터분석준전문가
---
## 8. 기타 개인화 요소
* **취미 / 관심사**: 디지털 아트, 마케팅 트렌드 연구, 여행, AI 기반 마케팅 실험
* **개인 모토**: "데이터는 최고의 마케터다."
---
> 참고: 김준서의 경력 및 전문성은 [공식 프로필](https://junseo-marketing.com/profile/)을 참고하세요.
[출처: https://junseo-marketing.com/profile/]
resend-example.md (각자에 맞게 내용을 수정하세요. API키를 수정하셔야 합니다.)
```javascript
import { Resend } from 'resend';
const resend = new Resend('re_4iHAn8qM_LUkjctQjoQmcGLsvEKkkRFqQ');
resend.emails.send({
from: 'onboarding@resend.dev',
to: 'datapod.k@gmail.com',
subject: 'Hello World',
html: '<p>Congrats on sending your <strong>first email</strong>!</p>'
});
```
cloudflare.md (각자에 맞게 내용을 수정하세요. 도메인 주소와 터널명을 수정하셔야 합니다.)
# Cloudflare 터널링 가이드
## 1. 패키지 관리자 업데이트
`apt update && apt upgrade -y`
## 2. cloudflare 공식 저장소 및 GPG키 추가
```bash
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
```
## 3. 패키지 리스트 갱신 및 cloudflare 설치
`apt update && apt install cloudflared`
## 4. cloudflare 임시 터널링
`cloudflared tunnel --url http://localhost:5001 2>&1 &`
## 5. cloudflare 계정 연동 및 인증 (인증 페이지 링크 제시 후 cloudflare 계정 로그인 유도)
`cloudflared tunnel login`
## 6. cloudflare 터널 생성
`cloudflared tunnel create dante-phone-tunnel` # <<< 터널이름 변경하세요
## 7. cloudflare 터널 설정
`cat > /root/.cloudflared/config.yml`
```yaml
############ 아래 내용을 복사해서 붙여넣으세요 ###########
tunnel: xxxxx-xxxxx-xxxxx-xxxxx-xxxxxxxx # 터널ID
credentials-file: /root/.cloudflared/xxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx.json # 터널ID.json
ingress:
- hostname: n8n.dante-labs.com # <<< 주소 변경하세요
service http://localhost:5679
- hostname: portfolio.dante-labs.com # <<< 주소 변경하세요
service http://localhost:5001
- service http_status:404
############ 위 내용을 복사해서 붙여넣으세요 ###########
(Ctrl+C를 눌러 편집 종료)
```
## 8. DNS 연결
```bash
cloudflared tunnel route dns dante-phone-tunnel n8n.dante-labs.com # <<< 서브 도메인 주소 및 터널명을 변경하세요
cloudflared tunnel route dns dante-phone-tunnel portfolio.dante-labs.com # 서브 도메인 주소 및 터널명을 변경하세요
## 9. cloudflare 터널 실행
`cloudflared tunnel run`
n8n.md
# n8n + Caddy 리버스 프록시 설정 가이드
이 가이드는 proot-distro Ubuntu 22.04 환경에서 n8n을 설치하고 Caddy를 사용하여 포트 5678에서 실행되는 n8n을 포트 5679로 리버스프록시하는 방법을 설명합니다.
## 전제조건
- proot-distro Ubuntu 22.04 환경
- Node.js 및 npm 설치
- 기본적인 Linux 명령어 사용 능력
## 1. 시스템 업데이트 및 필수 패키지 설치
```bash
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# curl 설치 (Caddy 설치에 필요)
sudo apt install -y curl
# Node.js 및 npm 설치 (n8n용)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
```
## 2. n8n 설치
```bash
# n8n 전역 설치
npm install -g n8n
# 설치 확인
n8n --version
```
## 3. Caddy 설치
```bash
# Caddy GPG 키 추가
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Caddy 리포지토리 추가
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# 패키지 리스트 업데이트 및 Caddy 설치
sudo apt update
sudo apt install caddy -y
# Caddy 서비스 상태 확인
sudo systemctl status caddy
```
## 4. Caddy 설정 (리버스 프록시)
Caddy 설정 파일을 생성하여 n8n의 포트 5678을 5679로 리버스프록시합니다.
```bash
# Caddy 설정 파일 생성
sudo tee /etc/caddy/Caddyfile > /dev/null <<EOF
# n8n 리버스 프록시 설정
:5679 {
# localhost:5678로 리버스 프록시
reverse_proxy localhost:5678 {
# WebSocket 지원 (n8n에서 필요)
header_up Upgrade {>Upgrade}
header_up Connection {>Connection}
}
# 보안 헤더 추가
header {
# XSS 보호
X-Frame-Options "SAMEORIGIN"
# MIME 타입 스니핑 방지
X-Content-Type-Options "nosniff"
# Clickjacking 방지
X-Frame-Options "DENY"
}
# 로그 설정
log {
output file /var/log/caddy/n8n.log
format json
}
}
EOF
```
## 5. Caddy 서비스 재시작
```bash
# 설정 검증
sudo caddy validate --config /etc/caddy/Caddyfile
# Caddy 서비스 재시작
sudo systemctl restart caddy
# 서비스 상태 확인
sudo systemctl status caddy
```
## 6. n8n 실행 스크립트
n8n을 백그라운드에서 실행하는 스크립트를 생성합니다.
```bash
# n8n 실행 스크립트 생성
cat > ~/start-n8n.sh << 'EOF'
#!/bin/bash
# 환경 변수 설정
export WEBHOOK_URL=https://n8n.dante-labs.com
export N8N_HOST=n8n.dante-labs.com
export N8N_PROTOCOL=https
export N8N_PORT=5678
# n8n 백그라운드 실행
echo "Starting n8n on port 5678..."
n8n start &
N8N_PID=$!
echo "n8n started with PID: $N8N_PID"
echo "n8n is accessible at: http://localhost:5678"
echo "Via Caddy reverse proxy: http://localhost:5679"
# 프로세스 종료 대기
wait $N8N_PID
EOF
# 실행 권한 부여
chmod +x ~/start-n8n.sh
```
## 7. 전체 설치 및 실행
### 자동 설치 스크립트
```bash
# 전체 설치 및 설정 자동화 스크립트
cat > ~/setup-n8n-complete.sh << 'EOF'
#!/bin/bash
echo "=== n8n + Caddy Setup Script ==="
# 1. 시스템 업데이트
echo "Step 1: Updating system..."
sudo apt update && sudo apt upgrade -y
# 2. 필수 패키지 설치
echo "Step 2: Installing required packages..."
sudo apt install -y curl
# Node.js 설치
echo "Step 3: Installing Node.js..."
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 3. n8n 설치
echo "Step 4: Installing n8n..."
npm install -g n8n
# 4. Caddy 설치
echo "Step 5: Installing Caddy..."
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -y
# 5. Caddy 설정
echo "Step 6: Configuring Caddy..."
sudo tee /etc/caddy/Caddyfile > /dev/null <<'CADDYEOF'
:5679 {
reverse_proxy localhost:5678 {
header_up Upgrade {>Upgrade}
header_up Connection {>Connection}
}
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
}
log {
output file /var/log/caddy/n8n.log
format json
}
}
CADDYEOF
# 6. Caddy 재시작
echo "Step 7: Restarting Caddy..."
sudo systemctl restart caddy
# 7. n8n 실행 스크립트 생성
echo "Step 8: Creating n8n startup script..."
cat > ~/start-n8n.sh << 'N8NEOF'
#!/bin/bash
export WEBHOOK_URL=https://n8n.dante-labs.com
export N8N_HOST=n8n.dante-labs.com
export N8N_PROTOCOL=https
export N8N_PORT=5678
echo "Starting n8n on port 5678..."
n8n start &
N8N_PID=$!
echo "n8n started with PID: $N8N_PID"
echo "n8n is accessible at: http://localhost:5678"
echo "Via Caddy reverse proxy: http://localhost:5679"
wait $N8N_PID
N8NEOF
chmod +x ~/start-n8n.sh
echo "=== Setup Complete! ==="
echo "To start n8n, run: ~/start-n8n.sh"
echo "Access n8n via: http://localhost:5679"
echo "Direct access: http://localhost:5678"
EOF
# 자동 설치 스크립트 실행 권한 부여
chmod +x ~/setup-n8n-complete.sh
echo "Run the complete setup with: ~/setup-n8n-complete.sh"
```
### 수동 실행
```bash
# n8n 실행 (백그라운드)
~/start-n8n.sh &
# 또는 직접 실행
export WEBHOOK_URL=https://n8n.dante-labs.com
export N8N_HOST=n8n.dante-labs.com
export N8N_PROTOCOL=https
export N8N_PORT=5678
n8n start
```
## 8. 접속 방법
설정이 완료되면 다음 주소로 n8n에 접속할 수 있습니다:
- **Caddy 리버스 프록시**: `http://localhost:5679`
- **직접 접속**: `http://localhost:5678`
## 9. 문제해결
### Caddy 설정 확인
```bash
# Caddy 설정 검증
sudo caddy validate --config /etc/caddy/Caddyfile
# Caddy 로그 확인
sudo tail -f /var/log/caddy/n8n.log
```
### n8n 프로세스 확인
```bash
# n8n 프로세스 확인
ps aux | grep n8n
# 포트 사용 확인
netstat -tlnp | grep :5678
netstat -tlnp | grep :5679
```
### 서비스 재시작
```bash
# Caddy 재시작
sudo systemctl restart caddy
# n8n 재시작 (프로세스 ID 확인 후)
kill -9 <N8N_PID>
~/start-n8n.sh &
```
### 방화벽 설정 (필요시)
```bash
# 포트 5679 허용
sudo ufw allow 5679
# 방화벽 상태 확인
sudo ufw status
```
## 10. 추가 설정 (선택사항)
### HTTPS 활성화
```bash
# Caddyfile에 HTTPS 설정 추가
sudo tee -a /etc/caddy/Caddyfile > /dev/null <<EOF
# HTTPS 설정 (자동 SSL 인증서)
https://n8n.dante-labs.com {
reverse_proxy localhost:5678 {
header_up Upgrade {>Upgrade}
header_up Connection {>Connection}
}
}
EOF
sudo systemctl restart caddy
```
### n8n 추가 설정
```bash
# n8n 설정 파일 생성
mkdir -p ~/.n8n
cat > ~/.n8n/config <<EOF
{
"executions": {
"process": "main",
"timeout": 3600
},
"security": {
"basicAuth": {
"active": true,
"user": "admin",
"password": "your_secure_password"
}
}
}
EOF
```
## 주의사항
- 환경 변수의 도메인 주소는 실제 사용 환경에 맞게 변경하세요
- 프로덕션 환경에서는 보안 설정을 강화하세요
- 정기적으로 백업을 수행하세요
- 로그 파일을 모니터링하여 이상 징후를 확인하세요
바이브코딩 도구 설치
claude code 또는 gemini cli 설치
# Claude Code CLI
npm install -g @anthropic-ai/claude-code
# 또는 Gemini CLI
npm install -g @google/gemini-cli
gemini auth login
I'm Dante, a blogger and full-stack developer (ex-Data Lab Team Leader from a major corp) passionate about making AI, intelligent agents, and MCP concepts easy to understand. I share practical insights, real-world examples, and future outlooks to elevate your tech knowledge.
✔️ "이젠 AI가 알아서 다 해줍니다." 자연어(채팅) 한마디로 '우리 회사 내부 문서' 기반의 RAG 챗봇 시스템을 A to Z까지 자동으로 구축하는 모든 과정을 공개합니다!
LLM의 환각(Hallucination) 증상 때문에 AI 도입을 망설였거나, 사내 데이터를 기반으로 한 전문적인 답변을 원하셨나요? 데이터베이스 생성부터 문서 저장, 챗봇 UI 연동까지, 복잡했던 RAG 시스템 구축을 n8n 에이전트가 전부 대신해 드립니다. 이 영상 하나로, 코딩 지식 없이 나만의 지식 베이스 챗봇을 완성하고 웹사이트에 적용까지 해보세요.
✔️ n8n 에서 Figma를 완전 제어할 수 있는 커스텀 노드 'Figmation' 을 개발했습니다!
디자인 에이전트를 직접 자유자재로 만들수 있도록 설계되었습니다.
이젠 누구나 PPT, 웹UI, 광고판촉물 디자인 모든 부분을 효과적으로 AI자동화 디자인을 구현할 수 있습니다.
코딩 1도 없이, 디자인을 잘 몰라도, 템플릿 자동화 세팅을 만들어두면, PPT 슬라이드 보고서 3분컷!
✔️ 10만원 대 미니PC 한 대로, 월 수십만 원의 가치를 하는 나만의 자동화 서버(n8n)를 구축하는 모든 과정을 A to Z로 떠먹여 드립니다.
서버 구축은 전문가만 하는 어려운 일이라고 생각해서 도전조차 못 하셨던 분들을 위해, 최대한 세세하게 완벽 가이드 영상으로 만들었습니다.