mirror of
https://github.com/nad4-su/meeting-minutes.git
synced 2026-10-11 15:50:13 +09:00
fix: Docker 실행 경로에서 화자 분리가 동작하도록 수정
Docker로 띄우면 화자 분리가 전혀 되지 않았다. 세 가지 문제가 겹쳐 있었다. 1. 베이스 이미지가 Alpine(musl)인데 sherpa-onnx 사전 빌드 바이너리는 glibc에 링크되어 있어 ld-linux-aarch64.so.1 을 찾지 못했다. node:22-slim 으로 교체. 2. Next 파일 트레이싱이 sherpa-onnx.node 만 복사하고 동반 공유 라이브러리 (libonnxruntime, libsherpa-onnx-c-api 등 약 33MB)를 놓쳤다. outputFileTracingIncludes 로 플랫폼 패키지를 통째로 포함시킨다. 3. models/ 가 이미지에도 볼륨에도 없어 컨테이너 안에서는 항상 미설치 상태였다. 호스트의 models/ 를 읽기 전용으로 마운트한다. 추가로 app 컨테이너에 LLM_* 환경변수를 전달한다. GEMINI_API_KEY만 넘기고 있어서 OpenAI 호환 프로바이더를 환경변수로 설정할 수 없었다. 컨테이너 안에서 실제 오디오로 화자 분리가 도는 것을 확인했다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
73d5790dcc
commit
874cf11a7a
4 files changed
+26
-3
No files matched your search
+8
-3
@@ -1,4 +1,6 @@
|
|||||||
FROM node:22-alpine AS base
|
# sherpa-onnx 사전 빌드 바이너리가 glibc에 링크되어 있어 Alpine(musl)에서는
|
||||||
|
# ld-linux-aarch64.so.1 을 찾지 못한다. glibc 계열인 slim 을 쓴다.
|
||||||
|
FROM node:22-slim AS base
|
||||||
|
|
||||||
FROM base AS deps
|
FROM base AS deps
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
@@ -15,8 +17,8 @@ RUN npm run build
|
|||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
RUN addgroup --system --gid 1001 nodejs
|
RUN groupadd --system --gid 1001 nodejs \
|
||||||
RUN adduser --system --uid 1001 nextjs
|
&& useradd --system --uid 1001 --gid nodejs nextjs
|
||||||
COPY --from=builder /app/public ./public
|
COPY --from=builder /app/public ./public
|
||||||
COPY --from=builder /app/.next/standalone ./
|
COPY --from=builder /app/.next/standalone ./
|
||||||
COPY --from=builder /app/.next/static ./.next/static
|
COPY --from=builder /app/.next/static ./.next/static
|
||||||
@@ -24,6 +26,9 @@ COPY --from=builder /app/prisma ./prisma
|
|||||||
|
|
||||||
RUN mkdir -p uploads && chown nextjs:nodejs uploads
|
RUN mkdir -p uploads && chown nextjs:nodejs uploads
|
||||||
|
|
||||||
|
# sherpa-onnx의 .so는 표준 검색 경로에 없으므로 명시해준다.
|
||||||
|
ENV LD_LIBRARY_PATH=/app/node_modules/sherpa-onnx-linux-arm64:/app/node_modules/sherpa-onnx-linux-x64
|
||||||
|
|
||||||
USER nextjs
|
USER nextjs
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
ENV PORT=3000
|
ENV PORT=3000
|
||||||
|
|||||||
@@ -124,6 +124,10 @@ Next.js 프로세스에서 실행합니다. **오디오가 외부로 나가지
|
|||||||
npm run setup:diarization
|
npm run setup:diarization
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> Docker로 실행하실 때도 **호스트에서** 위 명령을 먼저 실행하세요. `models/` 디렉터리가
|
||||||
|
> 컨테이너에 읽기 전용으로 마운트됩니다. 받지 않으면 대면 모드만 비활성화되고 나머지는
|
||||||
|
> 정상 동작합니다.
|
||||||
|
|
||||||
> 💡 **참석자 수를 정확히 입력하세요.** 자동 추정은 화자 수를 잘못 세는 것이 주 실패
|
> 💡 **참석자 수를 정확히 입력하세요.** 자동 추정은 화자 수를 잘못 세는 것이 주 실패
|
||||||
> 모드입니다. 실측에서 4인 오디오가 자동 모드로는 5명, 참석자 수를 알려주면 4명으로
|
> 모드입니다. 실측에서 4인 오디오가 자동 모드로는 5명, 참석자 수를 알려주면 4명으로
|
||||||
> 정확히 나왔습니다.
|
> 정확히 나왔습니다.
|
||||||
|
|||||||
@@ -43,8 +43,17 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
DATABASE_URL: postgresql://${POSTGRES_USER:?required}:${POSTGRES_PASSWORD:?required}@db:5432/${POSTGRES_DB:?required}
|
DATABASE_URL: postgresql://${POSTGRES_USER:?required}:${POSTGRES_PASSWORD:?required}@db:5432/${POSTGRES_DB:?required}
|
||||||
GEMINI_API_KEY: ${GEMINI_API_KEY:-}
|
GEMINI_API_KEY: ${GEMINI_API_KEY:-}
|
||||||
|
# OpenAI 호환 프로바이더 (선택) — 없으면 브라우저에 저장된 설정을 쓴다
|
||||||
|
LLM_PROVIDER: ${LLM_PROVIDER:-}
|
||||||
|
LLM_BASE_URL: ${LLM_BASE_URL:-}
|
||||||
|
LLM_MODEL: ${LLM_MODEL:-}
|
||||||
|
LLM_API_KEY: ${LLM_API_KEY:-}
|
||||||
|
DIARIZATION_MODEL_DIR: /app/models/diarization
|
||||||
volumes:
|
volumes:
|
||||||
- uploads:/app/uploads
|
- uploads:/app/uploads
|
||||||
|
# 화자 분리 모델 — 호스트에서 npm run setup:diarization 으로 받은 것을 읽기 전용으로 마운트.
|
||||||
|
# 없으면 빈 디렉터리가 되고 대면 화자 분리만 비활성화된다 (앱은 정상 동작).
|
||||||
|
- ./models:/app/models:ro
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ const nextConfig: NextConfig = {
|
|||||||
output: "standalone",
|
output: "standalone",
|
||||||
// sherpa-onnx-node는 네이티브 애드온이라 번들링하면 안 된다.
|
// sherpa-onnx-node는 네이티브 애드온이라 번들링하면 안 된다.
|
||||||
serverExternalPackages: ["sherpa-onnx-node"],
|
serverExternalPackages: ["sherpa-onnx-node"],
|
||||||
|
// 트레이싱은 .node 파일만 잡고 동반 공유 라이브러리(.so/.dylib)를 놓친다.
|
||||||
|
// 플랫폼 패키지를 통째로 포함시켜야 standalone 빌드에서 로드된다.
|
||||||
|
outputFileTracingIncludes: {
|
||||||
|
"/api/diarize": ["./node_modules/sherpa-onnx-*/**"],
|
||||||
|
},
|
||||||
async headers() {
|
async headers() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user