generated from ttipo/project-base
cd958f3bf4
직원이 웹메일 · 휴대폰 앱에서 무엇이 새로 생겼는지 읽는 게시판의 서버 몫이다. 글은 운영자가 backend/release-notes/ 에 글마다 파일 하나로 쓰고
(올리는 API · DB 표 · 새 에러 코드 없음), GET /api/release-notes(커서 목록)와 GET /api/release-notes/{id}(글 + 바로 옛 글 · 새 글)로 웹 · 앱에 똑같이 준다.
- 글 폴더는 src 밖이라 개발 컨테이너(바인드 마운트)는 다시 띄우지 않아도 새 글이 보이고, 운영 이미지는 Dockerfile 이 폴더를 함께 복사한다
- 틀린 글은 실행 때 그 글만 건너뛰고 error 로그(파일 이름 · 줄 · 까닭만 — 기동 때 한 번 읽어 배포 직후 보인다), 실제 폴더를 엄격하게 읽는 시험이 CI 에서 운영자의 오타를 잡는다
- 파일은 O_NOFOLLOW 로 한 번 열어 일반 파일 · 256KB 까지만 읽고, 모양이 틀린 id 도 없는 글과 같은 404 RES_001 이다
- 첫 글(2026-11-18.md)은 다음 배포 소식이다 — 파일 이름(날짜)은 배포 날로 고친다
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
backend — ARA SYSTEM API (NestJS)
웹 · 앱이 함께 쓰는 REST API 다(/api). 메일 엔진(Stalwart)을 JMAP 으로 감싸고, 로그인 세션 · 설정 · 검색 색인 · 앱 알림 · 대용량 첨부 · 운영 도구를 맡는다.
- 모듈 지도 · 개발 규칙:
.claude/skills/nestjs/SKILL.md - API 약속(웹 · 앱과 함께):
docs/mail/api-contract.md - 공통 규칙(응답 꼴 · 에러 코드 · 로그 · 보안):
CLAUDE.md
실행 — 컨테이너로
백엔드는 늘 컨테이너로 띄운다. 의존성 · lock 이 Linux 기준이라 호스트에서 npm install 하지 않는다(바꿀 때도 컨테이너 안에서 — nestjs 스킬 "의존성 추가/제거").
# 저장소 루트에서 — 개발 스택(backend + db + 메일 엔진)
docker compose -f docker-compose.yml -f docker-compose.dev.yml --env-file .env.development up -d
docker compose -f docker-compose.yml -f docker-compose.dev.yml --env-file .env.development logs -f backend
- 처음 띄우면 마이그레이션을 한 번 돌리고 watch 빌드를 시작한다(Windows 바인드 마운트라 수십 분 걸릴 수 있다). 코드를 고치면 저절로 다시 뜬다.
- Swagger: http://localhost:3000/api-docs
시험 · 검사
docker exec arasystem-backend npm run lint # 경고 0
docker exec arasystem-backend npm run test # 단위 — 메모리가 빠듯하면 -- --maxWorkers=2
docker exec arasystem-backend npx jest --config ./test/jest-e2e.json # e2e — DB · 메일 엔진 필요
컨테이너 이름은 <PROJECT_NAME>-backend(개발 기본 arasystem). Git Bash 에서 컨테이너 안 경로를 줄 때는 MSYS_NO_PATHCONV=1 을 붙인다.
자주 하는 일
- 에러 코드:
src/common/errors/error-codes.ts만 고치고 호스트에서cd backend && npm run sync:error-codes(웹 · 앱 사전이 함께 바뀐다). - DB 스키마: 엔티티를 고친 뒤
docker exec arasystem-backend npm run migration:generate -- src/migrations/<이름>→ 만든 SQL 을 눈으로 확인 → 엔티티와 함께 커밋(nestjs 스킬 "DB 마이그레이션"). - 운영 도구(운영 서버 안 명령 — 입사 · 비밀번호 재설정 · 휴대폰 앱 올리기 등):
sudo docker exec -it <PROJECT_NAME>-backend node dist/cli/ops.js— 계약 6절 · mail/README.