Add dockerignore, fix Redis image, add troubleshooting docs

- Add .dockerignore for backend-java and frontend (276MB → 336KB)
- Fix Redis image to use full registry path (CRI-O compatibility)
- Update ingress TLS to www only (root domain DNS pending)
- Add comprehensive troubleshooting documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joungmin
2026-03-10 00:23:42 +09:00
parent 7a896c8c56
commit 0ad09e5b67
5 changed files with 247 additions and 2 deletions

View File

@@ -0,0 +1,4 @@
build/
.gradle/
.idea/
*.iml

239
docs/troubleshooting.md Normal file
View File

@@ -0,0 +1,239 @@
# Tasteby 배포 트러블슈팅 기록
## 1. OCI DevOps Build Pipeline - 코드 접근 권한 오류
**오류:**
```
Unable to fetch build_spec file build_spec.yaml due to RelatedResourceNotAuthorizedOrNotFound.
Please check if dynamic groups and the corresponding policies are properly configured.
```
**원인:** OCI DevOps Build Pipeline이 Code Repository에 접근할 IAM 권한이 없음
**해결:**
1. Dynamic Group 생성 — 빌드 파이프라인 리소스를 포함하는 매칭 룰:
```
ANY {
resource.type = 'devopsbuildpipeline',
resource.type = 'devopsrepository',
resource.type = 'devopsdeploypipeline',
resource.type = 'devopsconnection'
}
```
2. IAM Policy 생성:
```
Allow dynamic-group tasteby-build-pipeline to manage devops-family in tenancy
Allow dynamic-group tasteby-build-pipeline to manage repos in tenancy
Allow dynamic-group tasteby-build-pipeline to read secret-family in tenancy
Allow dynamic-group tasteby-build-pipeline to manage generic-artifacts in tenancy
Allow dynamic-group tasteby-build-pipeline to use ons-topics in tenancy
```
3. IAM 정책 전파에 수 분 소요 — 적용 후 바로 빌드하면 동일 오류 발생할 수 있음
---
## 2. OCI DevOps Build Pipeline - Logs 미설정
**오류:**
```
Logs need to be enabled in order to run the builds.
Please enable logs for your project.
```
**원인:** DevOps 프로젝트에 OCI Logging이 설정되지 않음
**해결:**
1. OCI Logging > Log Group 생성 (예: `tasteby-devops-logs`)
2. Log Group에 Service Log 생성:
- Source: `devops` 서비스
- Resource: DevOps 프로젝트 OCID
- Category: `all`
3. DevOps 프로젝트에 Notification Topic 설정 필요
---
## 3. OCI DevOps Build Pipeline - ARM64 이미지 빌드 불가
**오류:**
```
Step 'Step_CommandV1_2' failed with exit code: '1' (docker build --platform linux/arm64)
Step 'Step_CommandV1_1' failed with exit code: '125' (QEMU 설정 시도)
```
**원인:**
- OCI DevOps Managed Build는 x86_64 러너만 제공 (`OL7_X86_64_STANDARD_10`)
- ARM64 이미지를 직접 빌드할 수 없음
- `--privileged` 모드가 허용되지 않아 QEMU 크로스빌드도 불가
**해결:**
- Colima (macOS 경량 Docker) 설치로 로컬 ARM64 빌드:
```bash
brew install colima docker
colima start --arch aarch64 --cpu 2 --memory 4
```
- deploy.sh로 로컬 빌드 → OCIR push → K8s 배포
---
## 4. OCI Code Repository - HTTPS 인증 실패
**오류:**
```
fatal: Authentication failed for 'https://devops.scmservice.ap-seoul-1.oci.oraclecloud.com/...'
```
**원인:** OCI Code Repository HTTPS 인증의 username 형식이 특수함
**해결:**
- IDCS 연동 사용자의 경우 username 형식:
```
<tenancy-name>/oracleidentitycloudservice/<oci-username>
```
예시: `joungminkoaws/oracleidentitycloudservice/joungmin.ko.aws@gmail.com`
- Password: OCI Auth Token (User Settings > Auth Tokens에서 생성)
- `idyhsdamac8c` (namespace)가 아닌 `joungminkoaws` (tenancy name)을 사용해야 함
---
## 5. Docker 빌드 컨텍스트 과대 (276MB)
**증상:**
```
Sending build context to Docker daemon 276.4MB
```
**원인:** `.dockerignore` 파일이 없어 `build/`, `.gradle/`, `node_modules/` 등이 포함됨
**해결:**
- `backend-java/.dockerignore` 생성:
```
build/
.gradle/
.idea/
*.iml
```
- `frontend/.dockerignore` 생성:
```
node_modules/
.next/
.env.local
```
- 결과: 276MB → 336KB (backend), 602KB (frontend)
---
## 6. Redis ImageInspectError (OKE CRI-O)
**오류:**
```
Failed to inspect image "": rpc error: code = Unknown desc = short name mode is enforcing,
but image name redis:7-alpine returns ambiguous list
```
**원인:** OKE는 CRI-O 컨테이너 런타임을 사용하며, short name (예: `redis:7-alpine`)을 허용하지 않음
**해결:**
- 이미지명에 full registry prefix 추가:
```yaml
# 변경 전
image: redis:7-alpine
# 변경 후
image: docker.io/library/redis:7-alpine
```
---
## 7. OCIR ImagePullBackOff (K8s)
**오류:**
```
Failed to pull image "icn.ocir.io/.../backend:latest": unable to retrieve auth token:
invalid username/password: unknown: Unauthorized
```
**원인:** K8s `ocir-secret`의 username 형식이 잘못됨
**해결:**
- IDCS 사용자의 경우 OCIR pull secret 생성 시:
```bash
kubectl create secret docker-registry ocir-secret \
--docker-server=icn.ocir.io \
--docker-username='<namespace>/oracleidentitycloudservice/<username>' \
--docker-password='<auth-token>' \
-n tasteby
```
- Docker login 시에도 동일한 형식:
```bash
docker login icn.ocir.io \
-u "<namespace>/oracleidentitycloudservice/<username>"
```
---
## 8. kubectl 인증 실패
**오류:**
```
error: You must be logged in to the server (Unauthorized)
```
**원인:** kubeconfig 생성 시 OCI 프로필이 지정되지 않음
**해결:**
- `~/.kube/config`의 user args에 `--profile JOUNGMINKOAWS` 추가:
```yaml
users:
- name: user-xxx
user:
exec:
args:
- ce
- cluster
- generate-token
- --cluster-id
- ocid1.cluster.oc1...
- --region
- ap-seoul-1
- --profile # ← 추가
- JOUNGMINKOAWS # ← 추가
```
---
## 9. Let's Encrypt 인증서 발급 실패 - Timeout during connect
**오류:**
```
acme: authorization error for www.tasteby.net: 400 urn:ietf:params:acme:error:connection:
64.110.90.89: Timeout during connect (likely firewall problem)
```
**원인:** OKE VCN의 Security List에서 LB 서브넷으로의 80/443 포트가 열려있지 않음
**해결:**
1. **LB 서브넷 Security List**에 Ingress 규칙 추가:
- `0.0.0.0/0` → TCP 80 (HTTP)
- `0.0.0.0/0` → TCP 443 (HTTPS)
- Egress: `0.0.0.0/0` → All protocols
2. **노드 서브넷 Security List**에 LB→노드 Ingress 규칙 추가:
- `10.0.20.0/24` (LB 서브넷 CIDR) → TCP 30000-32767 (NodePort)
- `10.0.20.0/24` → TCP 10256 (Health check)
3. 인증서 재발급:
```bash
kubectl delete certificate tasteby-tls -n tasteby
kubectl apply -f k8s/ingress.yaml
```
---
## 10. tasteby.net (root domain) DNS 미전파
**증상:** www.tasteby.net은 되지만 tasteby.net challenge가 `pending` 상태
**원인:** Namecheap에서 @ (root) A 레코드가 설정되지 않았거나 전파가 안 됨
**해결:**
- Ingress TLS에서 www.tasteby.net만 먼저 설정하여 인증서 발급
- root domain DNS 전파 완료 후 TLS hosts에 tasteby.net 추가하고 인증서 재발급

3
frontend/.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
node_modules/
.next/
.env.local

View File

@@ -16,7 +16,6 @@ spec:
tls: tls:
- hosts: - hosts:
- www.tasteby.net - www.tasteby.net
- tasteby.net
secretName: tasteby-tls secretName: tasteby-tls
rules: rules:
- host: www.tasteby.net - host: www.tasteby.net

View File

@@ -15,7 +15,7 @@ spec:
spec: spec:
containers: containers:
- name: redis - name: redis
image: redis:7-alpine image: docker.io/library/redis:7-alpine
ports: ports:
- containerPort: 6379 - containerPort: 6379
resources: resources: