- 현재 판정:
완료됨 - 현재 상태: 핵심 웹 진입·게이트웨이·관리자/마켓 분리, 운영 경로 실검증, hard gate/readiness artifact 구조와 self-run terminal/applied_to_source 최신 세션 재검증 근거가 모두 최신 세션 기준으로 닫힘
- 보류 항목: 없음
- 기준 문서:
docs/system-cleanup-checklist.mddocs/deployment-blockers-checklist.md
- 프런트 앱은 공개 메인
frontend, 관리자 전용frontend/frontend로 분리 운영됨 - 운영 게이트웨이는 compose 내부 프런트 런타임과 nginx 기준으로 검증됨
- 결제는 실PG가 아니라 시뮬레이션 완료 반영 방식으로 유지됨
- 리뷰 API와 공개 상세 페이지 리뷰 UI 연결 검증이 완료됨
- 고급 검색 공개 라우트와 Stripe 실결제 경로는 현재 실서비스 범위에서 제거됨
- OpenAPI는 현재
3.1.0기준으로 노출됨 - self-run/오케스트레이션 단계는 현재 9단 고정 순서(구조 설계 → 폴더 및 기초 구현 → 설계반영된 골조구현 → 핵심엔진 구성 → 로직(id식별) → 데이터 → 서비스 → API → 프론트) 기준으로 확장됨
- 관리자 self-run runtime artifact(
job_request.json,worker.log,worker_status.json)는 강제 생성 및 존재 검증이 반영됐고, worker PID 기록까지는 실확인됨 - 관리자 self-run 최종 종료 상태(
pending_approval,no_changes,applied_to_source)의 최신 세션 재검증 근거는 기록표에 반영됐고, Round 7 최종 승격까지 완료됐다
- 백엔드, DB, nginx, 기본 인증/마켓/관리자 API는 동작 가능
- 공개 메인 앱은
frontend, 관리자 전용 앱은frontend/frontend기준으로 운영한다 - RTX 5090 기준 영상/LLM 운영 설정은 runtime config, 관리자 시스템 설정, LLM 상태 API에 실제 반영돼 있음
- 핵심 사용자 플로우(로그인, 마켓 목록/상세, 리뷰, 구매 완료 반영, 다운로드, 관리자 진입) 재검증이 완료됐다
- 마켓플레이스 cross-site
OPTIONS /marketplace는 nginx preflight 처리로204응답 기준까지 확인됐다 - 관리자 self-run 은 runtime artifact 생성, terminal state,
applied_to_source evidence최신 세션 재검증까지 기록표 기준으로 닫혔다 - 따라서 현재 저장소는 문서 판정 체계상
완료됨상태이며, Round 7 최종 승격까지 동기화가 완료됐다. 2026-04-10 최신 세션에서https://metanova1004.com/api/admin/orchestrator/capabilities/summary,.../code-generator,/admin/llm?capability=code-generator,/api/admin/system-settings,/api/admin/workspace-self-run-record?latest=true,wss://metanova1004.com/api/llm/ws운영 실검증 2회,https://xn--114-2p7l635dz3bh5j.com/api/auth/login및/api/marketplace/projects?skip=0&limit=24&sort_by=downloads&sort_order=desc2회 실검증,PLAYWRIGHT_ADMIN_BASE_URL=https://metanova1004.com npm --prefix frontend/frontend run e2e -- admin-passkey-operational.playwright.spec.ts기준 관리자 패스키 등록·로그인 2회 실검증도 모두 통과했다.
개발분석114.com은 AI 기반 프로젝트 분석 및 관리 플랫폼입니다:
- 🧠 듀얼 브레인 시스템 (A뇌 + B뇌)
- 📊 20+ 태스크 자동 분해
- 📈 5가지 플로우차트
- 🤖 Level 3 완전 자율 시스템
- 🛒 AI 프로젝트 마켓플레이스
- 🔥 양자화 LLM (16-22B)
- 🐳 Docker 프로덕션 환경
- 최소 20개 이상 원자적 태스크 생성
- 8가지 카테고리 자동 분류
- 의존성 분석 및 크리티컬 패스
- A뇌/B뇌 최적 할당
- 관리자 운영 진단 패널
- 오케스트레이터 런타임 설정/실행 제어
- 작업 이력 및 자기 실행 승인 흐름
- 시스템 상태/리소스 헬스 점검
- self-run worker runtime artifact 강제 생성 및 상태 추적
- worker 로그 진행 마커(
worker_boot,worker_dispatch,context_prepare_*,orchestrator_*,python_fallback_*,approval_finalized,worker_finalize) 기록
주의: 과거 문서에 있던 독립
autonomous모듈과/api/autonomous/*API는 현재 저장소 기준으로 별도 노출돼 있지 않습니다. 현재 운영 기능은 관리자/오케스트레이터 경로 중심입니다.현재 보류 항목: self-run 최종 종료 자체가 아니라 Round 7 최종 승격 전 같은 세션 기준 문서/기준선 재점검입니다.
- 프로젝트 업로드/다운로드
- 기본 구매/다운로드 플로우
- 리뷰/평점 데이터 및 백엔드 API
- MinIO 파일 스토리지
현재 구현 기준:
- README 과거 버전에 있던
토스페이먼츠/이니시스,라이센스 관리 (MIT/Commercial/Personal)는 현재 저장소 기준으로 실구현 상태가 아닙니다.- 현재 구매/결제 흐름은 실결제 연동이 아니라 시뮬레이션 결제 완료 반영 방식입니다.
- 리뷰 API와 공개 상세 페이지의 리뷰 작성/조회 UI가 연결되어 있으며, 공개 리뷰 플로우 검증이 완료되었습니다.
- GGUF Q5_K_M 포맷 후보 모델 지원
- RTX 5090 기준 Ollama 32B 런타임 우선
- GGUF 직접 보관 + Ollama 태그 등록 방식
- 관리자 런타임 설정 연동
현재 저장소에는
scripts/setup_llm.sh자동 다운로드 스크립트가 포함돼 있지 않습니다. 현재 문서는 Ollama 태그 기반 운영을 기준으로 봐야 합니다.
- JWT (Access + Refresh Token)
- bcrypt 비밀번호 해싱
- 외부 엔진 연동용 API 키 설정
- 관리자/일반 사용자 권한 분리
- Rate Limiting
- Audit Logging
- 소비자 대시보드: KPI 카드, 최근 활동 피드, 빠른 액션 패널
- 관리자 대시보드: 운영 알림 패널, 상위 프로젝트 검색, 관리자 액션 버튼
- 기존 API 기반 실시간 상태 반영 (
/api/health,/api/llm/status, 마켓 통계 API)
git clone https://github.com/your-repo/devanalysis114.git
cd devanalysis114powershell -ExecutionPolicy Bypass -File .\scripts\start_all_in_one.ps1필수: 시작 전에
FIXED_ADMIN_PASSWORD를.env또는 PowerShell 환경변수에 설정해야 합니다.
$env:FIXED_ADMIN_PASSWORD = '원하는-강한-관리자-비밀번호'
powershell -ExecutionPolicy Bypass -File .\scripts\start_all_in_one.ps1현재 확인 가능한 운영 절차:
- 환경 변수 설정
- backend/postgres/redis/qdrant 및 compose 프론트 스택 시작
- 고정 관리자 계정 보장
- 핵심 URL 헬스체크
현재 docker-compose.yml 기준으로 직접 올라오는 서비스는 아래와 같습니다.
| 서비스 | 구분 | 기본 포트/접근 | 비고 |
|---|---|---|---|
postgres |
필수 | 내부 서비스 | 메인 DB |
redis |
필수 | 내부 서비스 | 작업 큐/렌더 큐 |
qdrant |
선택적 연결 | 6333 |
벡터 저장소. 현재 고급 검색 공개 라우트는 제거됨 |
backend |
필수 | 8000 |
FastAPI |
video-worker |
필수 | 내부 서비스 | 광고/영상 렌더 worker |
frontend-marketplace |
필수 | 내부 서비스 | 공개 메인 Next.js 런타임 |
frontend-admin |
필수 | 내부 서비스 | 관리자 Next.js 런타임 |
nginx |
게이트웨이 | 8080 / 8443 (.env override 가능) |
compose 내부 nginx |
현재 compose에는
Grafana,MinIO컨테이너가 포함되어 있지 않습니다.MinIO는host.docker.internal:9000외부 의존성으로 연결합니다.
powershell -ExecutionPolicy Bypass -File .\scripts\ops_health_check.ps1- API 문서: http://127.0.0.1:8000/docs
- Qdrant: http://127.0.0.1:6333
- 공개 메인 진입 URL: https://metanova1004.com/marketplace
- 관리자 기본 진입 URL: https://metanova1004.com/admin
- Marketplace (Frontend Dev, 선택):
http://127.0.0.1:3000/marketplace - Admin Dashboard (Frontend Dev, 선택):
http://127.0.0.1:3005/admin - 프로덕션: https://개발분석114.com
외부 의존성:
- MinIO API:
host.docker.internal:9000 - MinIO Console: 환경에 따라 별도 운영 (현재 compose 미포함)
운영 상태(실측 기준): 현재 직접 검증된 기본 진입 URL은
https://metanova1004.com/marketplace,https://metanova1004.com/admin입니다.성능 검증 기준: 로컬 백엔드 성능 측정은
http://127.0.0.1:8000또는 운영 도메인 기준으로만 기록합니다.localhost는 호스트 연결 편차가 커서 성능 회귀 기준에서 제외합니다.포트 기준: 운영 경로는 compose 프런트 컨테이너를 nginx가 라우팅합니다. 로컬 Next 개발 서버는
3000(Marketplace) /3005(Admin Dashboard) 직접 개발용으로만 사용하고, 백엔드는8000, Qdrant는6333입니다.3001은 사용하지 않습니다.compose 내부 nginx 포트는 기본값 기준
8080/8443이며,.env로 override될 수 있습니다. 별도 호스트 nginx/포트 포워딩이 활성화된 환경에서는 실측 기준 기본 진입 URL(443)이 우선입니다.기준 진입 URL: 공개 메인은
https://metanova1004.com/marketplace, 관리자 전용은https://metanova1004.com/admin입니다. 개발 서버 직접 진입은 각각http://127.0.0.1:3000/marketplace,http://127.0.0.1:3005/admin을 사용합니다.
운영자는 아래 표 기준만 사용합니다.
| 목적 | 표준 명령 | 비고 |
|---|---|---|
| 전체 시작 | npm run start:platform |
backend + worker + frontend + nginx |
| 전체 중지 | npm run stop:platform |
전체 플랫폼 종료 |
| 상태 점검 | npm run health:platform |
운영 헬스체크 |
| 관리자 계정 보장 | npm run ensure:admin |
FIXED_ADMIN_PASSWORD 필요 |
| 백엔드만 시작 | npm run start:backend |
DB/redis/qdrant/minio/backend/worker |
| 백엔드만 중지 | npm run stop:backend |
백엔드 스택만 종료 |
| 관리자 프런트 빌드 | npm run build:admin |
frontend/frontend 빌드 |
| 프런트 빌드 | npm run build:frontend |
현재는 frontend/frontend 기준 |
- 평소 운영 시작:
npm run start:platform - 평소 운영 종료:
npm run stop:platform - 장애 확인:
npm run health:platform - 부분 작업이 아니면
start:backend단독 사용보다start:platform을 우선합니다.
npm run start:all→npm run start:platformnpm run stop:all→npm run stop:platformnpm run health:ops→npm run health:platform
npm run start:frontend-dualnpm run stop:frontend-dualnpm run build:marketplace
| 항목 | 운영/게이트웨이 기준 | 개발 직접 진입 기준 |
|---|---|---|
| 공개 메인 | https://metanova1004.com/marketplace |
http://127.0.0.1:3000/marketplace |
| 관리자 | https://metanova1004.com/admin |
http://127.0.0.1:3005/admin |
| 백엔드 API | nginx 또는 도메인 경유 | http://127.0.0.1:8000 |
| nginx 포트 | compose 기본 8080/8443, 환경에 따라 host gateway 443 가능 |
미사용 |
| 프런트 실행 | compose 내부 frontend-marketplace / frontend-admin 사용 |
필요 시 host dev server 직접 사용 |
| 결제 | 시뮬레이션 완료 반영 흐름 | 동일 |
- 운영 비밀값은 더 이상
.env에 실제 값 자체를 두는 방식만 전제하지 않는다. - backend는 아래 항목에 대해
환경변수명또는환경변수명_FILE방식을 지원한다.MINIO_ACCESS_KEY/MINIO_ACCESS_KEY_FILEMINIO_SECRET_KEY/MINIO_SECRET_KEY_FILEPAYMENT_API_KEY/PAYMENT_API_KEY_FILEVIDEO_EXTERNAL_API_KEY/VIDEO_EXTERNAL_API_KEY_FILEVIDEO_DEDICATED_ENGINE_API_KEY/VIDEO_DEDICATED_ENGINE_API_KEY_FILE
- JWT 비밀키는
SECRET_KEY또는SECRET_KEY_FILE방식으로 운영한다. - 관리자 계정 고정 비밀번호는
.env가 아니라 OS 환경변수FIXED_ADMIN_PASSWORD로 주입한다.
권장 방식:
- 실제 비밀값은 운영 호스트의 외부 파일 또는 시스템 환경변수에 저장
.env에는 필요 시 파일 경로(*_FILE)만 기록- 외부 엔진 API 키는 backend 컨테이너만 읽도록 제한
- 프런트 컨테이너에는 외부 엔진 API 키를 주입하지 않음
예시:
SECRET_KEY_FILE=D:/secrets/codeai/jwt_secret.txt
MINIO_SECRET_KEY_FILE=D:/secrets/codeai/minio_secret.txt
VIDEO_DEDICATED_ENGINE_API_KEY_FILE=D:/secrets/codeai/dedicated_engine_api_key.txt
VIDEO_EXTERNAL_API_KEY_FILE=D:/secrets/codeai/video_external_api_key.txt운영 원칙:
- 외부 엔진 API 키는
backend/video-worker에서만 사용 - 관리자 UI는 키 값을 직접 보관하지 않고, backend의 시스템 설정/프록시 경로로만 접근
- 키 교체 시
.env의 실제 비밀 문자열을 수정하지 말고 외부 파일 내용을 교체하거나 시스템 환경변수를 갱신
장애 시 우선순위는 프런트 프로세스 → nginx → backend/video-worker → 전체 스택 순서로 최소 범위 복구입니다.
- 프런트 dev server만 재기동
powershell -ExecutionPolicy Bypass -File .\scripts\stop_frontend_dual.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\start_frontend_dual.ps1- nginx 게이트웨이만 재기동
docker compose stop nginx
docker compose up -d nginx- backend / video-worker 재기동
docker compose up -d --build backend video-worker- 전체 운영 진입 복구
powershell -ExecutionPolicy Bypass -File .\scripts\stop_all_in_one.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\start_all_in_one.ps1- 복구 확인
powershell -ExecutionPolicy Bypass -File .\scripts\ops_health_check.ps1| 구분 | 실제 경로/위치 | 설명 |
|---|---|---|
| Postgres 데이터 | Docker volume codeai_postgres-data |
운영 DB 영속 볼륨 |
| Qdrant 데이터 | Docker volume codeai_qdrant-data |
벡터 저장소 영속 볼륨 |
| 업로드 루트 | 호스트 ./uploads → 컨테이너 /app/uploads |
MARKETPLACE_HOST_ROOT 미지정 시 기본 경로 |
| Marketplace 로컬 파일 | uploads/marketplace_local |
MinIO fallback 및 샘플 ZIP 보관 |
| 고객 self-run 결과 | uploads/projects/customer_<user_id>/runs/<project> |
publish/재실행 대상 산출물 루트 |
| self-run 임시/최종 비디오 | uploads/tmp/final_video_outputs 또는 job output_dir |
ffmpeg 최종 출력 및 로그 |
| self-run ffmpeg 로그 | <output_dir>/<basename>.log |
API log_path와 동일한 실제 호스트 파일 |
| 프런트 PID/런타임 정보 | .runtime/*.pid |
start_frontend_dual.ps1 / stop_frontend_dual.ps1 사용 |
| TLS 인증서 | certbot/local-certs |
nginx 로컬 인증서 마운트 |
| backend 코드/컨테이너 마운트 | ./backend → /app/backend |
재빌드/재기동 시 반영 |
| feature execution 추적 | DB 테이블 feature_execution_logs |
trace_id, flow_id, step_id, action 기록 |
| feature retry 추적 | DB 테이블 feature_retry_queue |
재시도 큐/오류 기록 |
| customer completion 추적 | DB 테이블 customer_orchestrator_completions |
output_dir, gate_passed, override_used 기록 |
백업 예시:
# Postgres dump
docker exec -e PGPASSWORD=changeme devanalysis114-postgres pg_dump -U admin -d devanalysis114 > .\reports\devanalysis114-backup.sql
# uploads 스냅샷
Compress-Archive -Path .\uploads -DestinationPath .\reports\uploads-backup.zip -Force| 항목 | 상태 | 설명 |
|---|---|---|
| 인증/로그인 | 구현됨 | 실제 로그인/리다이렉트 검증 완료 |
| 마켓 목록/상세 | 구현됨 | 실제 페이지 렌더 및 상세 진입 검증 완료 |
| 업로드 | 구현됨 | 실제 업로드 후 상세 생성 검증 완료 |
| 구매/다운로드 | 구현됨 | 구매 생성, 완료 반영, 다운로드 토큰 발급 검증 완료 |
| 결제 | 보류(시뮬레이션) | 실결제 아님. 완료 반영 페이지 기반 |
| 리뷰 공개 UI | 구현됨 | 공개 상세 페이지에서 리뷰 조회/통계/작성 폼 연결 및 검증 완료 |
| 고급 검색 | 제거 완료 | 미등록 경로/파일 제거 |
| Stripe 실결제 | 제거 완료 | 미등록 경로/서비스 제거 |
powershell -ExecutionPolicy Bypass -File .\scripts\start_all_in_one.ps1위 명령은 아래를 순차 실행합니다.
- 고정 관리자 계정 보장 + backend/postgres 기동
- 프론트 재기동 (marketplace=
3000, admin=3005) - 핵심 URL 헬스체크 출력
localhost는 로컬 인증서 SAN에 포함되어 있지 않아 경고가 날 수 있습니다. 관리자 PowerShell에서 아래를 1회 실행하세요.
powershell -ExecutionPolicy Bypass -File .\scripts\setup_local_domain_hosts.ps1실행 후 접속:
현재 nginx는 certbot/local-certs/fullchain.pem, privkey.pem을 읽습니다. 공인 인증서 발급 스크립트는 Certbot으로 실제 인증서를 발급/갱신한 뒤 이 경로로 자동 동기화하고 nginx를 reload합니다.
사전 조건:
metanova1004.com,개발분석114.com,api.개발분석114.comDNS가 현재 서버 공인 IP를 가리켜야 합니다.- 외부에서
80,443포트가 현재 서버까지 도달해야 합니다. .env의SSL_EMAIL이 실제 수신 가능한 메일이어야 합니다.
실행 예시:
# 실제 발급
powershell -ExecutionPolicy Bypass -File .\scripts\manage_public_tls_cert.ps1 -CertAction issue
# Let's Encrypt staging으로 사전 검증
powershell -ExecutionPolicy Bypass -File .\scripts\manage_public_tls_cert.ps1 -CertAction issue -UseStaging
# 명령만 확인
powershell -ExecutionPolicy Bypass -File .\scripts\manage_public_tls_cert.ps1 -CertAction issue -DryRun
# 기존 인증서 갱신
powershell -ExecutionPolicy Bypass -File .\scripts\manage_public_tls_cert.ps1 -CertAction renew운영 관찰 메모:
- 2026-03-13 시점 공용 DNS(8.8.8.8)에서는
metanova1004.com,xn--114-2p7l635dz3bh5j.com,api.xn--114-2p7l635dz3bh5j.com모두211.218.172.124로 해석됐습니다. - 같은 시점 현재 PC의 hosts에는
metanova1004.com만127.0.0.1로 고정돼 있어, 이 PC에서 보는 응답은 공용 경로와 다를 수 있습니다.
| 서비스 | 포트 | 설명 |
|---|---|---|
| PostgreSQL | 5432 | 메인 데이터베이스 |
| Redis | 6379 | 캐시 & 세션 |
| Qdrant | 6333 | 벡터 DB |
| Backend | 8000 | FastAPI (GPU 지원) |
| Video Worker | 내부 | 광고 비디오 큐 소비용 워커 |
| Nginx | 8080, 8443 | 리버스 프록시 + SSL |
외부/별도 의존:
- MinIO
- Certbot 인증서 경로
- Grafana / Prometheus (현재 루트 compose 기준 기본 포함 아님)
개발분석114.com/
├── backend/
│ ├── main.py # FastAPI 앱 진입점
│ ├── auth_router.py # 인증 API
│ ├── admin_router.py # 관리자 API
│ ├── video_api_router.py # 비디오 호환 API
│ ├── llm/ # 오케스트레이터/LLM 제어
│ ├── marketplace/ # 마켓플레이스 도메인
│ └── image/ # 이미지 생성 API
├── frontend/ # Marketplace Next.js 앱
│ └── frontend/ # Admin Next.js 앱
├── scripts/
│ ├── start_all_in_one.ps1 # 전체 시작
│ ├── stop_all_in_one.ps1 # 전체 중지
│ ├── ops_health_check.ps1 # 운영 점검
│ └── ensure_fixed_admin_account.ps1
├── docker-compose.yml
├── Dockerfile.backend
└── README.md
| 모델 | 크기 | 특징 | 추천도 |
|---|---|---|---|
| Qwen2.5-Coder-14B | 10.2GB | 코딩 특화 | ⭐⭐⭐⭐⭐ |
| Mistral-Nemo-12B | 8.5GB | 범용 추론 | ⭐⭐⭐⭐ |
| Yi-1.5-16B | 11.3GB | 다국어 | ⭐⭐⭐⭐ |
| CodeLlama-20B | 14.1GB | 코드 생성 | ⭐⭐⭐⭐ |
현재 구현 기준:
- 위 표의 모델들은 GGUF 다운로드 후보입니다.
- 현재 백엔드 런타임은
LLM_MODEL_PATH를 직접 읽는 llama.cpp 경로가 아니라 Ollama 모델 태그를 사용합니다. - 따라서 GGUF 파일만 내려받아
models/에 두면 바로 적용되지 않고, Ollama에 별도 등록해야 런타임에서 사용됩니다. - RTX 5090 현행 기본값은
qwen2.5-coder:32b이며, 초기 14B/20B 구성으로 운영하려면 해당 GGUF를 Ollama 태그로 등록하거나 llama.cpp 로더를 새로 구현해야 합니다.
현재 저장소에는 자동 설치 스크립트가 포함돼 있지 않습니다.
현재 기준 준비 방식:
- Ollama에 사용할 모델 태그를 준비합니다.
- 런타임 설정 또는
.env에서 해당 태그를 참조하도록 맞춥니다. - GGUF 파일을 직접 보관하는 경우에도, 바로 사용되는 것이 아니라 Ollama 등록 또는 별도 로더 구현이 필요합니다.
- GPU 검증
# 1. 로그인
POST /api/auth/login
# 2. 프로젝트 업로드
POST /api/marketplace/projects
- title: "AI 챗봇 시스템"
- price: 50000 (KRW)
- category_id: 1
- file: project.zip
# 3. 파일 업로드
POST /api/marketplace/projects/{id}/upload# 1. 프로젝트 검색
GET /api/marketplace/projects?search=AI&category=backend
# 2. 상세 정보
GET /api/marketplace/projects/{id}
# 3. 구매
POST /api/marketplace/purchase
- project_id: 123
- payment_method: "card"
# 4. 다운로드
GET /api/marketplace/download/{token} POST /api/marketplace/projects/{project_id}/reviews
- project_id: 123
- rating: 5
- comment: "훌륭한 프로젝트입니다!"# Domain
DOMAIN_NAME=xn--114-2p7l635dz3bh5j.com
DOMAIN_ORIGINAL=개발분석114.com
# Database
POSTGRES_PASSWORD=your-secure-password
# JWT
JWT_SECRET_KEY=your-jwt-secret
# MinIO
MINIO_ROOT_PASSWORD=your-minio-password
# LLM GGUF 원본 파일(보관/등록용)
LLM_MODEL_PATH=./models/qwen2.5-coder-32b-instruct-q5_k_m.gguf
LLM_GPU_LAYERS=50
LLM_CONTEXT_SIZE=8192
# LLM 라우팅 기본값 (RTX 5090: 32B 우선)
LLM_MODEL_DEFAULT=qwen2.5-coder:32b
LLM_MODEL_REASONING=qwen2.5-coder:32b
LLM_MODEL_CODING=qwen2.5-coder:32b
LLM_MODEL_CHAT=qwen2.5-coder:32b
LLM_MODEL_VOICE_CHAT=qwen2.5-coder:32b
LLM_MODEL_PLANNER=qwen2.5-coder:32b
LLM_MODEL_CODER=qwen2.5-coder:32b
LLM_MODEL_REVIEWER=qwen2.5-coder:32b
LLM_MODEL_DESIGNER=qwen2.5-coder:32b
LLM_MODEL_SMART_PLANNER=qwen2.5-coder:32b
LLM_MODEL_SMART_EXECUTOR=qwen2.5-coder:32b
LLM_MODEL_SMART_DESIGNER=qwen2.5-coder:32b
# 역할별 권장 분리
# - 추론: LLM_MODEL_REASONING
# - 코딩: LLM_MODEL_CODING
# - 일반 챗봇: LLM_MODEL_CHAT
# - 음성 챗봇 응답: LLM_MODEL_VOICE_CHAT
# - 세부 오케스트레이터/스마트 라우터는 위 값들을 기본 fallback으로 사용
# 오케스트레이터 강제 완성(부분 산출물 금지)
ORCH_FORCE_COMPLETE=true
ORCH_MIN_FILES=10
ORCH_MIN_DIRS=2
ORCH_MAX_FORCE_RETRIES=99
ORCH_REQUIRED_FILES=README.md,requirements.txt,app/main.py,app/routes.py,tests/test_health.py,.gitignoreDNS 설정 (가비아/호스팅케이알):
A 레코드:
호스트: @
값: [서버 IP]
CNAME 레코드:
호스트: www
값: xn--114-2p7l635dz3bh5j.com
- 계약 파일:
backend/marketplace/contracts/dedicated_engine_contract.v1.json - 목적: 하드웨어 전용 엔진 구축 후 백엔드에 즉시 연동 가능한 고정 규격
- 고정 정책:
duration_seconds=60,cut_seconds=10,cut_count=6
권장 환경 변수:
VIDEO_DEDICATED_ENGINE_URL=https://video-engine.your-domain.com/dedicated
VIDEO_DEDICATED_ENGINE_API_KEY=replace-with-token
VIDEO_DEDICATED_SUBMIT_PATH=/jobs
VIDEO_DEDICATED_TIMEOUT_SEC=900
VIDEO_DEDICATED_POLL_SEC=2
VIDEO_ENGINE_FALLBACK_TO_INTERNAL=false
VIDEO_REQUIRE_GENERATIVE_ENGINE=true
VIDEO_ALLOW_LOCAL_DEDICATED_ENGINE=false주의:
VIDEO_REQUIRE_GENERATIVE_ENGINE=true이면localhost,127.0.0.1,host.docker.internal:18081,mock엔진 URL은 거부됩니다.- 즉, 실사용 장면 재현형 광고를 위해 실제 text-to-video 전용 엔진 URL을 반드시 설정해야 합니다.
자체 엔진(로컬/사내 서버) 모드:
- 자체 서버를 dedicated 엔진으로 사용할 때는 아래 값을 사용합니다.
VIDEO_DEDICATED_ENGINE_URL=http://host.docker.internal:18082
VIDEO_DEDICATED_SUBMIT_PATH=/jobs
VIDEO_ALLOW_LOCAL_DEDICATED_ENGINE=true
VIDEO_REQUIRE_GENERATIVE_ENGINE=true- 자체 엔진 서버 실행(파워셸 컷 분할 + concat 파이프라인):
erpowshell -ExecutionPolicy Bypass -File .\scripts\start_self_dedicated_engine.ps1 -Port 18082- 얼굴 기준 고정 + 스타일 자동 생성(권장):
SELF_ENGINE_REQUIRE_FACE_IMAGE=true
SELF_ENGINE_MAX_RETRY=2
SELF_ENGINE_MIN_VIDEO_BYTES=200000
SELF_ENGINE_MIN_VIDEO_BYTES_PER_SEC=8000
SELF_ENGINE_MIN_DURATION_RATIO=0.75
SELF_ENGINE_MIN_DURATION_SECONDS=2.0-
위 설정은 얼굴 기준 이미지가 없는 주문을 즉시 실패시키고, 렌더 결과가 너무 짧거나 파일이 비정상적으로 작은 경우 자동 재시도를 수행합니다. 파일 크기 검증은
기본 최소 바이트와초당 최소 바이트를 함께 사용하므로 5초 샘플과 60초 본편에 같은 고정 임계값을 강제하지 않습니다. -
오케스트레이터 생성물(폴더/파일) D드라이브 고정 저장:
MARKETPLACE_HOST_ROOT=D:/marketplace
MARKETPLACE_UPLOAD_ROOT=/app/uploads
MARKETPLACE_RETENTION_DAYS=30
MARKETPLACE_TEMP_RETENTION_DAYS=7
AD_DOWNLOAD_MIN_NOTICE_MINUTES=60
AD_DOWNLOAD_WINDOW_DAYS=30
AD_DOWNLOAD_MAX_COUNT=2-
docker-compose.yml에서${MARKETPLACE_HOST_ROOT}:/app/uploads로 바인딩되며, 고객 오케스트레이터 결과물은D:/marketplace/projects/customer_{user_id}/...경로에 자동 생성됩니다. -
사용자 다운로드 자산(프로젝트/산출물)은
MARKETPLACE_RETENTION_DAYS기준(기본 30일)으로 보관됩니다. -
임시 파일은 컨테이너
/tmp대신/app/uploads/tmp를 사용하고,MARKETPLACE_TEMP_RETENTION_DAYS기준(기본 7일)으로 정리되어 컨테이너 writable layer 잔여를 최소화합니다. -
광고 영상 다운로드는 품질/운영 정책으로 주문 후
AD_DOWNLOAD_MIN_NOTICE_MINUTES(기본 60분) 이후부터 가능하며,AD_DOWNLOAD_WINDOW_DAYS(기본 30일) 이내,AD_DOWNLOAD_MAX_COUNT(기본 2회)로 제한됩니다. -
생성형 엔진 모드 추가(옵션):
SELF_ENGINE_GENERATIVE_PROVIDER=local-diffusers
SELF_ENGINE_GENERATIVE_ENABLED=true
SELF_ENGINE_GENERATIVE_FALLBACK_COMPOSITOR=true
SELF_ENGINE_GENERATIVE_SUBMIT_URL=https://your-generative-engine/api/jobs
SELF_ENGINE_GENERATIVE_STATUS_URL_TEMPLATE=https://your-generative-engine/api/jobs/{job_id}
SELF_ENGINE_GENERATIVE_API_KEY=replace-with-token
SELF_ENGINE_GENERATIVE_TIMEOUT_SEC=1200
SELF_ENGINE_GENERATIVE_POLL_SEC=3
SELF_ENGINE_GENERATIVE_VIDEO_URL_FIELD=video_url
SELF_ENGINE_LOCAL_VIDEO_PIPELINE=i2vgen-xl
SELF_ENGINE_LOCAL_VIDEO_MODEL_ID=ali-vilab/i2vgen-xl
SELF_ENGINE_LOCAL_VIDEO_WIDTH=704
SELF_ENGINE_LOCAL_VIDEO_HEIGHT=512
SELF_ENGINE_LOCAL_VIDEO_NUM_FRAMES=24
SELF_ENGINE_LOCAL_VIDEO_STEPS=20
SELF_ENGINE_LOCAL_VIDEO_GUIDANCE=9.0
SELF_ENGINE_LOCAL_VIDEO_MAX_UNIQUE_CLIPS=3
SELF_ENGINE_LOCAL_VIDEO_PAD_TO_CUT=true
SELF_ENGINE_LOCAL_VIDEO_OUTPUT_FPS=30-
동작 방식:
SELF_ENGINE_GENERATIVE_PROVIDER=local-diffusers이면 같은 서버 GPU에서 Hugging Face Diffusers 기반 image-to-video 모델을 직접 실행- 기본 공개 모델은
ali-vilab/i2vgen-xl이며, gated 저장소 인증 없이 바로 내려받아 실행 가능 - 공개 비디오 API의
delivery_profile=general은30fps기준,delivery_profile=youtube_web은60fps기준으로 출력 프리셋을 전달 - 내부적으로는 실제 모델 소스 프레임보다 출력 FPS와 프레임 보간을 우선 제어해 더 부드러운 결과를 만들고, 합성 경로는 전체 프레임 기준의 일관된 배경 구도를 우선 사용
- 1분 모드 기본값은
5초 컷 x 12개타임라인을 만들되, 서버 부하를 낮추기 위해 기본적으로 최대 3개의 고유 컷만 생성하고 반복 배치하여 60초를 구성 - 생성형 엔진 ON 시 먼저 생성형 경로를 실행
- 실패 시
SELF_ENGINE_GENERATIVE_FALLBACK_COMPOSITOR=true이면 기존 합성 파이프라인으로 자동 폴백
-
서버 구현 파일:
scripts/self_dedicated_engine_server.pyscripts/self_dedicated_chunk_pipeline.ps1
템플릿 파일:
.env.production.example
연동 확인:
powershell -ExecutionPolicy Bypass -File .\scripts\test_ad_video_order_e2e.ps1 -EngineType dedicated_engine -MaxWaitSec 600POST /api/auth/register- 회원가입POST /api/auth/login- 로그인POST /api/auth/refresh- 토큰 갱신GET /api/auth/me- 내 정보- 외 8개...
POST /api/marketplace/projects- 프로젝트 업로드GET /api/marketplace/projects- 프로젝트 목록POST /api/marketplace/purchase- 구매GET /api/marketplace/download/{token}- 다운로드- 외 4개...
GET /api/admin/system-settings- 운영 설정 조회POST /api/admin/workspace-self-run- 관리자 자기 실행 요청POST /api/llm/orchestrate- 오케스트레이터 실행GET /api/llm/runtime-config- 런타임 설정 조회
전체 API 문서: http://127.0.0.1:8000/docs
import requests
# 로그인
response = requests.post("http://127.0.0.1:8000/api/auth/login", json={
"username": "user@example.com",
"password": "password"
})
token = response.json()["access_token"]
# 프로젝트 업로드
files = {"file": open("project.zip", "rb")}
data = {
"title": "AI 챗봇",
"price": 50000,
"category_id": 1
}
headers = {"Authorization": f"Bearer {token}"}
response = requests.post(
"http://127.0.0.1:8000/api/marketplace/projects",
files=files,
data=data,
headers=headers
)
print(response.json())- ✅ JWT 인증 (Access + Refresh)
- ✅ bcrypt 비밀번호 해싱
- ✅ SQL Injection 방지
- ✅ XSS 방지
- ✅ CSRF 방지
- ✅ Rate Limiting
- ✅ Input Validation
- ✅ Security Headers
- ✅ Audit Logging
- ✅ 외부 엔진 연동용 API 키 설정
- ✅ HTTPS (Let's Encrypt)
- 시스템 메트릭: CPU, 메모리, GPU, 디스크
- API 성능: 응답 시간, 처리량, 에러율
- 사용자 활동: 로그인, 프로젝트 업로드, 구매
- 자율 시스템: 진단, 개선, 배포 이벤트
접속: http://127.0.0.1:3000
기본 계정: admin / admin
# NVIDIA Docker 설치 확인
nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.1-base nvidia-smi# 사용 중인 포트 확인
sudo lsof -i :8000
# 프로세스 종료
sudo kill -9 <PID># PostgreSQL 상태 확인
docker compose logs postgres
docker compose restart postgresMIT License - 자유롭게 사용, 수정, 배포 가능합니다.
이슈 및 PR은 언제나 환영합니다!
- 문서: docs/
- API 문서: http://127.0.0.1:8000/docs
- 이슈: GitHub Issues
- 이메일: support@개발분석114.com
- 음성 입출력 (Whisper + TTS)
- 멀티모달 (이미지 이해/생성)
- React Native 모바일 앱
- RAG 시스템 (벡터 검색)
- 플러그인 시스템 확장
- 팀 협업 기능
Made with ❤️ by Level 3 Autonomous AI
지금까지 전체 작업에서 사용한 명령어를 카테고리별로 정리해 드립니다.
# 1) 전체 시작
powershell -ExecutionPolicy Bypass -File ".\scripts\start_all_in_one.ps1"
# 2) 전체 중지
powershell -ExecutionPolicy Bypass -File ".\scripts\stop_all_in_one.ps1"
# 3) 운영 점검
powershell -ExecutionPolicy Bypass -File ".\scripts\ops_health_check.ps1"
# 4) 고정 관리자 계정 보장(필요 시)
powershell -ExecutionPolicy Bypass -File ".\scripts\ensure_fixed_admin_account.ps1"권장 사용 순서:
- 처음 띄울 때
start_all_in_one.ps1 - 동작 이상 시
ops_health_check.ps1 - 종료 시
stop_all_in_one.ps1
# 작업 디렉토리 이동 (항상 먼저 실행)
Set-Location C:\Users\WORK\source\repos\parkcheolhong\codeAI
# 전체 중지
docker compose down
# 백엔드만 재시작 (빠름, 코드 변경 반영)
docker compose restart backend
# 전체 시작 (백그라운드)
docker compose up -d
# 백엔드 이미지 완전 재빌드 (Dockerfile 변경 시)
docker compose build --no-cache backend
# 재빌드 후 재시작
docker compose build --no-cache backend
docker compose up -d
# 컨테이너 상태 확인
docker compose ps# 최근 25줄 로그
docker compose logs backend --tail=25
# 라우터 로딩 상태만 필터링
docker compose logs backend 2>&1 | Select-String "WARN|ERROR|error|warn|skip|OK"
# 실시간 로그 스트리밍
docker compose logs backend -f# PostgreSQL DB 직접 조회
docker exec devanalysis114-postgres psql -U admin -d devanalysis114 -c "SELECT id, email, username, is_admin FROM users LIMIT 5;"
# 백엔드 Python 직접 실행 (import 테스트)
docker exec devanalysis114-backend python -c "import sys; sys.path.insert(0,'/app'); from backend.auth_router import router; print('auth OK')"
# User 모델 컬럼 확인
docker exec devanalysis114-backend python -c "
import sys; sys.path.insert(0, '/app')
from backend.models import User
print([c.name for c in User.__table__.columns])
"
# 비밀번호 재해시 (DB 반영)
docker exec devanalysis114-backend python -c "
import sys, bcrypt
sys.path.insert(0, '/app')
from backend.database import SessionLocal
from backend.models import User
db = SessionLocal()
user = db.query(User).filter(User.email == '119cash@naver.com').first()
if user:
new_hash = bcrypt.hashpw('space0215@'.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
user.password = new_hash
db.commit()
print('재해시 완료:', new_hash[:20])
else:
print('유저 없음')
db.close()
"# 기본 헬스 체크
Invoke-WebRequest -Uri "http://127.0.0.1:8000/api/health" -UseBasicParsing
# 등록된 전체 라우트 조회
Invoke-WebRequest -Uri "http://127.0.0.1:8000/openapi.json" -UseBasicParsing |
ConvertFrom-Json | Select-Object -ExpandProperty paths | Get-Member -MemberType NoteProperty | Select-Object Name# 로그인 (토큰 발급)
$response = Invoke-WebRequest `
-Uri "http://127.0.0.1:8000/api/auth/login" `
-Method POST `
-ContentType "application/x-www-form-urlencoded" `
-Body "username=119cash%40naver.com&password=space0215%40"
# 토큰 추출
$token = ($response.Content | ConvertFrom-Json).access_token
echo $token
# /me 엔드포인트 (내 정보 조회)
Invoke-WebRequest `
-Uri "http://127.0.0.1:8000/api/auth/me" `
-Headers @{"Authorization" = "Bearer $token"} `
-UseBasicParsing# LLM 상태 확인
Invoke-WebRequest -Uri "http://127.0.0.1:8000/api/llm/status" -UseBasicParsing
# LLM 오케스트레이터 호출
$body = '{"task":"코드 리뷰해줘", "context":"Python FastAPI"}'
Invoke-WebRequest `
-Uri "http://127.0.0.1:8000/api/llm/orchestrate" `
-Method POST `
-ContentType "application/json" `
-Headers @{"Authorization" = "Bearer $token"} `
-Body $body# 전체 유저 목록
Invoke-WebRequest `
-Uri "http://127.0.0.1:8000/api/admin/users" `
-Headers @{"Authorization" = "Bearer $token"} `
-UseBasicParsing# 주요 백엔드 파일
Test-Path "backend\auth.py"
Test-Path "backend\auth_router.py"
Test-Path "backend\admin_router.py"
Test-Path "backend\main.py"
Test-Path "backend\llm\orchestrator.py"
# 주요 프론트엔드 파일
Test-Path "frontend\frontend\app\admin\page.tsx"
Test-Path "frontend\frontend\app\admin\users\page.tsx"
Test-Path "frontend\frontend\app\admin\llm\page.tsx"
Test-Path "frontend\frontend\.env.local"
# 한 번에 전체 확인
@(
"backend\auth.py",
"backend\auth_router.py",
"backend\admin_router.py",
"backend\llm\orchestrator.py",
"frontend\frontend\app\admin\users\page.tsx",
"frontend\frontend\app\admin\llm\page.tsx"
) | ForEach-Object { "$_ : $(Test-Path $_)" }# .env.local 내용
Get-Content "frontend\frontend\.env.local"
# main.py 전체
Get-Content "backend\main.py"
# auth_router.py 전체
Get-Content "backend\auth_router.py"
# 파일 첫 20줄만
Get-Content "backend\auth.py" | Select-Object -First 20# 트리 구조 출력
Get-ChildItem -Path "backend" -Recurse -Filter "*.py" |
Select-Object FullName, @{N="Size(KB)";E={[math]::Round($_.Length/1KB,1)}}# 포트 3005 사용 중인 PID 확인
netstat -ano | findstr ":3005"
# 해당 PID 종료 (예: 48396)
Stop-Process -Id 48396 -Force
# 루트에서 바로 시작
npm run dev:admin
# 또는 프론트엔드 디렉토리로 이동 후 직접 시작
Set-Location "frontend\frontend"
npm run dev -- --port 3005
# .next 캐시 초기화 후 재시작 (페이지 인식 안될 때)
Push-Location "frontend\frontend"
Remove-Item -Recurse -Force ".next"
npm run dev -- --port 3005
Pop-Location# 각 admin 페이지 상태 확인
Invoke-WebRequest -Uri "http://127.0.0.1:3005/admin" -UseBasicParsing | Select-Object StatusCode
Invoke-WebRequest -Uri "http://127.0.0.1:3005/admin/users" -UseBasicParsing | Select-Object StatusCode
Invoke-WebRequest -Uri "http://127.0.0.1:3005/admin/llm" -UseBasicParsing | Select-Object StatusCodeStart-Process "http://127.0.0.1:3005/admin/login"
Start-Process "http://127.0.0.1:3005/admin"
Start-Process "http://127.0.0.1:3005/admin/users"
Start-Process "http://127.0.0.1:3005/admin/llm"docker exec devanalysis114-backend python -c "import bcrypt; print(bcrypt.__version__)"
docker exec devanalysis114-backend python -c "import passlib; print(passlib.__version__)"docker exec devanalysis114-postgres psql -U admin -d devanalysis114 -c "\dt"docker exec devanalysis114-backend python -c "
import sys; sys.path.insert(0,'/app')
try:
from backend.auth_router import router; print('[OK] auth_router')
except Exception as e: print('[FAIL] auth_router:', e)
try:
from backend.admin_router import router; print('[OK] admin_router')
except Exception as e: print('[FAIL] admin_router:', e)
try:
from backend.llm.orchestrator import router; print('[OK] orchestrator')
except Exception as e: print('[FAIL] orchestrator:', e)
"# 1) 후보만 점검 (실제 이동 없음)
powershell -ExecutionPolicy Bypass -File ".\scripts\archive_workspace_redundant.ps1" -DryRun
# 2) D드라이브로 실제 보관 이동
powershell -ExecutionPolicy Bypass -File ".\scripts\archive_workspace_redundant.ps1"# 빠른 정렬(이미지 재빌드 없이)
powershell -ExecutionPolicy Bypass -File ".\scripts\ensure_local_uniform_state.ps1" -SkipBuild
# 완전 정렬(이미지 포함 재정렬)
powershell -ExecutionPolicy Bypass -File ".\scripts\ensure_local_uniform_state.ps1"# 현재 운영 상태 점검
powershell -ExecutionPolicy Bypass -File ".\scripts\ops_health_check.ps1"Run Ops Health CheckEnsure Fixed Admin AccountStart Frontend DualStop Frontend DualStart Platform StackStop Platform Stack
| 상황 | 명령어 |
|---|---|
| 코드 수정 후 반영 확인 | docker compose logs backend --tail=10 |
| 라우터 로딩 실패 | docker exec ... python -c "from backend.xxx import router" |
| 로그인 테스트 | Invoke-WebRequest ... /api/auth/login |
| 토큰으로 인증 테스트 | Invoke-WebRequest ... -Headers @{"Authorization"="Bearer $token"} |
| 운영 상태 점검 | powershell -ExecutionPolicy Bypass -File ".\scripts\ops_health_check.ps1" |
| 프론트 새 페이지 안보임 | Push-Location frontend/frontend; Remove-Item -Recurse -Force .next; npm run dev -- --port 3005; Pop-Location |
| 전체 재빌드 | docker compose down 후 docker compose build --no-cache backend, docker compose up -d |
- 운영 점검 실행:
powershell -ExecutionPolicy Bypass -File ".\scripts\ops_health_check.ps1" -
README.md의 운영 명령어 섹션과 실제 스크립트/태스크 이름 일치 여부 확인 - VS Code Problems 기준 Markdown 오류 0건 확인 (
README.md)
현재 문서는 남아 있는 운영 스크립트 기준으로만 정리되어 있습니다.
1단계 — 파일 다운로드:
| 파일 | 설명 |
|---|---|
| health_check.py | 메인 Python 헬스체크 스크립트 |
| health_check.ps1 | PowerShell 실행기 (가상환경 자동 활성화) |
2단계 — 프로젝트 루트에 복사:
# 다운로드한 파일을 프로젝트 루트에 복사
Copy-Item "health_check.py" "C:\Users\WORK\source\repos\parkcheolhong\codeAI\"
Copy-Item "health_check.ps1" "C:\Users\WORK\source\repos\parkcheolhong\codeAI\"3단계 — 실행:
# 방법 1: PowerShell 스크립트로 실행 (권장)
Set-Location C:\Users\WORK\source\repos\parkcheolhong\codeAI
.\health_check.ps1
# 방법 2: Python 직접 실행
python health_check.py| 섹션 | 테스트 항목 | 내용 |
|---|---|---|
| 🖥️ SYSTEM | 4개 | /health, /api/health, /docs, /openapi.json |
| 🔐 AUTH | 3개 | 로그인·JWT발급, /me, 회원가입 엔드포인트 |
| 👑 ADMIN | 2개 | 유저 목록, 프로젝트 목록 (관리자 전용) |
| 🤖 LLM | 8개 | status, health, models, model-map, agents, orchestrate, smart, designer-drafts |
| 🛒 MARKETPLACE | 9개 | 프로젝트 목록, 구매내역, 어시스턴트, stats 3종, advanced 3종 |
| 📁 FILES | 1개 | MinIO 파일 엔드포인트 |
| 🌐 FRONTEND | 4개 | /admin/login, /admin, /admin/users, /admin/llm |
| ⚡ OLLAMA | 2개 | /api/tags (모델 목록), /api/version |
╔══════════════════════════════════════════════════════════════╗
║ 🏥 METANOVA codeAI — 전체 시스템 헬스체크 ║
║ 시각: 2026-03-02 12:30:00 ║
╚══════════════════════════════════════════════════════════════╝
──── 1️⃣ SYSTEM HEALTH ────
✅ GET /health [200] 12ms → status: ok
✅ GET /api/health [200] 8ms → status: ok
✅ GET /docs (Swagger UI) [200] 45ms
✅ GET /openapi.json [200] 23ms → 33 endpoints 등록됨
──── 2️⃣ AUTH ENDPOINTS ────
✅ POST /api/auth/login [200] 89ms → JWT 발급 성공
✅ GET /api/auth/me [200] 34ms → id=5 is_admin=True
...
📊 헬스체크 최종 결과 요약
████████████████████████████████████░░░░ 30/33 (90%)
🖥️ SYSTEM 4개 0개 ✅ ALL OK
🔐 AUTH 3개 0개 ✅ ALL OK
🤖 LLM 8개 0개 ✅ ALL OK
🛒 MARKETPLACE 6개 3개 ⚠️ 3개 실패 (advanced_router)