diasm3/n8n_postgres_mcp_server_backend
If you are the rightful owner of n8n_postgres_mcp_server_backend and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
The Model Context Protocol (MCP) Server is a specialized server designed to facilitate interaction between AI agents and backend systems, providing a seamless integration layer for various AI-driven functionalities.
μΈλ€μ¨λΌμΈ λ°±μλ μμ€ν λ° κ³ κ° λμ νλ‘μ°
π νλ‘μ νΈ κ°μ
μ΄ νλ‘μ νΈλ μΈλ€μ¨λΌμΈμ λ°±μλ μμ€ν κ³Ό κ³ κ° μ»΄νλ μΈ λμ 체κ³λ₯Ό ꡬμΆνλ κ²μ λͺ©νλ‘ ν©λλ€.
μ£Όμ κ΅¬μ± μμ
- - Next.js 15 + TypeScript + Tailwind CSS
- - NestJS + Prisma + PostgreSQL
- - PostgreSQL 16 μ€ν€λ§ λ° μ€κ³ λ¬Έμ
- - AI μμ΄μ νΈ ν΅ν© λ μ΄μ΄
- n8n Workflow Automation - MCP μλ² μ°λ
- κ³ κ° μ»΄νλ μΈ λμ μμ€ν
- JIRA μ°λ ν°μΌ κ΄λ¦¬
π‘ μλΉμ€λ³ μμΈ λ¬Έμ: κ° μλΉμ€μ μμΈν κ°λ° κ°μ΄λ, API λ¬Έμ, νΈλ¬λΈμν μ μ λ§ν¬λ₯Ό ν΄λ¦νμΈμ.
ποΈ μμ€ν μν€ν μ²
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π External Layer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β π ngrok β β π JIRA β β π€ Claude β β
β β (HTTPS) β β System β β AI β β
β β Port: 4040 β β Port: 8081 β β β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β β
ββββββββββββΌββββββββββββββββββββΌβββββββββββββββββββββΌβββββββββββββββββββββββββββ
β β β
β β β
ββββββββββββΌββββββββββββββββββββΌβββββββββββββββββββββΌβββββββββββββββββββββββββββ
β π User Access Layer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β π» Frontend (Next.js 15) β β
β β http://localhost:3002 β β
β β ββ React Hook Form + Zod Validation β β
β β ββ CS λ―Όμ μ μ νΌ β β
β β ββ μλ ID μμ± (μν/μ£Όλ¬Έ) β β
β βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ β
β β HTTP/JSON (CORS) β
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββ
β π³ Docker Network (Backend Services) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β π Backend API (NestJS) β β
β β Port: 3003 (External) / 3000 (Internal) β β
β β ββ REST API Endpoints β β
β β ββ Prisma ORM β β
β β ββ CORS Configuration β β
β β ββ Swagger Documentation β β
β βββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ β
β β β β
β β β β
β βββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββββββββββββββ β
β β ποΈ PostgreSQL Database β β
β β Port: 5432 β β
β β ββ 17 Tables (complaints, users, logs, etc.) β β
β β ββ Prisma Schema & Migrations β β
β β ββ Seed Data (50+ dummy records) β β
β β ββ pgvector Extension (AI Embeddings) β β
β ββββββββ¬βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ β
β β β β
β β β β
β ββββββββΌβββββββββββ ββββββββββββΌβββββββββββ ββββββββββββββββββ β
β β π§ pgAdmin β β π Postgres MCP β β π― MCP Server β β
β β Port: 5050 β β Port: 8003 β β Port: 8001 β β
β β ββ DB κ΄λ¦¬ UI β β ββ SQL via MCP β β ββ AI Tools β β
β βββββββββββββββββββ βββββββββββββββββββββββ ββββββββββ¬ββββββββ β
β β β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββ β
β β βοΈ n8n Workflow Automation β β
β β Port: 5680 β β
β β ββ MCP Server Integration β β
β β ββ Webhook Processing β β
β β ββ Complaint Auto-Classification β β
β β ββ JIRA Ticket Creation β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Data Flow Diagram β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1οΈβ£ Customer Request Flow: β
β Frontend β Backend API β PostgreSQL β Response β
β β
β 2οΈβ£ AI Agent Flow (via MCP): β
β Claude/n8n β MCP Server β Backend API β PostgreSQL β
β β
β 3οΈβ£ Automation Flow: β
β Webhook β ngrok β n8n β MCP Server β Backend API β JIRA β
β β
β 4οΈβ£ Direct SQL Flow (for AI): β
β Claude β Postgres MCP β PostgreSQL (Direct SQL) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π CS λ―Όμ μ²λ¦¬ νλ‘μ° μ°¨νΈ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π€ κ³ κ° λ―Όμ μ μ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββ β
β β π Frontend (Next.js) β β
β β - CS λ―Όμ μ μ νΌ β β
β β - μλ ID μμ± β β
β β - Zod κ²μ¦ β β
β ββββββββββββββββββ¬ββββββββββββββββββββ β
β β β
β β HTTP POST β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββ β
β β π Backend API β β
β β POST /complaints β β
β β - μ°μ μμ μλ νλ¨ β β
β β - κΈ΄κΈλ μλ νλ¨ β β
β β - ν°μΌ λ²νΈ μμ± β β
β ββββββββββββββββββ¬ββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββ β
β β ποΈ PostgreSQL β β
β β INSERT into complaints β β
β β - status: "μ μ" β β
β β - ν°μΌ λ°μ΄ν° μ μ₯ β β
β ββββββββββββββββββ¬ββββββββββββββββββββ β
β β β
β βββββββββββββββββββββΌββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β n8n μλ β β AI μμ΄μ νΈβ β Frontend β β
β β μν¬νλ‘μ°β β (Claude) β β μλ΅ β β
β βββββββ¬βββββ βββββββ¬βββββ ββββββββββββ β
β β β β
β βΌ βΌ β
β ββββββββββββββββββββ¬βββββββββββββββββββ β
β β π€ MCP Server β π Postgres MCP β β
β β (Backend API) β (Direct SQL) β β
β βββββββ¬ββββββββββββββ΄βββββββ¬ββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββββββββββββββββββββββ β
β β λ―Όμ λΆλ₯ & λ°°μ β β
β β βββββββββββββββββββββββββββββ β β
β β β μΉ΄ν
κ³ λ¦¬λ³ μλ λΆλ₯: β β β
β β β - κ°κ²©μ 보 β CS 1ν β β β
β β β - μνμ 보 β CS 2ν β β β
β β β - λ°°μ‘ꡬ맀 β λ°°μ‘ν β β β
β β β - μμ€ν
κΈ°μ β κΈ°μ ν β β β
β β βββββββββββββββββββββββββββββ β β
β βββββββββββββββ¬ββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββ β
β β π― λ΄λΉμ λ°°μ (MCP Tool) β β
β β PUT /complaints/:id β β
β β - assignedTo: agent_id β β
β β - assignedTeam: "CS 1ν" β β
β β - status: "μ²λ¦¬μ€" β β
β βββββββββββββββ¬ββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββ β
β β β μ§μΉ¨μ μ‘΄μ¬ μ¬λΆ νμΈ β β
β ββββ¬ββββββββββββββββββββββββββββ¬βββ β
β β YES β NO β
β βΌ βΌ β
β ββββββββββββββββββ ββββββββββββββββββββββ β
β β π μ§μΉ¨μ β β π JIRA ν°μΌ μμ± β β
β β λ°λΌ μλ β β (MCP Tool) β β
β β β β - update-complaint-β β
β β - ν
νλ¦Ώ μ¬μ© β β jira-ticket β β
β β - λΉ λ₯Έ ν΄κ²° β β - κ°λ°ν κ²ν μμ²β β
β βββββββββ¬βββββββββ βββββββββββ¬βββββββββββ β
β β β β
β β βΌ β
β β βββββββββββββββββββββββ β
β β β π§ κ°λ°ν κ²ν β β
β β β - μ κ· μ§μΉ¨ μμ± β β
β β β - KB μ
λ°μ΄νΈ β β
β β βββββββββββ¬ββββββββββββ β
β β β β
β ββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββ β
β β π¬ κ³ κ° μλ β β
β β - μλ΅ μμ± β β
β β - μν μ
λ°μ΄νΈ β β
β β - λ§μ‘±λ μ‘°μ¬ β β
β βββββββββββββββ¬ββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββ β
β β β
λ―Όμ μλ£ β β
β β - status: "ν΄κ²°" β β
β β - resolvedAt κΈ°λ‘ β β
β β - ν΅κ³ μ
λ°μ΄νΈ β β
β ββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π¨ μμ€μ»¬λ μ΄μ
νλ‘μ° μ°¨νΈ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π λ―Όμ μ μ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββ β
β β π― μ°μ μμ & κΈ΄κΈλ νλ¨ β β
β β (Backend μλ νλ¨) β β
β ββββββββββ¬ββββββββββββββββββββββ β
β β β
β ββββββββββββββΌβββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββ βββββββββββ βββββββββββ β
β β Low β β Medium β β High β β
β β Priorityβ β Priorityβ β Priorityβ β
β ββββββ¬βββββ ββββββ¬βββββ ββββββ¬βββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β Level 1 β β Level 1 β β Level 2 β β
β β μΌλ°μλ΄μβ β μΌλ°μλ΄μβ β μ μμλ΄μβ β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββ β
β β β 48μκ° λ΄ ν΄κ²° κ°λ₯? β β
β ββββ¬ββββββββββββββββββββββββ¬βββββββββββ β
β β YES β NO β
β βΌ βΌ β
β βββββββββββ ββββββββββββββββββββββββ β
β β ν΄κ²° β β πΊ Level 2 μμ€μ»¬ β β
β β μλ£ β β - escalationLevel: 2 β β
β βββββββββββ β - isEscalated: true β β
β ββββββββββββ¬βββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββ β
β β π νμ₯/λ§€λμ κ²ν β β
β β - 볡μ‘ν μΌμ΄μ€ β β
β β - λ²μ κ²ν νμ β β
β ββββββββββββ¬ββββββββββββββββ β
β β β
β βββββββββββΌββββββββββ β
β β ν΄κ²° κ°λ₯β λΆκ°λ₯ β β
β βΌ βΌ βΌ β
β βββββββββββ ββββββββββββββββββ β
β β ν΄κ²° β β πΊ Level 3 β β
β β μλ£ β β - λ²λ¬΄ν νμ β β
β βββββββββββ β - μμ λ³΄κ³ β β
β ββββββββββ¬βββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββ β
β β π¨βπΌ μμ λ 벨 κ²°μ β β
β β Level 4 β β
β β - μ€λ μ¬μ β β
β β - μ΅μ’
μμ¬κ²°μ β β
β ββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
κ΅¬μ± μμ μ€λͺ
π΅ Core Services
-
Frontend (Next.js 15): κ³ κ° λ―Όμ μ μ μΉ μ ν리μΌμ΄μ (Port: 3002)
- Next.js 15 with App Router
- TypeScript + Tailwind CSS
- React Hook Form + Zod validation
- CS λ¬Έμ μ λ ₯ νΌ
- μλ ID μμ± (μν/μ£Όλ¬Έ)
-
Backend API (NestJS): λ©μΈ λ°±μλ μλ² (Port: 3003)
- REST API μ 곡
- CORS μ€μ μλ£
- Prisma ORMμΌλ‘ DB μ°λ
- κ³ κ° μ»΄νλ μΈ, μ¬μ©μ κ΄λ¦¬ λ±
-
PostgreSQL Database: λ°μ΄ν° μ μ₯μ (Port: 5432)
- 17κ° ν μ΄λΈ (customer_users, complaints, internal_users λ±)
- λλ―Έ λ°μ΄ν° μλ μμ±
- pgvector νμ₯ (AI embedding)
π’ Automation & AI
-
n8n Workflow: μν¬νλ‘μ° μλν (Port: 5680)
- μ»΄νλ μΈ μλ λΆλ₯ λ° μ²λ¦¬
- MCP Server μ°λ
- Webhook κΈ°λ° μ΄λ²€νΈ μ²λ¦¬
-
MCP Server (Custom): AI μμ΄μ νΈ ν΅ν© λ μ΄μ΄ (Port: 8001)
- Tools: AIκ° νΈμΆ κ°λ₯ν ν¨μλ€
- Resources: λ°μ΄ν° μμ€ μ 곡
- Prompts: ν둬ννΈ ν νλ¦Ώ
-
Postgres MCP Server: PostgreSQL μ μ© MCP (Port: 8003)
- SQL 쿼리 μ€ν
- λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ νμ
- AI κΈ°λ° SQL μμ±
π‘ External Integrations
-
ngrok: HTTPS ν°λλ§ (Port: 4040)
- λ‘컬 n8nμ μΈλΆμ λ ΈμΆ
- Webhook URL μ 곡
-
JIRA: ν°μΌ κ΄λ¦¬ μμ€ν (Port: 8081)
- μ»΄νλ μΈ ν°μΌ μλ μμ±
- μ΄μ μΆμ
-
Claude AI: AI μ΄μμ€ν΄νΈ
- MCP Server ν΅ν΄ λ°±μλ μ κ·Ό
- μλ μλ΅ μμ±
π Management Tools
- pgAdmin: PostgreSQL κ΄λ¦¬ UI (Port: 5050)
- λ°μ΄ν°λ² μ΄μ€ μκ°ν
- 쿼리 μ€ν λ° κ΄λ¦¬
λ°μ΄ν° νλ¦
- κ³ κ° μμ² β Frontend β Backend API β PostgreSQL
- μλν μν¬νλ‘μ° β n8n β MCP Server β Backend API
- AI μ΄μμ€ν΄νΈ β Claude β MCP Server β PostgreSQL (via Postgres MCP)
- μΈλΆ Webhook β ngrok β n8n β μν¬νλ‘μ° μ²λ¦¬
π μμνκΈ°
1. νκ²½ μ€μ
# νλ‘μ νΈ ν΄λ‘
git clone [repository-url]
cd backend-setup
# νκ²½ λ³μ μ€μ
cp backend_sarda_online/.env.example backend_sarda_online/.env
2. Docker 컨ν μ΄λ μ€ν
# λͺ¨λ μλΉμ€ μμ
docker-compose up -d
# κ°λ³ μλΉμ€ μμ
docker-compose up -d postgres # PostgreSQL
docker-compose up -d pgadmin # pgAdmin
docker-compose up -d n8n # n8n
docker-compose up -d backend # Backend API
3. μλΉμ€ μ μ μ 보
μλΉμ€ | URL | μΈμ¦ μ 보 |
---|---|---|
Frontend | http://localhost:3002 | - |
Backend API | http://localhost:3003 | - |
Swagger API Docs | http://localhost:3003/api | - |
n8n | http://localhost:5680 | admin / admin |
pgAdmin | http://localhost:5050 | admin@sarda-online.com / admin |
PostgreSQL | localhost:5432 | sarda_online_user / sarda_online_password |
MCP Server | http://localhost:8001 | - |
Postgres MCP | http://localhost:8003 | - |
ngrok Dashboard | http://localhost:4040 | - |
Jira | http://localhost:8081 | (μ΄κΈ° μ€μ νμ) |
4. ngrok HTTPS ν°λ μ€μ
ngrokμ μ¬μ©νμ¬ λ‘컬 n8nμ μΈλΆμμ HTTPSλ‘ μ κ·Όν μ μμ΅λλ€.
ngrok μ€μ λ°©λ²
-
νκ²½ λ³μ μ€μ
# .env νμΌμμ ngrok authtoken μ€μ NGROK_AUTHTOKEN=your_ngrok_authtoken_here
authtokenμ ngrok λμ보λμμ νμΈν μ μμ΅λλ€.
-
Docker Compose μ€ν
docker-compose up -d ngrok
-
HTTPS URL νμΈ
ngrokμ΄ μμ±ν HTTPS URLμ νμΈνλ λ°©λ²:
λ°©λ² 1: μΉ μΈν°νμ΄μ€ (μΆμ²)
- λΈλΌμ°μ μμ http://localhost:4040 μ μ
- "Tunnels" μΉμ μμ HTTPS URL νμΈ (μ: https://abc123.ngrok.io)
λ°©λ² 2: API νΈμΆ
curl http://localhost:4040/api/tunnels | jq '.tunnels[0].public_url'
λ°©λ² 3: Docker λ‘κ·Έ
docker logs sarda_online_ngrok
-
n8n Webhook URL μ λ°μ΄νΈ
λ°©λ² 1: μλ μ λ°μ΄νΈ μ€ν¬λ¦½νΈ μ¬μ© (μΆμ²) β¨
# μ€ν κΆν λΆμ¬ (μ΅μ΄ 1νλ§) chmod +x update-n8n-url.sh # μ€ν¬λ¦½νΈ μ€ν - ngrok URL μλ κ°μ§ λ° .env μ λ°μ΄νΈ + n8n μ¬μμ ./update-n8n-url.sh
μ€ν¬λ¦½νΈκ° μλμΌλ‘:
- β ngrok APIμμ νμ¬ ν°λ URL κ°μ Έμ€κΈ°
- β
.env
νμΌμN8N_WEBHOOK_URL
κ³ΌN8N_HOST
μ λ°μ΄νΈ - β n8n 컨ν μ΄λ μλ μ¬μμ
λ°©λ² 2: μλ μ λ°μ΄νΈ
ngrok URLμ νμΈν ν
.env
νμΌ μμ :# .env N8N_WEBHOOK_URL=https://abc123.ngrok.io N8N_HOST=abc123.ngrok.io
κ·Έλ¦¬κ³ n8n 컨ν μ΄λ μ¬μμ:
docker-compose restart n8n
ngrok μ€μ νμΌ
ngrok.yml
νμΌ κ΅¬μ‘°:
version: "2"
tunnels:
n8n:
addr: n8n:56780 # n8n docker λ΄λΆ
proto: http
schemes:
- https # HTTPSλ§ νμ±ν
μ£Όμμ¬ν
- λ¬΄λ£ νλ μ ν: ngrok λ¬΄λ£ νλμ λμμ 1κ°μ ν°λλ§ μ¬μ© κ°λ₯ν©λλ€.
- URL λ³κ²½: ngrokμ μ¬μμν λλ§λ€ URLμ΄ λ³κ²½λ©λλ€. κ³ μ URLμ΄ νμν κ²½μ° μ λ£ νλμ μ¬μ©νμΈμ.
- 보μ: authtokenμ
.env
νμΌμ μ μ₯νκ³ μ λ Gitμ 컀λ°νμ§ λ§μΈμ.
νΈλ¬λΈμν
-
ERR_NGROK_105 (μΈμ¦ μ€ν¨)
.env
νμΌμNGROK_AUTHTOKEN
κ° νμΈ- ngrok λμ보λμμ μ¬λ°λ₯Έ ν ν° νμΈ
-
ν°λμ΄ μμ±λμ§ μμ
- n8n 컨ν
μ΄λκ° μ€ν μ€μΈμ§ νμΈ:
docker ps | grep n8n
- ngrok λ‘κ·Έ νμΈ:
docker logs sarda_online_ngrok
- n8n 컨ν
μ΄λκ° μ€ν μ€μΈμ§ νμΈ:
-
Webhookμ΄ μλνμ§ μμ
- n8nμ
N8N_WEBHOOK_URL
νκ²½λ³μκ° ngrok URLλ‘ μ€μ λμλμ§ νμΈ - n8n μν¬νλ‘μ°μμ Webhook URLμ΄ μ¬λ°λ₯Έμ§ νμΈ
- n8nμ
π¦ μλΉμ€λ³ μμΈ λ¬Έμ
π Frontend (Next.js 15)
κ³ κ°μ΄ CS λ―Όμμ μ μν μ μλ μΉ μΈν°νμ΄μ€μ λλ€.
- κΈ°μ μ€ν: Next.js 15, TypeScript, Tailwind CSS, React Hook Form, Zod
- μ£Όμ κΈ°λ₯: CS λ―Όμ μ μ νΌ, μλ ID μμ±, νΌ κ²μ¦, μ μ μλ£ μ 보 νμ
- ν¬νΈ: 3002 (μΈλΆ) β 3000 (λ΄λΆ)
π Backend API (NestJS)
μΈλ€μ¨λΌμΈ CS λ―Όμ κ΄λ¦¬ μμ€ν μ λ°±μλ API μλ²μ λλ€.
- κΈ°μ μ€ν: NestJS, Prisma, PostgreSQL 16, TypeScript
- μ£Όμ API: Customer Users, Internal Users, Complaints, User Logs
- ν¬νΈ: 3003 (μΈλΆ) β 3000 (λ΄λΆ)
- API λ¬Έμ: http://localhost:3003/api (Swagger)
ποΈ Database (PostgreSQL 16)
λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μ€κ³ λ° κ΄λ¦¬ λ¬Έμμ λλ€.
- DBMS: PostgreSQL 16
- ORM: Prisma
- ν μ΄λΈ: 9κ° (κ³ κ°, μ§μ, λ―Όμ, μλ΅, μ΄λ ₯, ν νλ¦Ώ, SLA, KB λ±)
- μ£Όμ κΈ°λ₯: λ§μ΄κ·Έλ μ΄μ , μλ λ°μ΄ν°, λ°±μ /볡μ
π€ MCP Server
AI μμ΄μ νΈ(Claude, n8n λ±)κ° Backend APIμ μνΈμμ©ν μ μλλ‘ νλ ν΅ν© λ μ΄μ΄μ λλ€.
- κΈ°μ μ€ν: TypeScript, MCP Protocol, HTTP/SSE
- μ£Όμ Tools: κ³ κ° κ΄λ¦¬, μ§μ κ΄λ¦¬, λ―Όμ κ΄λ¦¬ (Read/Write), μ¬μ©μ λ‘κ·Έ
- ν¬νΈ: 8001 (μΈλΆ) β 3000 (λ΄λΆ)
λΉ λ₯Έ μμ κ°μ΄λ
κ° μλΉμ€λ₯Ό κ°λ³μ μΌλ‘ μ€ννλ €λ©΄:
# Frontend μ€ν
docker compose up -d frontend
# Backend μ€ν
docker compose up -d backend
# MCP Server μ€ν
docker compose up -d mcp-server
λ μμΈν κ°λ° κ°μ΄λλ κ° μλΉμ€μ READMEλ₯Ό μ°Έκ³ νμΈμ.
ποΈ νλ‘μ νΈ κ΅¬μ‘°
n8n_with_mcp_server_example/
βββ π docker-compose.yml # Docker Compose μ€μ
βββ π ngrok.yml # ngrok ν°λ μ€μ
βββ π .env # νκ²½ λ³μ (Git μ μΈ)
βββ π .env.example # νκ²½ λ³μ ν
νλ¦Ώ
βββ π .gitignore # Git μ μΈ νμΌ λͺ©λ‘
βββ π README.md # νλ‘μ νΈ λ¬Έμ
β
βββ π frontend/ # Next.js Frontend μ ν리μΌμ΄μ
β βββ π app/
β β βββ π page.tsx # λ©μΈ νμ΄μ§ (CS νΌ)
β β βββ π layout.tsx # λ£¨νΈ λ μ΄μμ
β β βββ π globals.css # μ μ μ€νμΌ
β βββ π components/
β β βββ π ComplaintForm.tsx # CS λ―Όμ μ μ νΌ
β βββ π lib/
β β βββ π api.ts # API ν΄λΌμ΄μΈνΈ
β βββ π types/
β β βββ π complaint.ts # νμ
μ μ
β βββ π Dockerfile # Frontend λ컀 μ΄λ―Έμ§
β βββ π .dockerignore # Docker λΉλ μ μΈ
β βββ π .env.local # λ‘컬 νκ²½λ³μ
β βββ π next.config.ts # Next.js μ€μ
β βββ π tailwind.config.ts # Tailwind μ€μ
β βββ π package.json # μμ‘΄μ± κ΄λ¦¬
β βββ π tsconfig.json # TypeScript μ€μ
β
βββ π backend_sarda_online/ # NestJS Backend μ ν리μΌμ΄μ
β βββ π src/
β β βββ π users/ # κ³ κ° μ¬μ©μ κ΄λ¦¬ λͺ¨λ (customer-users API)
β β βββ π user-logs/ # κ³ κ° μ¬μ©μ λ‘κ·Έ λͺ¨λ (customer-user-logs API)
β β βββ π prisma/ # Prisma μλΉμ€
β β βββ π main.ts # μ ν리μΌμ΄μ
μνΈλ¦¬
β β βββ π app.module.ts # λ£¨νΈ λͺ¨λ
β β βββ π app.controller.ts # λ£¨νΈ μ»¨νΈλ‘€λ¬
β βββ π prisma/
β β βββ π migrations/ # Prisma λ§μ΄κ·Έλ μ΄μ
β β βββ π schema.prisma # λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§
β β βββ π seed.ts # μλ λ°μ΄ν°
β βββ π test/ # E2E ν
μ€νΈ
β βββ π Dockerfile # Backend λ컀 μ΄λ―Έμ§
β βββ π package.json # μμ‘΄μ± κ΄λ¦¬
β βββ π tsconfig.json # TypeScript μ€μ
β βββ π .env.example # Backend νκ²½λ³μ ν
νλ¦Ώ
β
βββ π database/ # λ°μ΄ν°λ² μ΄μ€ κ΄λ ¨ νμΌ
β βββ π scripts/
β β βββ π init/ # μ΄κΈ°ν μ€ν¬λ¦½νΈ
β β β βββ π 01-init-databases.sql
β β βββ π migrations/ # λ§μ΄κ·Έλ μ΄μ
μ€ν¬λ¦½νΈ
β β β βββ π 02-create-cs-tables.sql
β β βββ π seeds/ # μλ λ°μ΄ν° μ€ν¬λ¦½νΈ
β β βββ π 03-seed-dummy-data.sql
β βββ π backups/ # λ°μ΄ν°λ² μ΄μ€ λ°±μ
β β βββ π full-dump.sql # μ 체 λ°μ΄ν° λ€ν (310MB)
β βββ π README.md # λ°μ΄ν°λ² μ΄μ€ λ¬Έμ
β
βββ π mcp_server_practice/ # MCP μλ² μ ν리μΌμ΄μ
β βββ π src/
β β βββ π tools/ # MCP λꡬ
β β βββ π index.ts # MCP μλ² μνΈλ¦¬
β βββ π Dockerfile # MCP μλ² λ컀 μ΄λ―Έμ§
β βββ π docker-compose.yml # MCP μλ² μ μ© Compose
β βββ π package.json # μμ‘΄μ± κ΄λ¦¬
β βββ π tsconfig.json # TypeScript μ€μ
β βββ π readme.md # MCP μλ² λ¬Έμ
β
βββ π documents/ # νλ‘μ νΈ λ¬Έμ
βββ π customer-complaint-guideline.md # κ³ κ° λμ μ§μΉ¨μ
βββ π complaint-response-templates.md # μλ ν
νλ¦Ώ
βββ π n8n-workflow-guide.md # n8n μν¬νλ‘μ° κ°μ΄λ
μ£Όμ λλ ν 리 μ€λͺ
- frontend/: Next.js 15 κΈ°λ° κ³ κ° CS λ―Όμ μ μ μΉ μ ν리μΌμ΄μ
- backend_sarda_online/: NestJS κΈ°λ° Backend API μλ²
- database/: PostgreSQL μ΄κΈ°ν, λ§μ΄κ·Έλ μ΄μ , λ°±μ κ΄λ¦¬
- mcp_server_practice/: Model Context Protocol μλ² (AI μ°λ)
- documents/: κ³ κ° λμ κ°μ΄λ λ° μν¬νλ‘μ° λ¬Έμ
π n8n μν¬νλ‘μ° μλ리μ€
1. κ³ κ° λ¬Έμ μλ λΆλ₯
- λ¬Έμ λ΄μ© ν€μλ λΆμ
- μΉ΄ν κ³ λ¦¬ μλ λΆλ₯
- λ΄λΉμ μλ λ°°μ
2. JIRA ν°μΌ μλ μμ±
- μ§μΉ¨μ μλ μΌμ΄μ€ κ°μ§
- JIRA API μ°λ
- μ°μ μμ μλ μ€μ
3. κ³ κ° μλ μλν
- ν νλ¦Ώ κΈ°λ° μ΄κΈ° μλ΅
- μν μ λ°μ΄νΈ μλ¦Ό
- λ§μ‘±λ μ‘°μ¬ λ°μ‘
π οΈ μ μ§λ³΄μ
λ‘κ·Έ νμΈ
# Backend λ‘κ·Έ
docker logs sarda_online_backend -f
# n8n λ‘κ·Έ
docker logs sarda_online_n8n -f
# PostgreSQL λ‘κ·Έ
docker logs sarda_online_postgres -f
λ°μ΄ν°λ² μ΄μ€ λ°±μ
# λ°±μ
docker exec sarda_online_postgres pg_dump -U sarda_online_user sarda_online_db > backup.sql
# 볡μ
docker exec -i sarda_online_postgres psql -U sarda_online_user sarda_online_db < backup.sql
π¨ νΈλ¬λΈμν
1. 컨ν μ΄λ μμ μ€ν¨
# λͺ¨λ 컨ν
μ΄λ μ€μ§ λ° μ κ±°
docker-compose down
# λ³Όλ₯¨ μμ (μ£Όμ: λ°μ΄ν° μμ€)
docker-compose down -v
# μ¬μμ
docker-compose up -d
2. λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€λ₯
- PostgreSQL 컨ν μ΄λ μν νμΈ
- λ€νΈμν¬ μ€μ νμΈ
- νκ²½ λ³μ νμΈ
3. n8n μν¬νλ‘μ° μ€λ₯
- μ격 μ¦λͺ νμΈ
- API μλν¬μΈνΈ νμΈ
- λ‘κ·Έ λΆμ
π ν₯ν κ³ν
Phase 1 (νμ¬)
- Backend API ꡬμΆ
- μ¬μ©μ κ΄λ¦¬ μμ€ν
- λ‘κ·Έ μμ€ν
- κ³ κ° λμ μ§μΉ¨μ
Phase 2
- n8n μν¬νλ‘μ° κ΅¬ν
- JIRA μ°λ
- μλ μλ΅ μμ€ν
Phase 3
- AI κΈ°λ° λ¬Έμ λΆλ₯
- μ€μκ° λμ보λ
- μ±κ³Ό λΆμ μμ€ν
ποΈ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§
Customer Users ν μ΄λΈ
- κΈ°λ³Έ μ 보: id, email, password, firstName, lastName
- μΆκ° μ 보: phoneNumber, birthDate, role, profileImageUrl
- μ€μ : preferences (μλ¦Ό μ€μ , κ΄μ¬ μΉ΄ν κ³ λ¦¬, μΈμ΄)
- μ£Όμ: address (λλ‘λͺ , λμ, μ§μ, μ°νΈλ²νΈ)
- λ‘κ·ΈμΈ μ 보: loginCount, lastLoginAt, lastLoginIp
- λ©νλ°μ΄ν°: metadata (μΆκ° μ 보 μ μ₯μ©)
Customer User Logs ν μ΄λΈ
- μ΄λ²€νΈ μ 보: eventType, eventCategory, eventData
- κΈ°κΈ° μ 보: ipAddress, userAgent, deviceInfo
- μμΉ μ 보: location (κ΅κ°, λμ, μ’ν)
- μΈμ μ 보: sessionId, referrer, currentUrl
- μ±λ₯ μ 보: responseTime, httpMethod, statusCode
- λΆλ₯: tags, level (debug, info, warning, error, critical)
InternalUsers ν μ΄λΈ (λ΄λΆ μ§μ)
- κΈ°λ³Έ μ 보: id, email, firstName, lastName, password, phoneNumber
- μ§λ¬΄ μ 보: department, position, employeeId, role
- κΆν λ° λ 벨: accessLevel, permissions
- CS μ λ¬Έμ±: specialties, maxConcurrentTickets
- 근무 μ 보: workSchedule, isAvailable, currentWorkload
- μ±κ³Ό μ§ν: totalTicketsHandled, avgResolutionTime, satisfactionRating
- μν μ 보: status, lastActiveAt
- λ©νλ°μ΄ν°: metadata, createdAt, updatedAt
CustomerComplaints ν μ΄λΈ (κ³ κ° μ»΄νλ μΈ)
- ν°μΌ μ 보: id, ticketNumber
- κ³ κ° μ 보: userId, customerName, customerEmail, customerPhone
- λ¬Έμ λΆλ₯: category, subCategory, priority, urgency
- λ΄μ©: subject, description, attachments
- μν κ΄λ¦¬: status, escalationLevel, isEscalated
- μ²λ¦¬ μ 보: assignedTo, assignedTeam, firstResponseAt, resolvedAt, responseTime, resolutionTime
- κ΄λ ¨ μ 보: relatedProductId, relatedOrderId, relatedSellerId, jiraTicketKey
- 보μ/μ‘°μΉ: compensationType, compensationAmount, compensationNote
- κ³ κ° λ§μ‘±λ: satisfactionScore, feedbackComment
- λ©νλ°μ΄ν°: tags, metadata, createdAt, updatedAt
ComplaintResponses ν μ΄λΈ (μ»΄νλ μΈ μλ΅)
- κΈ°λ³Έ μ 보: id, complaintId, responderId, responderType
- μλ΅ λ΄μ©: responseType, content, attachments
- νλκ·Έ: isInternal, isAutoResponse
- νμμ€ν¬ν: createdAt
ComplaintHistory ν μ΄λΈ (μ»΄νλ μΈ μ΄λ ₯)
- κΈ°λ³Έ μ 보: id, complaintId, actorId
- λ³κ²½ λ΄μ: action, fromValue, toValue, note
- λ©νλ°μ΄ν°: metadata, createdAt
ComplaintTemplates ν μ΄λΈ (μλ΅ ν νλ¦Ώ)
- κΈ°λ³Έ μ 보: id, category, subCategory, templateName
- ν νλ¦Ώ λ΄μ©: templateContent, variables
- μν μ 보: isActive, usageCount
- μμ± μ 보: createdBy, createdAt, updatedAt
ComplaintSlaRules ν μ΄λΈ (SLA κ·μΉ)
- κΈ°λ³Έ μ 보: id, category, priority
- μκ° κ·μΉ: firstResponseTime, resolutionTime, escalationTime
- μν μ 보: isActive, createdAt, updatedAt
ComplaintKnowledgeBase ν μ΄λΈ (μ§μ λ² μ΄μ€)
- κΈ°λ³Έ μ 보: id, category, subCategory
- μ½ν μΈ : question, answer, keywords, relatedArticles
- ν΅κ³: viewCount, helpfulCount, notHelpfulCount
- μν μ 보: isPublished, createdBy, createdAt, updatedAt
π₯ ν ꡬμ±
- λ°±μλ κ°λ°: Backend API, Database
- μν¬νλ‘μ° κ°λ°: n8n, MCP Server
- CS ν: κ³ κ° λμ, μ§μΉ¨μ κ΄λ¦¬
- QA ν: ν μ€νΈ, νμ§ κ΄λ¦¬
Last Updated: 2025-06-30