f78949c21a
Build & Deploy / build-and-deploy (push) Failing after 9s
Backend (server/): - Fastify + Prisma + PostgreSQL 16 - JWT 인증 (bcrypt) + 카카오 OAuth (/auth/kakao — kapi.kakao.com 호출) - REST API: auth, users, family, policies, claims, score, notifications, diagnosis, consults - 실제 보험점수 알고리즘 (카테고리별 가중치·최소보장 기반) - Multipart 업로드 (영수증/진단서 → 디스크 persistence) - Swagger UI /docs Client: - api/client.ts + api/endpoints.ts (fetch 래퍼 + AsyncStorage 토큰) - 인증 스토어 (hydrate/login/register/kakao/logout) - 로그인/회원가입 화면 + 카카오 버튼 - 홈/내보험/가족/점수/청구 API 연동 (pull-to-refresh) - 보험 추가 모달 + 가족 구성원 추가 모달 - 로그인 전/후 스택 분기 (RootNavigator) Infra: - docker-compose.yml (로컬 Postgres+API) - server/Dockerfile (Prisma migrate deploy + node) - deploy/k8s/postgres.yaml (StatefulSet + 10Gi PVC) - deploy/k8s/api.yaml (Deployment + Ingress api.insurance.junggomoa.com) - CI workflow 확장 (web + api 동시 빌드·배포) - POSTGRES_PASSWORD / JWT_SECRET Gitea Secrets 추가 필요 - 반응형 웹 레이아웃 (max-width 480px 폰 프레임) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import Fastify from 'fastify';
|
|
import cors from '@fastify/cors';
|
|
import jwt from '@fastify/jwt';
|
|
import multipart from '@fastify/multipart';
|
|
import swagger from '@fastify/swagger';
|
|
import swaggerUi from '@fastify/swagger-ui';
|
|
|
|
import { prismaPlugin } from './plugins/prisma';
|
|
import { authPlugin } from './plugins/auth';
|
|
import { registerRoutes } from './routes';
|
|
|
|
export async function buildApp() {
|
|
const app = Fastify({
|
|
logger: {
|
|
transport: process.env.NODE_ENV !== 'production' ? { target: 'pino-pretty', options: { colorize: true } } : undefined,
|
|
},
|
|
});
|
|
|
|
await app.register(cors, {
|
|
origin: (origin, cb) => cb(null, true),
|
|
credentials: true,
|
|
});
|
|
|
|
await app.register(jwt, {
|
|
secret: process.env.JWT_SECRET ?? 'dev-secret-change-me-in-prod',
|
|
sign: { expiresIn: '7d' },
|
|
});
|
|
|
|
await app.register(multipart, {
|
|
limits: { fileSize: 10 * 1024 * 1024 },
|
|
});
|
|
|
|
await app.register(swagger, {
|
|
openapi: {
|
|
info: { title: 'Insurance API', version: '1.0.0' },
|
|
components: {
|
|
securitySchemes: {
|
|
bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
await app.register(swaggerUi, { routePrefix: '/docs' });
|
|
|
|
await app.register(prismaPlugin);
|
|
await app.register(authPlugin);
|
|
|
|
app.get('/health', async () => ({ ok: true, ts: Date.now() }));
|
|
|
|
await registerRoutes(app);
|
|
|
|
return app;
|
|
}
|