Files
insurance/deploy/k8s/api.yaml
T
chpark cfd550bed8
Deploy via SSH / remote-deploy (push) Failing after 6s
feat: AI판정/OCR/알림톡/소셜로그인/푸시/CODEF 전체 구현 + CI SSH 전환
Backend (server/src):
- services/anthropic.ts — Claude API 래퍼 (키 없으면 룰베이스 fallback)
- services/ocr.ts — Naver Clova + Google Vision 듀얼 연동 + 영수증 필드 파서
- services/solapi.ts — 카카오 알림톡 HMAC 서명 + 드라이런
- services/expoPush.ts — Expo Push API 전송
- services/codef.ts — 보험 통합조회 mock + 실연동 포인트
- routes/ai.ts, ocr.ts, devices.ts, social.ts (naver/apple), alimtalk.ts, codef.ts
- Prisma: PushDevice 모델 + binaryTargets linux-musl-openssl-3.0.x
- Dockerfile: apk add openssl (Prisma schema engine 정상화)
- api-secrets에 9개 외부 API 키 슬롯 추가 (optional)

Frontend:
- api/endpoints.ts: aiApi, ocrApi, deviceApi, socialApi, codefApi
- services/kakao.ts — Kakao JS SDK 동적 로드 + Auth.login
- services/push.ts — expo-notifications 권한/토큰 등록 + 서버 전송
- LoginScreen — 카카오/네이버/애플 버튼 (웹은 토큰 입력 fallback)
- AIJudgeScreen — 실제 /ai/claim-judge 호출, source(llm/rules) 표시
- ClaimScreen — 영수증 촬영 시 자동 OCR → 병원/날짜/제목 자동 기입
- useAuthStore hydrate 시 푸시 토큰 등록

Infra:
- eas.json (development/preview/production 빌드 프로필)
- API_KEYS.md — 9개 외부 서비스 발급/등록 가이드
- scripts/deploy-remote.sh 개선 (sudo 정확히, traefik cp 버그 수정, API fail 시 로그 출력)
- deploy/k8s/api.yaml — 외부 API 키 환경변수 매핑 (optional=true)

CI/CD:
- .gitea/workflows/deploy.yml → SSH 기반으로 전환
  (appleboy/ssh-action으로 서버 접속 → deploy-remote.sh 실행)
- 필요 Secrets: SSH_HOST, SSH_USER, SSH_PASSWORD

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 00:56:06 +09:00

124 lines
3.7 KiB
YAML

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uploads
namespace: insurance
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: insurance-api
namespace: insurance
labels:
app.kubernetes.io/name: insurance-api
spec:
replicas: 2
revisionHistoryLimit: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app.kubernetes.io/name: insurance-api
template:
metadata:
labels:
app.kubernetes.io/name: insurance-api
spec:
containers:
- name: api
image: localhost:5000/insurance/api:latest
imagePullPolicy: Always
ports:
- name: http
containerPort: 4000
env:
- name: PORT
value: "4000"
- name: HOST
value: "0.0.0.0"
- name: NODE_ENV
value: production
- name: UPLOAD_DIR
value: /data/uploads
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: api-secrets
key: jwtSecret
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: api-secrets
key: databaseUrl
- name: ANTHROPIC_API_KEY
valueFrom: { secretKeyRef: { name: api-secrets, key: anthropicApiKey, optional: true } }
- name: CLOVA_OCR_URL
valueFrom: { secretKeyRef: { name: api-secrets, key: clovaOcrUrl, optional: true } }
- name: CLOVA_OCR_SECRET
valueFrom: { secretKeyRef: { name: api-secrets, key: clovaOcrSecret, optional: true } }
- name: GCP_VISION_API_KEY
valueFrom: { secretKeyRef: { name: api-secrets, key: gcpVisionApiKey, optional: true } }
- name: SOLAPI_API_KEY
valueFrom: { secretKeyRef: { name: api-secrets, key: solapiApiKey, optional: true } }
- name: SOLAPI_API_SECRET
valueFrom: { secretKeyRef: { name: api-secrets, key: solapiApiSecret, optional: true } }
- name: SOLAPI_PFID
valueFrom: { secretKeyRef: { name: api-secrets, key: solapiPfId, optional: true } }
- name: SOLAPI_SENDER_KEY
valueFrom: { secretKeyRef: { name: api-secrets, key: solapiSenderKey, optional: true } }
- name: CODEF_CLIENT_ID
valueFrom: { secretKeyRef: { name: api-secrets, key: codefClientId, optional: true } }
- name: CODEF_CLIENT_SECRET
valueFrom: { secretKeyRef: { name: api-secrets, key: codefClientSecret, optional: true } }
readinessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 30
periodSeconds: 20
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
volumeMounts:
- name: uploads
mountPath: /data/uploads
volumes:
- name: uploads
persistentVolumeClaim:
claimName: uploads
---
apiVersion: v1
kind: Service
metadata:
name: insurance-api
namespace: insurance
labels:
app.kubernetes.io/name: insurance-api
spec:
type: NodePort
selector:
app.kubernetes.io/name: insurance-api
ports:
- name: http
port: 4000
targetPort: http
nodePort: 30201