지자체 돌봄 매니저를 위한 SafeHi 백엔드 서버입니다.
Node.js (Express) + Prisma (PostgreSQL) 기반, Docker Compose로 단일 명령 배포.
계정별 데이터 격리 및 프로덕션 보안 강화
- DB 스키마 전면 재설계: 모든 비즈니스 테이블(Manager, Recipient, CareLog, Visit, Memo, DashboardKPI, Notification)에
ownerIdFK 추가. 계정 간 데이터 완전 격리. - 실 JWT 인증 도입:
jsonwebtoken기반 토큰 발급/검증. 128자 hex secret. 7일 만료. 모든 데이터 엔드포인트에requireAuth미들웨어 적용. - bcrypt 비밀번호 해싱:
bcryptjs10 라운드. 평문 저장 방식 제거. - Rate Limiting: auth 엔드포인트 15분/20회, 일반 API 1분/300회 제한.
- 보안 헤더:
helmet미들웨어 적용 (XSS, MIME sniffing, clickjacking 방어). - 프로덕션 시드 정책: 신규 가입 계정은 완전히 빈 대시보드로 시작. 시드는 전역 reference data(Center/Dong/Policy)와 admin 계정만 생성.
- Docker 시크릿 분리: 모든 민감 정보를 gitignored
.env로 이동.docker-compose.yml에 하드코딩된 자격증명 제거. - 단일 클린 마이그레이션: 기존 복수 마이그레이션을
20260504000000_init_with_owner_scoping하나로 통합.
- Docker & Docker Compose
core-backend/.env파일 설정 (.env.example참고)
POSTGRES_USER=safehi
POSTGRES_PASSWORD=<강력한_랜덤_비밀번호>
POSTGRES_DB=safehi_dashboard
JWT_SECRET=<128자_hex_시크릿> # openssl rand -hex 64
JWT_EXPIRES_IN=7d
ADMIN_EMAIL=admin@safehi.kr
ADMIN_PASSWORD=<강력한_비밀번호>
CORS_ORIGINS=https://your-domain.com,http://localhost:3000
⚠️ .env파일은 절대 git에 커밋하지 마세요.
cd core-backend
# 최초 실행 (볼륨 초기화 포함)
docker compose up -d
# 코드 변경 후 재빌드
docker compose build --no-cache core
docker compose up -d core서버 기동 순서: PostgreSQL → migrate deploy → seed(최초 1회) → Node.js 서버
# 상태 확인
docker compose ps
# 헬스 체크
curl http://localhost:4100/core/health
# 로그 확인
docker compose logs --tail=200 core
# 실시간 로그
docker compose logs -f
# 완전 초기화 (볼륨 삭제 포함 — DB 데이터 전부 삭제)
docker compose down -v
docker compose up -d| 서비스 | 포트 | 설명 |
|---|---|---|
postgres |
5432 | PostgreSQL 16 |
core |
4100 | Express API 서버 |
ai_dummy |
5000 | AI 더미 서버 (STT/요약) |
/core/health — 헬스 체크 (인증 불필요)
/core/dashboard/auth/* — 인증 엔드포인트 (rate limit 강화)
/core/dashboard/* — 대시보드 데이터 API (JWT 필수)
/core/api/* — 외부 연동 API
ADMIN_PASSWORD환경변수 미설정 시NODE_ENV=production에서 서버 기동 불가 (의도된 보안 가드).- Docker
pg_data볼륨이 이미 존재하면POSTGRES_PASSWORD변경이 반영되지 않음. 비밀번호 변경 시docker compose down -v후 재시작 필요. sudo없이 docker 실행하려면sudo usermod -aG docker $USER후 재로그인.