Agent 2.0 exdev 서버 배포 스택

- server-dev start/stop/deploy 및 Gitea push 자동 배포
- local-dev 로컬 개발 환경

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-07-21 22:57:30 +09:00
commit 4b86b2a660
344 changed files with 45787 additions and 0 deletions
@@ -0,0 +1,2 @@
# 이 파일은 참고용입니다. docker compose는 default.conf.template + docker-entrypoint.sh 를 사용합니다.
# 기본 upstream: https://chatbot.exdev.co.kr/chatbot/
@@ -0,0 +1,104 @@
# chatbotApp 단독 웹서버 — Next.js 정적 UI + 챗 API 프록시
# 기본 upstream: https://chatbot.exdev.co.kr (Caddy → kakaoChatbotSkill /web/ask)
# 로컬 kakao-skill(:8083) 사용 시:
# CHATBOT_API_UPSTREAM=http://host.docker.internal:8083/web/
# CHATBOT_API_HOST=host.docker.internal
# 레거시 RAG 직접(:28012) 사용 시:
# CHATBOT_API_UPSTREAM=http://host.docker.internal:28012/chatbot/
#
# Next.js 빌드(basePath=/chatbot/app)의 CSS·JS는 /chatbot/app/_next/ 경로를 사용합니다.
# /chatbot/ API 프록시보다 정적 location을 먼저 두어야 스타일이 적용됩니다.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
client_max_body_size 1m;
# Next.js 정적 자산 + SPA (운영과 동일 경로 /chatbot/app/, /chatbot/ai/)
location = /chatbot/app {
return 301 /chatbot/app/;
}
location ^~ /chatbot/app/ {
alias /usr/share/nginx/html/;
index index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
location = /chatbot/ai {
return 301 /chatbot/ai/;
}
location ^~ /chatbot/ai/ {
alias /usr/share/nginx/html-ai/;
index index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
location = /chatbot/banner {
return 301 /chatbot/banner/;
}
location ^~ /chatbot/banner/ {
alias /usr/share/nginx/html-banner/;
index index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Content-Security-Policy "frame-ancestors *" always;
}
location = /chatbot/sample {
return 301 /chatbot/sample/;
}
location ^~ /chatbot/sample/ {
alias /usr/share/nginx/html-sample/;
index index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Permissions-Policy "microphone=*, camera=()" always;
}
location = /chatbot/voicebot {
return 301 /chatbot/voicebot/;
}
location ^~ /chatbot/voicebot/ {
alias /usr/share/nginx/html-voicebot/;
index index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Content-Security-Policy "frame-ancestors *" always;
add_header Permissions-Policy "microphone=*, camera=()" always;
}
# 루트 접속 → basePath와 동일 URL로 이동
location = / {
return 302 /chatbot/app/;
}
# RAG API (ask/stream/faq/session/health 등) — 원격 exAiChatBot 또는 로컬 RAG
location /chatbot/ {
proxy_pass ${CHATBOT_API_UPSTREAM};
proxy_http_version 1.1;
proxy_ssl_server_name on;
proxy_set_header Host ${CHATBOT_API_HOST};
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
}
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
}
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh
set -e
export CHATBOT_API_UPSTREAM="${CHATBOT_API_UPSTREAM:-https://chatbot.exdev.co.kr/chatbot/}"
export CHATBOT_API_HOST="${CHATBOT_API_HOST:-chatbot.exdev.co.kr}"
envsubst '${CHATBOT_API_UPSTREAM} ${CHATBOT_API_HOST}' \
< /etc/nginx/templates/default.conf.template \
> /etc/nginx/conf.d/default.conf
exec nginx -g 'daemon off;'