Files
comrelay/.env.development.example
ttipo da65799e2a fix: 업무 첨부 저장 경로에 볼륨 연결
backend 컨테이너에 볼륨이 없어 업무 첨부가 컨테이너 내부에만 쌓였고,
재배포로 컨테이너가 교체될 때 파일이 모두 사라졌다. DB 의 첨부 레코드는
남아 있어 목록에는 보이지만 다운로드는 실패한다.

- backend 에 UPLOAD_DIR=/app/uploads 주입 + ${UPLOAD_DATA_DIR} 볼륨 연결
- 루트 env 예시에 UPLOAD_DATA_DIR 추가(다른 *_DATA_DIR 과 동일한 규격)

이미 유실된 파일은 복구되지 않는다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 23:37:21 +09:00

99 lines
4.3 KiB
Bash

# ==========================================
# 루트 .env (development) — 모든 설정의 단일 진실 공급원(SSOT)
# docker-compose 가 이 값을 backend/frontend/db/redis 에 주입한다.
# .example 을 복사해 만들고 실제 값으로 채운다. (커밋 금지)
# ==========================================
# ==========================================
# 프로젝트 전역
# ==========================================
PROJECT_NAME=comrelay
APP_ENV=development
BUILD_MODE=development
FRONTEND_DIR=frontend
BACKEND_DIR=backend
# ==========================================
# 포트
# ==========================================
FRONTEND_PORT=5273
BACKEND_PORT=3100
WEBSOCKET_PORT=3101
DB_PORT=5532
REDIS_PORT=6479
# ==========================================
# Database (PostgreSQL)
# ==========================================
DB_IMAGE=postgres:15-alpine
DB_USER=dev_ttipo
DB_PASSWORD=change-me-db-password
DB_NAME=comrelay_db
DB_DATA_DIR=./data/postgres
# ==========================================
# Redis
# ==========================================
REDIS_IMAGE=redis:7-alpine
REDIS_PASSWORD=change-me-redis-password
REDIS_DATA_DIR=./data/redis
# ==========================================
# 업로드(업무 첨부)
# ==========================================
# UPLOAD_DATA_DIR: 업무 첨부 파일 보관 경로(호스트). 컨테이너의 /app/uploads 에 마운트된다.
# 볼륨이 없으면 재배포 시 첨부 파일이 유실된다.
UPLOAD_DATA_DIR=./data/uploads
# ==========================================
# API 경로
# ==========================================
# BACKEND_API_URL: 프론트 빌드에 주입(VITE_API_BASE_URL)
# CORS_ORIGIN : 백엔드가 허용할 프론트 오리진
BACKEND_API_URL=http://localhost:3100/api
CORS_ORIGIN=http://localhost:5273
# ==========================================
# AI (백엔드·프론트 공통)
# ==========================================
# AI_TIMEOUT_MS: AI 요청 타임아웃(ms). 백엔드 Claude 호출 abort + 프론트 axios 에 동일 적용.
# 프론트에는 build arg VITE_AI_TIMEOUT_MS 로 주입된다.
AI_TIMEOUT_MS=60000
# ==========================================
# 화상회의 (LiveKit Cloud)
# ==========================================
# 개발은 LiveKit Cloud(무료 dev)를 사용한다. https://cloud.livekit.io 에서 프로젝트 생성 후
# Settings → Keys 에서 발급된 값을 채운다. 코드 변경 없이 env 만으로 동작한다.
# LIVEKIT_API_KEY / LIVEKIT_API_SECRET : 백엔드 입장 토큰(JWT) 서명용 (절대 커밋 금지)
# LIVEKIT_WS_URL : 브라우저 → LiveKit 접속 URL. Cloud 는 wss://<project>.livekit.cloud
# (build arg/런타임 env 로 VITE_LIVEKIT_URL 에 주입)
# LIVEKIT_URL : 백엔드 → LiveKit 서버 API(RoomService 등) 주소. 보통 LIVEKIT_WS_URL 과 동일.
# (단계 1 토큰 발급은 오프라인이라 아직 미사용)
# 운영: .env.production 에 운영용 키/URL 만 넣으면 그대로 전환된다(셀프호스팅 시 자체 URL/키 사용).
LIVEKIT_API_KEY=APIxxxxxxxxxxxx
LIVEKIT_API_SECRET=your-livekit-cloud-api-secret
LIVEKIT_WS_URL=wss://your-project.livekit.cloud
LIVEKIT_URL=wss://your-project.livekit.cloud
# ==========================================
# 드라이브 (NCP Object Storage / S3 호환)
# ==========================================
# 파일 업로드/저장용 오브젝트 스토리지. NCP 콘솔에서 버킷 생성 후 값을 채운다.
# 비시크릿(endpoint/region/bucket)만 루트에 두고, ACCESS/SECRET 키는 backend/.env 에 둔다.
# OBJECT_STORAGE_ENDPOINT : NCP 리전 엔드포인트(서울: https://kr.object.ncloudstorage.com)
# OBJECT_STORAGE_REGION : 리전명(NCP: kr-standard)
# OBJECT_STORAGE_BUCKET : 버킷명(환경별로 분리 권장, 예: comrelay-dev)
OBJECT_STORAGE_ENDPOINT=https://kr.object.ncloudstorage.com
OBJECT_STORAGE_REGION=kr-standard
OBJECT_STORAGE_BUCKET=comrelay-dev
# ==========================================
# 웹 푸시 알림 (Web Push / VAPID)
# ==========================================
# 비밀 아닌 값만 루트에서 주입. 키페어 생성:
# node -e "console.log(require('web-push').generateVAPIDKeys())"
# PRIVATE_KEY 는 backend/.env.<APP_ENV> 에 작성(시크릿). 공개키는 프론트 빌드에도 주입됨.
VAPID_PUBLIC_KEY=
VAPID_SUBJECT=mailto:admin@example.com