# NEXPA SourceHub 3.8 · Production Candidate 실제 `sourcehub.nexpa-ai.com` 교체를 목표로 3.7을 Production Hardening한 버전입니다. ## 3.8 핵심 변경 ### 1. 로그인 Gate OIDC 모드에서는 미인증 사용자가 `/`에 접근해도 내부 대시보드를 제공하지 않습니다. 로그인 화면만 표시하며 `/static/index.html` 직접 접근 경로도 제거했습니다. ### 2. 파일 악성코드 검사 업로드 파일을 임시 영역에 먼저 저장 → SHA-256 계산 → ClamAV 검사 → 정상 파일만 Local/MinIO 저장소에 반영합니다. ### 3. 만료형 다운로드 고정 다운로드 URL 대신 로그인 사용자가 짧게 유효한 HMAC 서명 링크를 발급받습니다. 기본 TTL: 300초. ### 4. CSRF / Session / Security Headers - OIDC 모드 CSRF 기본 활성화 - Secure Cookie 환경 설정 - Trusted Host 제한 - CSP / X-Frame-Options / nosniff / Referrer Policy / Permissions Policy - HSTS 옵션 ### 5. 통제된 배포 실행 임의 shell 명령 실행을 허용하지 않습니다. 서버 환경변수에 사전 등록한 배포 Webhook Target만 배포 담당자가 실행할 수 있습니다. 모든 배포 Gate가 완료되어야 실행 가능합니다. ### 6. DB Migration Alembic 포함. ```bash alembic upgrade head ``` ### 7. Backup / Restore ```bash python scripts/backup.py --out backups python scripts/restore.py --db --storage --yes-really-restore ``` SQLite/Local 저장소는 실제 복구 테스트를 포함했습니다. PostgreSQL은 pg_dump/pg_restore를 사용합니다. ### 8. 운영 인프라 - SQLite ↔ PostgreSQL - Local ↔ MinIO - Mock ↔ NEXPA Core OIDC - Gitea Connector - ClamAV ## 로컬 실행 ```bash python -m pip install -r requirements.txt scripts/start.sh ``` Windows: ```bat scripts\start_windows.bat ``` ## Production Candidate 실행 `.env.production.example`을 복사해 실제 비밀값을 입력한 후: ```bash docker compose -f docker-compose.production.yml up -d --build ``` 상세 전환 절차: `PRODUCTION_DEPLOYMENT.md` ## 테스트 ```bash pytest -q ``` ## 현재 남은 실제 배포 의존성 코드가 아니라 서버 측 값이 필요합니다. - NEXPA Core 실제 OIDC Metadata/Client ID/Secret - 실제 PostgreSQL 비밀번호 - MinIO Credentials - Gitea URL/Token/Repo Binding - 실제 CI/CD Webhook Target/Secret - TLS 인증서 및 서버 접근 권한 이 값이 없는 상태에서는 Production Ready라고 표시하지 않도록 설계되어 있습니다.