이 프로젝트는 인천대학교 앱센터 통합 AI 서버입니다. 외부에 노출되는 운영 웹 서버는 Spring Boot 하나만 사용하고, 현재는 유니돔 전용 API와 공용 AI API를 함께 제공하며, 앞으로 다른 프로젝트용 AI API를 같은 서버 안에 계속 추가할 수 있도록 정리합니다.
기존 FastAPI 웹 레이어는 운영 경로에서 제거했고, archive/fastapi-web-layer 아래에 참고용으로만 보관합니다.
- 프로젝트 전용 API
현재
/unidorm - 공용 AI API
현재
/shared - 향후 확장 방식
다른 프로젝트 API는
/{project-prefix}형태로 같은 서버 안에 추가
src/main/javaSpring Boot API, 인증, 관리자 기능, 운영 로직src/main/resources/bridge/bridge_server.pySpring Boot가 내부적으로 기동하는 Python 브리지runtime/python/unidorm유니돔 전용 AI 엔진, 크롤러, 데이터, DB, 로그runtime/python/shared공용 AI 로직과 관련 데이터runtime/python/projects향후 다른 프로젝트별 Python 런타임 확장 영역runtime/python/.env내부 Python 런타임 환경 변수archive/fastapi-web-layer기존 FastAPI 웹 서버와 라우터 보관본
- 외부 요청은 Spring Boot 서버만 받습니다.
- Python은 내부 런타임으로만 남겨두고, Spring Boot가 브리지와 크롤러를 직접 호출합니다.
- 기존 FastAPI 서버는 별도로 실행하지 않습니다.
- 현재 API 계약과 응답 형식은 최대한 유지하면서 통합 서버 구조로 확장합니다.
- 기본 안전 모드 서버 포트:
18080 - 기본 안전 모드 브리지 포트:
18081 - 운영 프로필 서버 포트:
1024
운영에서는 Spring Boot만 1024 포트로 실행하면 됩니다.
mvn spring-boot:run특징:
- 포트
18080 - 스케줄러 비활성화
- 런타임 파일 쓰기 비활성화
Swagger:
.\start-production.ps1또는
mvn spring-boot:run -Dspring-boot.run.profiles=production특징:
- 포트
1024 - 내부 Python 브리지 자동 기동
- 스케줄러 활성화
- 관리자 쓰기 및 재구성 기능 활성화
- 실행 전 루트에 남아 있던 구 FastAPI 잔여물 정리 시도
운영 Swagger:
운영 배포는 docker-compose.production.yml 기준으로 진행합니다.
핵심 원칙:
- 운영 서버는 Docker의
production프로필로만 실행 - 운영 설정/상태/관리자 입력은 MySQL을 우선 저장소로 사용
- 운영 데이터는 Docker volume으로 분리
- 새 이미지를 배포해도
unidorm/data,unidorm/db,shared/data, 로그는 유지 - 개발은 로컬에서 하고, 검증된 버전만 새 이미지 태그로 운영 반영
준비:
Copy-Item .\docker\.env.production.example .\docker\.env.productiondocker/.env.production 에서 아래 값을 반드시 채웁니다.
APPCENTER_AI_JWT_SECRET_KEYSHARED_API_KEYUNIDORM_INTERNAL_API_KEYOLLAMA_HOSTAPPCENTER_AI_MYSQL_PASSWORDMYSQL_ROOT_PASSWORD- 필요하면
HOST_PORT,JAVA_OPTS
배포:
$env:APP_IMAGE_TAG="2026.03.28-001"
docker compose -f .\docker-compose.production.yml build
docker compose -f .\docker-compose.production.yml up -d롤백:
$env:APP_IMAGE_TAG="2026.03.28-000"
docker compose -f .\docker-compose.production.yml up -d주의:
docker compose down -v는 운영 데이터 volume까지 삭제하므로 사용하지 않습니다.- 관리자
available-modelsAPI 는 컨테이너 안에ollamaCLI가 없으면 빈 목록을 돌려줄 수 있습니다. 챗/추출 자체는OLLAMA_HOST가 연결되면 계속 동작합니다.
기본 Python 런타임 루트는 아래 설정을 사용합니다.
appcenter-ai:
runtime-root-dir: runtime/python배포 환경에서 절대 경로를 명시하려면 아래처럼 설정할 수 있습니다.
appcenter-ai:
runtime-root-path: C:/deploy/springboot-unidorm/runtime/pythonPython 실행 명령을 고정하고 싶으면 아래처럼 설정합니다.
appcenter-ai:
python-command:
- py
- -3MySQL 1차 전환 설정 예시:
appcenter-ai:
mysql:
enabled: true
host: mysql
port: 3306
database: appcenter_ai
username: appcenter
password: your-passwordGET /POST /unidorm/auth/loginPOST /unidorm/chatPOST /unidorm/notice-search(BearerUNIDORM_INTERNAL_API_KEY)POST /unidorm/reloadGET /unidorm/POST /shared/extract-scheduleGET/POST/PUT/DELETE /unidorm/admin/...
- 현재는 운영 웹 서버 단일화가 완료된 상태입니다.
- 다만 AI 엔진과 크롤러는 내부 Python 런타임으로 유지됩니다.
src/main/resources/bridge/bridge_server.py는 내부 브리지 구현에 FastAPI 라이브러리를 사용하지만, 운영 웹 서버로 별도 배포하거나 외부에 직접 노출하지는 않습니다.- Python 의존성까지 완전히 제거하려면 AI 엔진, 일정 추출기, 크롤러/DB 재구성 로직을 Java로 재구현하는 2차 작업이 필요합니다.