Repository navigation
Conversation
### Description 저의 프로덕션 클러스터 ssh 접속용 공개키를 추가합니다. ### Additional context `ansible-playbook -i inventory/production playbooks/setup_ssh_keys.yml --ask-become-pass` 위 명령 실행이 필요할 것 같습니다. --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description Iris `ServersTransport`가 참조하는 `iris-pprof-client` TLS Secret이 매니페스트에 없어 stage에서 Traefik → kube-apiserver mTLS가 실패합니다. production에는 제가 수동으로 TLS secret을 적어두었으나, 장기적으로 각 클러스터 CA로 서명한 `CN=iris-pprof` 클라이언트 인증서를 SealedSecret으로 추가하고 stage·production Iris overlay에 연결해야 합니다. Continuation of #3757, #3760 ### Additional context - 인증서는 `kubernetes.io/kube-apiserver-client` CSR로 발급한 뒤 각 클러스터 sealing 키로 봉인했습니다. - 이 인증서 교체는 Traefik → kube-apiserver 인증에만 영향을 주며 pprof basicAuth 자격증명은 바뀌지 않습니다. - 즉, pprof API를 사용하는 사용자들에게는 영향을 미치지 않습니다. - 검증: 두 overlay `kustomize build` 통과, `pprof.codedang.com`·`pprof.stage.codedang.com`의 `/pods`와 `/pod/<pod>/debug/pprof/goroutine` 200 응답. --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving
…context (#3774) ### Description production context에서 admin-api, client-api, iris pod의 DB_CONNECTION_LIMIT을 255에서 각각 25, 25, 1로 변경하였습니다. admin-api 1 * 25 client-api 3 * 25 iris 20 * 1 총 120개를 Max connection으로 제한합니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> production에는 kubectl 명령어를 통해 환경변수를 25/25/1로 주입하였습니다. git에 DB_CONNECTION_LIMIT이 설정되어도 명령어를 주입된 환경변수가 최우선 적용되기 때문에 release 브랜치에 merge 되면 수동으로 주입한 환경변수를 제거하겠습니다. ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [x] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Configuration** - Production deployments now support a database connection limit of 25 across the Admin API, Client API, and Iris services. - Updated the Iris production configuration to apply the current environment settings. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Description 문제 삭제 시 본문에 포함된 이미지 및 첨부 파일을 함께 삭제하는 로직을 비활성화합니다. 현재 문제 본문을 복사하여 새로운 문제를 생성할 경우, 첨부 파일이 새로 생성되지 않고 기존 파일 URL을 그대로 참조합니다. 이 상태에서 둘 중 하나의 문제를 삭제하면 공유 중인 파일이 삭제되어, 남아 있는 문제에서 첨부 파일이 깨지는 문제가 발생합니다. production에서의 데이터 손실을 방지하기 위해 hotfix로 첨부 파일 삭제 로직을 우선 비활성화합니다. ## Changes - 문제 삭제 시 본문의 이미지 및 첨부 파일을 DB와 S3에서 삭제하는 로직 비활성화 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Behavior Changes** - Deleting a problem no longer removes its associated attachments from storage or the file records. - Deleting an individual attachment now leaves the attachment unchanged after ownership validation. - Problem deletion still removes the problem itself and enforces ownership permissions. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description 라우팅 설정 파일 15개의 이름을 `HTTPRoutes.yaml`에서 `httproute.yaml`로 바꿉니다. 파일 내용은 그대로이고, 이름과 그 이름을 가리키는 `kustomization.yaml` 14곳만 바뀝니다. - 레포의 다른 설정 파일은 모두 소문자에 종류 이름을 그대로 씁니다(`service.yaml`, `deployment.yaml`, `service-monitor.yaml` 등). 대문자와 복수형이 섞인 건 이 파일들뿐이었습니다. - Gateway API 공식 예제([gateway-api](https://github.com/kubernetes-sigs/gateway-api/tree/main/examples/standard)), [Argo CD 차트](https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd/templates/argocd-server), [Headlamp 차트](https://github.com/headlamp-k8s/headlamp/tree/main/charts/headlamp/templates)도 `httproute.yaml`을 씁니다. ### Additional context - 배포 결과는 바뀌지 않습니다. 이름이 바뀐 파일을 쓰는 kustomization 27개를 바꾸기 전과 후에 모두 `kubectl kustomize`로 펼쳐 비교했고, 결과가 글자 하나까지 같았습니다. - `cloud-beaver`는 kustomization 없이 ArgoCD가 폴더 전체를 읽는 방식이라 파일 이름과 상관없이 동작합니다. - 함께 열려 있는 PR과의 관계: - [#3715](https://github.com/skkuding/codedang/pull/3715)는 admin-api의 이 파일을 수정합니다. git이 이름 변경을 따라가므로 보통은 자동으로 합쳐지지만, rebase할 때 한 번 확인이 필요할 수 있습니다. - [#3736](https://github.com/skkuding/codedang/pull/3736)은 frigate에 `HTTPRoutes.yaml`을 새로 추가합니다. 이 PR이 먼저 반영되면 그 파일도 `httproute.yaml`로 맞추면 좋겠습니다. Closes TAS-3013 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Chores** - Updated Kubernetes configuration references to use the lowercase `httproute.yaml` filename across services and deployment environments. - Preserved existing HTTPRoute targets and routing configuration. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…3779) ### Description 백엔드(client·admin)의 HTTP 요청 처리 시간 메트릭(`http.server.duration`)이 실제보다 **2배**로 집계되던 문제를 고칩니다. 요청 하나가 들어오면 두 곳에서 각각 기록하고 있었습니다. - `nestjs-otel`의 `apiMetrics` 기능 - OpenTelemetry의 표준 HTTP 계측 (`@opentelemetry/instrumentation-http`) 두 곳이 **같은 이름**으로 기록해서, 대시보드에서 합치면 숫자가 두 배가 됩니다. `apiMetrics`는 그대로 켜 두고, `nestjs-otel`이 만든 `http.server.duration` 하나만 버리도록 설정했습니다(OpenTelemetry의 View 기능). `apiMetrics`의 나머지 메트릭(요청·응답 크기, 요청 수 등)은 이름이 겹치지 않아 그대로 수집됩니다. **로컬 확인** (로컬 관측성 스택, client에 요청 16번) | 메트릭 | 수정 전 | 수정 후 | |---|---|---| | `http_server_duration` | 32 (두 곳에서 16 + 16) | 16 (`instrumentation-http` 한 곳) | | `http_server_request_size`, `http_server_response_size` 등 `nestjs-otel` 메트릭 | 16 | 16 (그대로) | ### Additional context 처음에는 `apiMetrics`를 통째로 끄려 했지만, 그러면 요청·응답 크기처럼 다른 곳에서는 얻을 수 없는 메트릭까지 사라져서 겹치는 하나만 버리는 방식으로 바꿨습니다. Closes TAS-3017 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * API metrics collection is restored with improved route filtering. * Unnecessary HTTP server duration metrics are no longer recorded. * Requests for `/favicon.ico` are excluded from API metrics. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description 공개 `/api/internal` 및 하위 경로를 API backend로 전달하지 않도록 Gateway API `HTTPRoute`를 추가합니다. backendRefs와 응답 필터가 없는 규칙으로 프록시에서 요청을 종료하며, 기존 Traefik 전용 `IngressRoute`·`noop@internal`·명시적 priority는 제거했습니다. ClusterIP 직접 수집은 그대로 허용합니다. ### Additional context - TAS-3004 stack의 첫 번째 PR이며 가장 먼저 병합·적용합니다. - 병합 순서: 이 PR → [backend #3770](#3770) → [Prometheus 수집 #3771](#3771). 다음 PR의 base는 부모 병합 후 main으로 변경합니다. - `main-gateway`의 HTTP와 모든 HTTPS listener에 연결합니다. HTTPS listener의 namespace 허용 목록에 `kube-system`을 추가합니다. hostnames는 제한하지 않아 각 listener가 수용하는 모든 Host에 적용됩니다. - `PathPrefix`로 `/api/internal`을 차단하고 `RegularExpression: (?i)^/api/internal(/|$)`로 Express의 대소문자 우회를 막습니다. `/api/internal-example`은 차단하지 않습니다. - 정규식 지원과 정규식 경로의 우선순위는 Gateway API의 implementation-specific 기능입니다. 프록시 교체 시 해당 지원과 우회 차단을 다시 검증해야 합니다. - 응답 코드는 기존 418에서 backend 없는 라우트의 5xx로 변경됩니다. [Gateway API 표준](https://gateway-api.sigs.k8s.io/reference/api-types/httproute/#backendrefs-optional)은 500을 정의하며, [Traefik의 빈 weighted service](https://github.com/traefik/traefik/blob/v3.5/pkg/server/service/loadbalancer/wrr/wrr.go)는 503을 반환합니다. - 실제 배포는 수행하지 않았습니다. HTTPRoute의 각 listener `Accepted=True`·`ResolvedRefs=True`, 외부 경로 및 대소문자 변형의 차단, 기존 API 정상 동작을 확인한 뒤 backend를 적용합니다. ### Validation - internal의 stage/production Kustomize 렌더링 통과. - 두 환경에서 HTTPRoute가 6개 listener에 연결 가능하며 backend·필터·Traefik 확장 참조가 없는 것을 검증. - 대소문자 변형·경로 경계 회귀 검사 통과: `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s infra/k8s/internal/tests -v`. - 변경 YAML Prettier, git diff --check, commit hooks 통과.
### Description admin과 client가 기존 PrismaService의 `$metrics.prometheus()` 결과를 반환하는 metrics endpoint를 제공합니다. admin과 stage/production client는 `/api/internal/prisma`, 개발 client는 기존 접두사 규칙에 따라 `/internal/prisma`를 사용합니다. metrics는 JWT/admin 인증 없이 수집하고 Swagger에서는 숨깁니다. AdminGuard가 인증 제외 메타데이터를 user 참조보다 먼저 확인하도록 수정해 익명 요청의 오류를 방지합니다. 기존 보호 API의 JWT·admin 권한 검사는 유지합니다. ### Additional context - TAS-3004 stack의 두 번째 PR입니다. [접근 차단 PR #3769](https://github.com/skkuding/codedang/pull/3769)을 **먼저 병합·적용**하고 외부 차단을 확인한 뒤 이 PR을 병합합니다. - 접근 차단 커밋의 amend에 맞춰 rebase했으며 backend 내용은 변경하지 않았습니다. - 병합 순서: 접근 차단 → backend → 세 번째 [Prometheus 수집 PR #3771](#3771). - 접근 차단 squash merge 후 이 브랜치를 main으로 rebase하고 PR base를 main으로 변경합니다. - 기존 Prisma 6.13.0에 metrics preview flag를 추가합니다. DB migration은 없습니다. - 새 모듈은 @libs/internal 별칭으로 참조합니다. devcontainer lock 파일은 포함하지 않습니다. - 실제 클러스터 배포는 수행하지 않았습니다. ### Validation - HTTP 테스트 14개 통과: 익명 수집·Content-Type, JWT 보호, admin 일반 사용자 403, Swagger 제외, API 접두사 중복 방지. - 본 폴더 소스의 tsc --noEmit 및 변경 TypeScript ESLint/Prettier 통과. - 최종 소스를 임시 검증 환경에 복사해 정상 macOS 의존성으로 admin/client build 및 HTTP 테스트 통과. - rebase 전후 backend 내용 동일 확인. ### Review updates Removed the custom @libs/auth/* wildcard alias; the test-only JwtStrategy import uses a relative source path. The @libs/auth and @libs/internal public barrel aliases remain. HTTP tests (14), typecheck and lint pass. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added a Prometheus metrics endpoint for Prisma database monitoring. - Metrics are available in client and admin environments with appropriate authentication and administrator access controls. - Internal metrics endpoints are excluded from generated API documentation. - **Bug Fixes** - Improved authorization handling for routes that do not require administrator access, avoiding unnecessary request and role processing. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description admin·client의 Prisma metrics를 기존 Prometheus에서 수집하도록 API별 ServiceMonitor를 추가합니다. Service label과 named http 포트로 대상 endpoint를 선택하여 `/api/internal/prisma`를 30초 간격으로 Pod별 직접 수집합니다. 기존 Prometheus의 release: prometheus selector, Grafana datasource 및 OTel pipeline을 유지합니다. README에 내부 수집과 배포 후 확인 절차를 추가합니다. ### Additional context - TAS-3004 stack의 **세 번째 PR**입니다. [접근 차단 #3769](#3769) → [backend #3770](#3770) → 이 PR 순서로 병합·적용합니다. - 기존 infra PR에서 ServiceMonitor, API Service label/port, API Kustomization 등록, 수집 문서를 분리했습니다. 공개 접근 차단 리소스와 backend 코드는 포함하지 않습니다. - backend squash merge 후 이 브랜치를 main으로 rebase하고 PR base를 main으로 변경합니다. - API endpoint가 배포된 후 ServiceMonitor를 적용하고 모든 API Pod target UP과 Grafana Explore의 prisma_pool_connections_busy 조회를 확인합니다. - 실제 클러스터 배포는 수행하지 않았습니다. devcontainer lock 파일은 포함하지 않습니다. ### Validation - admin-api/client-api의 stage/production Kustomize 렌더링 통과. - kube-prometheus-stack 79.5.0 Helm 렌더링으로 기존 ServiceMonitor selector 확인. - ServiceMonitor label·namespace·named port 연결 및 수집 경로 검증 통과. - YAML Prettier 및 commitlint hooks 통과. - 분리 전후 Service/ServiceMonitor 설정 동일 확인. README의 테스트 명령 경로를 정정했습니다. ### Review updates Rebased onto the reviewed parents. Collection configuration is unchanged; README now documents the Gateway API HTTPRoute block, listener attachment checks, case-insensitive matching, implementation-specific regexp support, and the blocking 5xx response. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added Prometheus metrics endpoints for the Admin and Client APIs. - Added automatic monitoring of API metrics every 30 seconds. - API services now provide consistent discovery labels and named HTTP ports. - **Bug Fixes** - Protected internal API routes from external forwarding while allowing monitoring through internal service endpoints. - **Documentation** - Added guidance for configuring, validating, and querying API metrics in Prometheus and Grafana. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
…#3783) ### Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving --> 기존에는 trace 저장 기본 설정이 30분이었습니다. trace를 s3 스토리지에 넣어 90일만큼 볼 수 있도록 로직을 추가하였습니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> Tempo Helm chart 1.24.0에서는 Tempo 2.9.0이 제공하는 flush_to_storage 설정을 전달할 수 없어 1.24.4로 업그레이드하였습니다. 이 설정은 과거 데이터에 대한 TraceQL metrics 조회를 위해 metrics-generator가 생성한 local-blocks를 S3에 저장하는 설정입니다. 다만 Tempo 2.x(현재 2.9.0)에서는 ingester가 생성하는 원본 trace 블록과 metrics-generator가 생성하는 TraceQL metrics용 RF1 블록이 별도로 저장됩니다. 따라서 S3에 논리적으로 중복 저장되어 스토리지 사용량이 증가합니다. Tempo 3.0에서는 하나의 trace 블록을 일반 trace 조회와 TraceQL metrics 조회에 함께 사용하여 S3 내 중복 저장 문제가 해결됩니다. 현재 사용 중인 Tempo 2.9.x는 2026년 12월 31일 유지보수가 종료될 예정입니다. 이 PR은 단기적으로 historical TraceQL metrics를 활성화하기 위한 조치이며, 장기적으로는 S3 저장 효율 개선과 지원 버전 유지를 위해 Tempo 3.0 마이그레이션이 필요합니다. --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Improvements** - Updated monitoring components to a newer Tempo release. - Local metric blocks are now flushed to object storage, improving persistence and resilience of trace-derived metrics. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description ArgoCD에서 관리되지 않던 n8n 서비스를 관리하도록 변경합니다. ### Additional context --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it.
### Description
```mermaid
flowchart LR
subgraph apps[애플리케이션]
client[client-api]
admin[admin-api]
iris[iris]
plag[plag]
end
collector[OpenTelemetry Collector]
subgraph backends[저장소]
tempo[(Tempo<br/>트레이스)]
loki[(Loki<br/>로그)]
prom[(Prometheus<br/>메트릭)]
end
grafana[Grafana<br/>localhost:3030]
client --> collector
admin --> collector
iris --> collector
plag --> collector
collector -- 트레이스 --> tempo
collector -- 로그 --> loki
collector ~~~ prom
prom -- "메트릭 수집 (:8889)" --> collector
tempo --> grafana
loki --> grafana
prom --> grafana
```
개발자 PC에서 서버의 트레이스·로그·메트릭이 실제로 잘 나가는지 눈으로 확인할 수 있는 개발용 스택을 추가합니다.
지금은 서버가 관측 데이터를 보내고는 있지만, 개발자 PC에는 그걸 받아줄 곳이 없어서 제대로 나가는지 알 수 없었습니다.
클러스터에 배포한 뒤에야 확인할 수 있었습니다. 이 PR부터는 로컬에서 바로 확인할 수 있습니다.
```bash
docker compose --profile observability up -d
```
아래가 함께 뜹니다.
- **수집기 (OpenTelemetry Collector)** — 서버가 보낸 데이터를 받아서 아래 저장소로 나눠 보냅니다
- **Tempo** — 요청 하나가 어떤 단계를 거쳤는지(트레이스) 저장합니다
- **Loki** — 로그를 저장합니다
- **Prometheus** — 요청 수·응답 시간 같은 숫자(메트릭)를 저장합니다
- **Grafana** — http://localhost:3030 에서 위 셋을 조회합니다. 로그인 없이 들어가지고, 화면은
한국어로 나옵니다
Grafana 왼쪽 메뉴의 **드릴다운**에서 서비스별 트레이스·로그·메트릭을 볼 수 있습니다.
### Additional context
**평소 개발 흐름은 바뀌지 않습니다.** 새 서비스는 모두 `observability` 프로필에 묶여 있어서, 옵션 없이
`docker compose up` 하면 지금처럼 DB·Redis·RabbitMQ·MinIO만 뜹니다.
**클러스터와 최대한 같게 맞췄습니다.** 로컬에서 본 결과가 클러스터에서도 같게 나오도록 하기 위해서입니다.
---
### Before submitting the PR, please make sure you do the following
- [x] Read the [Contributing
Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md)
- [x] Read the [Contributing
Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch)
and follow the [Commit
Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention)
- [x] Provide a description in this PR that addresses **what** the PR is
solving, or reference the issue that it solves (e.g. `fixes #123`).
- [ ] Ideally, include relevant tests that fail without this PR but pass
with it.
Closes TAS-3010
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **New Features**
- Added a local observability environment for viewing application
traces, logs, and metrics.
- Added Grafana dashboards with connected Tempo, Loki, and Prometheus
data sources.
- Added support for collecting telemetry through OpenTelemetry and
routing it to the appropriate monitoring tools.
- Added persistent local storage for observability data.
- **Documentation**
- Added setup and verification instructions, including service addresses
and Grafana drilldown links.
- Added architecture and data-flow documentation for the observability
environment.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description 프로덕션의 일부 Pod에서 사용하는 로컬 스토리지를 쉽게 관리할 수 있도록 위치를 옮겼습니다. ### Additional context --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added retained local storage for production workloads. * Configured Grafana and Loki to preserve data and run on a designated node. * Updated n8n with persistent storage, improved resource allocation, Seoul timezone support, and workflow initialization. * **Configuration** * Updated n8n to use the latest configured image, SQLite, ingress, and revised security and logging settings. * Refined production cluster inventory and DNS configuration. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description 로컬에서 `docker compose up`을 하면 Redis 컨테이너가 바로 꺼집니다. 비밀번호 값이 빈 채로 켜지기 때문입니다. Redis만 비밀번호를 `.envrc`의 환경변수에서 받아오는데, 그 설정은 Redis가 켜진 **뒤에야** 준비됩니다. Postgres·RabbitMQ·MinIO처럼 `docker-compose.yml`에 직접 적어 맞춥니다. Closes TAS-3039 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description Campus networks that block TCP 80 never reach `TLSRedirect`, so `http://codedang.com` hangs instead of upgrading to HTTPS. - Add a Traefik `hsts` Middleware (`stsSeconds: 31536000`, `includeSubDomains`, `preload`) and attach it to every router on the `websecure` entrypoint. - Do not set `forceSTSHeader`; HSTS is only sent on HTTPS responses. - Add Route53 HTTPS records (RFC 9460) for `codedang.com` and `stage.codedang.com` so supporting browsers upgrade `http://` to `https://` before opening a socket. - Leave existing A records and `TLSRedirect` in place; this complements them for clients that never hit port 80. HSTS preload submission at https://hstspreload.org is an ops follow-up after the header is live with a 1-year `max-age`. Closes TAS-2941 ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [X] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [X] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [X] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Security** * HTTPS connections now include HSTS headers, instructing browsers to use HTTPS for the site and its subdomains for one year. * DNS records for the production and staging hostnames advertise support for HTTP/2 and HTTP/1.1 over HTTPS, enabling compatible browsers to upgrade HTTP requests before connecting. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: kimjin8748 <kimjin8748@example.com>
### Description Frigate를 Kubernetes 환경에 배포하기 위한 manifest를 추가합니다. ### Additional context - Frigate Deployment 추가 - Frigate Service 추가 - Frigate ConfigMap 추가 - Frigate PVC 추가 - Stage Ingress 추가 - Kustomize base 및 stage overlay 구성 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. Closes TAS-2938 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added the Frigate NVR service to the stage environment, with a configured USB camera stream and persistent storage. * Added access to the Frigate web interface at `frigate.stage.codedang.com`. * Configured automated deployment and recovery for the stage service. * **Infrastructure** * Added service networking, health checks, storage provisioning, and a dedicated namespace. * Added stage DNS routing and gateway access for Frigate. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Frigate가 USB 카메라를 정상 인식하도록 입력 장치 경로와 MJPEG 포맷을 명시합니다. ### Additional context - 원인: video=0이 실제 장치 /dev/video0으로 해석되지 않음 - 수정: 장치 경로를 /dev/video0으로 명시 - 추가: 카메라가 지원하는 mjpeg 입력 포맷 명시 - 기대 결과: go2rtc가 카메라를 열고 Frigate에 영상 프레임 전달 ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Updated the USB camera stream to use `/dev/video0` and explicitly select MJPEG as its input format. The stream retains its 1280×720 video size and existing H.264 setting. These settings specify the camera device and the format used for incoming video. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Install a self-hosted Pyroscope v2 backend in the existing monitoring stack. - Add an Argo CD ApplicationSet for stage (`main`) and production (`release`) using Pyroscope Helm chart 2.3.1. - Store profile blocks in the existing monitoring MinIO tenant and persist metastore Raft state on a 10Gi PVC. - Create the `pyroscope` bucket for new tenants and initialize it idempotently for existing tenants. - Reflect the existing MinIO user Secret into the Pyroscope namespace. - Set profile retention and query lookback to 14 days in stage and 30 days in production. Alloy collection and the Grafana data source are follow-up work. ### Validation - `helm lint` and `helm template` passed with both stage and production values. - Rendered settings were checked for retention, MinIO storage, bucket initialization, and PVC. - `kubectl kustomize` passed for both MinIO overlays. - Prettier YAML check and `git diff --check` passed. Cluster runtime validation remains for deployment after merge. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added Pyroscope profiling infrastructure for stage and production monitoring environments. * Profiles are stored in shared monitoring object storage with environment-specific retention limits: 14 days for stage and 30 days for production. * Added persistent storage for Pyroscope metadata and automatic initialization of the profiling storage bucket. * Made monitoring credentials available to the Pyroscope environment. * **Documentation** * Added operational documentation covering deployment, storage, retention, verification, and service connectivity. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Deploy Grafana Alloy to collect Iris pprof profiles and send them to the self-hosted Pyroscope service. - Deploy one Alloy instance per cluster through an Argo CD ApplicationSet, using chart 1.12.1. - Discover ready `iris`, `iris-test`, and `iris-rejudge` Pods in the `iris` namespace and scrape each Pod IP on port 6060. - Collect 10 seconds of CPU profiles every 60 seconds, alongside memory and goroutine profiles; disable block and mutex profiles because Iris does not enable their Go profiling rates. - Restrict Kubernetes discovery RBAC to Pods in the `iris` namespace, add environment labels, and expose Alloy metrics to Prometheus. **Stacked on #3787** (`t3041-install-pyroscope`). Please review only the Alloy commit in this PR. Grafana data source provisioning remains a follow-up. ### Validation - `helm lint` and `helm template` passed for stage and production. - The rendered River configurations passed `alloy validate` using Alloy v1.19.2. - Rendered RBAC contains only a namespaced Pod Role; rendered deployments and environment labels were checked. - `kubectl kustomize` confirmed all three Iris workloads are discoverable in both clusters. - YAML Prettier check and `git diff --check` passed. Cluster runtime validation remains for deployment after merge. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added Grafana Alloy monitoring deployment for stage and production clusters. * Alloy now discovers ready Iris pods, collects profiling data, and forwards it to Pyroscope. * Added Prometheus health metrics through a ServiceMonitor. * Added environment-specific configuration for stage and production. * **Documentation** * Added deployment details and post-rollout verification steps for Alloy monitoring. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Provision a Pyroscope data source in both stage and production Grafana instances using the self-hosted Pyroscope service from the preceding PRs. - Add a non-editable `grafana-pyroscope-datasource` with stable UID `pyroscope` and proxy access to `http://pyroscope.monitoring-pyroscope.svc.cluster.local:4040`. - Set `minStep` to `1m` to match Alloy's 60-second scrape interval. - Keep all existing data sources intact. **Stacked on #3788** (`t3042-configure-alloy`), which in turn depends on #3787. Please review only the Grafana data source commit in this PR. ### Validation - Confirmed the pinned Grafana chart 10.5.13 runs Grafana 12.3.1, which supports the Pyroscope data source. - `helm lint` and `helm template` passed with all three existing Grafana values files for each environment. - Parsed the rendered provisioning ConfigMap: exactly one Pyroscope data source in each environment; existing data sources remain. - YAML Prettier check and `git diff --check` passed. The data source connection and profile queries require runtime validation after deployment.
### Description assignment 생성 시 `inviteAllCourseMembersToAssignment()`를 호출하는데, await이 없어 에러 발생 시에도 throw를 못함을 확인했습니다. 따라서, 해당 함수 호출 시 await 키워드를 붙여 비동기적으로 함수를 실행하고 정상적으로 에러를 Throw하도록 합니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Assignment creation and course member invitations now succeed or fail together, preventing assignments from being saved without their invitations. * Invitation updates associated with assignment score summaries are also handled together, avoiding partially completed updates. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Lee Haesung <lshtar13.dev@gmail.com> Co-authored-by: LEE HAESUNG <102472529+lshtar13@users.noreply.github.com>
### Description - Return a compile error when the compiler exits with a nonzero status, while keeping compiler startup failures as server errors. - Preserve compiler diagnostics in the judge response. - Remove a status-code comparison that incorrectly treated compile errors as system errors. ### Additional context A failed compilation now returns `resultCode: 6` with the compiler diagnostic instead of `resultCode: 9` and a missing `log.out` error. Tests passed: `go test ./src/service/sandbox/judger ./src/service/build ./src/handler` --- ### Before submitting the PR, please make sure you do the following - [x] Read the Contributing Guidelines and follow the Commit Convention. - [x] Describe the bug this PR solves. - [x] Include regression tests. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Failed compilations now include compiler diagnostic output and the compiler’s exit status, making source errors easier to identify. * Compiler startup failures are reported separately from rejected source code, so they are not misclassified as user errors. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Frigate Pod에 `/dev/video0`이 마운트되어 있지만, 컨테이너의 장치 접근 제한으로 go2rtc에서 다음 오류가 발생했습니다. `Cannot open video device /dev/video0: Operation not permitted` 이로 인해 usb_camera RTSP 스트림이 생성되지 않아 Frigate에서 카메라 영상을 수신할 수 없었습니다. fixes #3736 ### Additional context ## 변경 사항 Frigate 컨테이너에 임시로 privileged: true를 적용하여 USB 카메라 장치에 접근할 수 있도록 수정했습니다. ## 보안 고려사항 privileged 모드는 컨테이너에 호스트 장치와 커널 기능에 대한 강한 권한을 부여하므로 장기적인 최소 권한 구성은 아닙니다. 현재 배포 범위는 다음과 같이 제한되어 있습니다. - stage 환경에서만 사용 - 카메라가 연결된 skkuding-1 노드에만 배치 - ServiceAccount 토큰 자동 마운트 비활성화 - 외부에는 Frigate 웹 포트만 노출 ## 후속 작업 Device Plugin 또는 CDI를 도입해 /dev/video0만 컨테이너에 할당하고, 검증 후 privileged: true를 제거할 예정입니다. --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for the generic device plugin in the stage cluster, making the video device available to workloads on the designated node. * **Updates** * Frigate now requests a video device through the cluster’s device allocation system rather than mounting the host device directly, changing how it accesses camera hardware. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: jjyoung0403 <jjyoung0403@gmail.com>
…ket (#3798) ### Description `codedang-media` 버킷을 CloudFront(OAC) 뒤에 두고 `media.codedang.com`으로 제공하려 합니다. 이를 위해 프론트 / 백엔드 로직이 해당 기능을 지원하도록 처리합니다. - `FileService`: `MEDIA_CDN_URL`이 설정되면 CDN URL 반환 - `StorageService`: 신규 업로드에 `Cache-Control: public, max-age=31536000, immutable` 지정 (키가 랜덤 UUID) - `next.config.ts`: `next/image`에 `media.codedang.com` 허용 이 PR만으로는 동작이 바뀌지 않습니다. ### Additional context 비용: 읽기 전용 조회 기준 기존 CloudFront 사용량은 월 약 2.1 GB, 10.5만 요청($0)으로, 계정 전체 무료 한도(1 TB, 1,000만 요청) 내로 예상됩니다. 리뷰 포인트 - 프론트 - next.js 쪽 config에 몇 줄 추가된 것이 있으니 알고만 계셔주시면 될 것 같습니다. - 백엔드 - 파일 업로드 로직이 약간 바뀌었는데, 이것이 백엔드 팀의 convention에 맞는지 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. Closes TAS-3053 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a dedicated media CDN at `media.codedang.com` for faster delivery of uploaded images and files, with HTTPS support. * New media uploads use the CDN URL when it’s configured. Existing URL behavior is preserved otherwise. * **Improvements** * Uploaded media is configured for long-term caching to improve repeat access. * Existing public media URLs remain supported. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description promtail 파드가 간헐적으로 readiness probe에 실패하고, Loki가 초대형 로그 라인을 거부해 재전송이 반복되던 문제를 수정합니다. - promtail `cpu: 200m` 제한으로 CPU throttling이 발생했고, `/ready` probe의 1s 타임아웃을 넘겨 `NotReady`가 되었습니다. - Loki 기본 `max_line_size`(256KB)를 초과하는 Iris stderr(최대 ~5.3MB)가 `400 max entry size exceeded`로 거부되어 promtail이 `final error sending batch`를 반복했습니다. 변경: - `infra/k8s/monitoring/promtail/values.yaml`: limits `cpu 200m→500m`, `memory 256Mi→512Mi`, requests `cpu 100m→200m`, `memory 128Mi→256Mi` - `infra/k8s/monitoring/loki/values.yaml`: `limits_config.max_line_size: 10MB`, `max_line_size_truncate: true` ### Additional context - `max_line_size`/`max_line_size_truncate` 키는 실행 중인 Loki `/config`에서 확인했습니다. - 근본 원인인 Iris의 다중 MB stderr 로그는 별도 수정이 필요합니다. - `loki-production` auto-sync가 현재 server8 스토리지 이전으로 중지되어 있어, Loki 변경은 중지 해제 후 적용됩니다. --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. Closes TAS-3046 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Oversized log lines are now truncated at 10 MB, allowing the portion within the limit to be retained instead of rejecting the entire line. This makes long log entries more likely to remain available for review, while keeping their size within the configured maximum. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description admin-api를 재시작할 때 다운타임이 발생하지 않도록 readiness/startup probe와 graceful shutdown을 추가합니다. 기존 Deployment는 `replicas: 1`, probe 없음, 기본 RollingUpdate(`maxUnavailable: 25%`) 설정이었습니다. probe가 없어 Pod가 실제로 3000번 포트를 열기 전에 `Ready`로 표시되어 Service 엔드포인트에 등록되었고(운영 환경에서 약 17초 차이 확인), 롤아웃 중 새 Pod로 트래픽이 유입되어 5xx가 발생할 수 있었습니다. - `GET /health/ready` 엔드포인트 추가 (Prisma `SELECT 1`, cache 조회) - `app.enableShutdownHooks()`와 entrypoint `exec node`로 SIGTERM 시 HTTP 서버를 닫고 in-flight 요청을 마무리 - Deployment에 `/health/ready` 기반 readiness/startup probe와 `preStop`을 추가하고 `maxUnavailable: 0` / `maxSurge: 1`, `terminationGracePeriodSeconds: 120`으로 변경 ### Additional context - readiness probe가 `/health/ready`(httpGet)를 사용하므로 DB/cache 일시 장애 시 Pod가 NotReady가 될 수 있습니다. 영향 범위가 크면 `tcpSocket`으로 완화하는 방안을 검토할 수 있습니다. - `/health/ready`는 외부에 노출되지 않습니다. HTTPRoute가 `/graphql`, `/admin-api`만 매칭합니다. - `replicas`는 1로 유지하며, 롤아웃 중에만 일시적으로 2개가 됩니다. Closes TAS-3008 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added an admin API readiness check that reports whether the database and cache are available, returning an unavailable status if either check fails. * **Improvements** * Admin API deployments now use startup and readiness health checks, with rolling updates configured to keep existing instances available during releases. * Added a shutdown grace period to give in-flight requests time to finish before the service stops. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/checkout](https://redirect.github.com/actions/checkout) | action | major | `v6` → `v7` | --- > [!WARNING] > Some dependencies could not be looked up. Check the [Dependency Dashboard](../issues/88) for more information. --- ### Release Notes <details> <summary>actions/checkout (actions/checkout)</summary> ### [`v7.0.1`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v701) [Compare Source](https://redirect.github.com/actions/checkout/compare/v7.0.0...v7.0.1) - Bump github/codeql-action from 3 to 4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2475](https://redirect.github.com/actions/checkout/pull/2475) - Bump actions/setup-node from 4 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2477](https://redirect.github.com/actions/checkout/pull/2477) - Bump docker/build-push-action from 6.5.0 to 7.2.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2478](https://redirect.github.com/actions/checkout/pull/2478) - Bump docker/login-action from 3.3.0 to 4.2.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2479](https://redirect.github.com/actions/checkout/pull/2479) - Bump actions/checkout from 6 to 7 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2488](https://redirect.github.com/actions/checkout/pull/2488) - Bump actions/upload-artifact from 4 to 7 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2476](https://redirect.github.com/actions/checkout/pull/2476) - eslint 9 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2474](https://redirect.github.com/actions/checkout/pull/2474) - Bump the minor-actions-dependencies group with 2 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2499](https://redirect.github.com/actions/checkout/pull/2499) - skip running unsafe pr check if input is default by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2518](https://redirect.github.com/actions/checkout/pull/2518) - trim only ascii whitespace for branch by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2521](https://redirect.github.com/actions/checkout/pull/2521) - escape values passed to --unset by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2530](https://redirect.github.com/actions/checkout/pull/2530) ### [`v7.0.0`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v700) [Compare Source](https://redirect.github.com/actions/checkout/compare/v7.0.0...v7.0.0) - Block checking out fork PR for pull\_request\_target and workflow\_run by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2454](https://redirect.github.com/actions/checkout/pull/2454) - Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2458](https://redirect.github.com/actions/checkout/pull/2458) - Bump flatted from 3.3.1 to 3.4.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2460](https://redirect.github.com/actions/checkout/pull/2460) - Bump js-yaml from 4.1.0 to 4.2.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2461](https://redirect.github.com/actions/checkout/pull/2461) - Bump [@​actions/core](https://redirect.github.com/actions/core) and [@​actions/tool-cache](https://redirect.github.com/actions/tool-cache) and Remove uuid by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2459](https://redirect.github.com/actions/checkout/pull/2459) - upgrade module to esm and update dependencies by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2463](https://redirect.github.com/actions/checkout/pull/2463) - Bump the minor-npm-dependencies group across 1 directory with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2462](https://redirect.github.com/actions/checkout/pull/2462) ### [`v7`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v700) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.1.0...v7.0.0) - Block checking out fork PR for pull\_request\_target and workflow\_run by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2454](https://redirect.github.com/actions/checkout/pull/2454) - Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2458](https://redirect.github.com/actions/checkout/pull/2458) - Bump flatted from 3.3.1 to 3.4.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2460](https://redirect.github.com/actions/checkout/pull/2460) - Bump js-yaml from 4.1.0 to 4.2.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2461](https://redirect.github.com/actions/checkout/pull/2461) - Bump [@​actions/core](https://redirect.github.com/actions/core) and [@​actions/tool-cache](https://redirect.github.com/actions/tool-cache) and Remove uuid by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2459](https://redirect.github.com/actions/checkout/pull/2459) - upgrade module to esm and update dependencies by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2463](https://redirect.github.com/actions/checkout/pull/2463) - Bump the minor-npm-dependencies group across 1 directory with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2462](https://redirect.github.com/actions/checkout/pull/2462) ### [`v6.1.0`](https://redirect.github.com/actions/checkout/compare/v6.0.3...v6.1.0) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.0.3...v6.1.0) ### [`v6.0.3`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v603) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.0.2...v6.0.3) - Fix checkout init for SHA-256 repositories by [@​yaananth](https://redirect.github.com/yaananth) in [#​2439](https://redirect.github.com/actions/checkout/pull/2439) - fix: expand merge commit SHA regex and add SHA-256 test cases by [@​yaananth](https://redirect.github.com/yaananth) in [#​2414](https://redirect.github.com/actions/checkout/pull/2414) ### [`v6.0.2`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v602) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.0.1...v6.0.2) - Fix tag handling: preserve annotations and explicit fetch-tags by [@​ericsciple](https://redirect.github.com/ericsciple) in [#​2356](https://redirect.github.com/actions/checkout/pull/2356) ### [`v6.0.1`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v601) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6...v6.0.1) - Add worktree support for persist-credentials includeIf by [@​ericsciple](https://redirect.github.com/ericsciple) in [#​2327](https://redirect.github.com/actions/checkout/pull/2327) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/skkuding/codedang). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMi4wIiwidXBkYXRlZEluVmVyIjoiNDQuMTIuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19--> Co-authored-by: tasoo park <tasoo1118@gmail.com>
### Description <img width="1912" height="775" alt="image" src="https://github.com/user-attachments/assets/56f0bef9-4a66-47f0-a7af-015a6b4b2e73" /> Submissions 탭에서 아직 채점 중인(result === 'Judging') submission을 클릭해 상세 페이지로 들어가면 왼쪽 패널에 Failed to load data가 뜨는 문제 수정 원인 - SubmissionDetail Server Component들의 코드 Next.js 15에서는 Server Component render 도중 revalidateTag() 같은 캐시 무효화 API를 호출하면 render error가 발생. 이 코드는 result === 'Judging'일 때만 실행되므로, 채점 중인 제출을 열 때만 render가 터지고 ErrorBoundary가 Failed to load data fallback을 띄우는 구조. 동일한 패턴이 아래 3곳에 모두 존재해서 전부 수정했습니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Submission pages now fetch the latest submission status without relying on cached data, so judging results can appear promptly. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description stage에서 Loki가 스케줄되지 않고, Pyroscope가 init container 이미지를 받지 못해 시작되지 않는 문제를 수정합니다. - **Loki**: #3785에서 stage/production 공용 `loki/values.yaml`에 `nodeSelector: skkuding-4f-1`을 추가했습니다. 이 노드는 production에만 있어 stage `loki-0`이 `0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector`로 Pending 상태가 되었고, 그동안 stage 로그가 수집되지 않았습니다. - **Pyroscope**: #3787의 bucket 생성 init container가 사용하는 `minio/mc:RELEASE.2025-08-13T08-35-41Z` 이미지가 더 이상 배포되지 않아 `pyroscope-0`이 `Init:ImagePullBackOff`에 멈춰 있습니다. Docker Hub와 quay.io 모두 `minio/mc`, `minio/minio`를 받을 수 없음을 확인했습니다. ### Additional context - `helm template` 결과 Loki production 렌더링은 현재 `main`과 동일하며, stage는 `nodeSelector`만 빠집니다. production Loki는 PV가 `skkuding-4f-1`에 묶여 있어 ApplicationSet 반영 전에도 같은 노드에 스케줄됩니다. - `ignoreMissingValueFiles`는 `release`에 `values-production.yaml`이 반영되기 전에 `loki-production`이 ComparisonError가 되지 않도록 하기 위함입니다. stage는 별도 파일이 없습니다. - Pyroscope init container는 렌더링된 spec 그대로 stage에서 일회성 Pod로 검증했습니다 (기존 bucket 확인, 임시 bucket 생성, 재실행 시 idempotent, 정리 완료). `us-east-1`은 서명용 region이며 stage MinIO에서 정상 동작을 확인했습니다. - 검증을 위해 stage에 수동 적용한 내용이 있습니다. - 루트 `argocd` 앱에서 `alloy`, `pyroscope` ApplicationSet만 partial sync했습니다. `alloy-production`, `pyroscope-production`은 release 반영 전까지 ComparisonError 상태입니다. - `loki-stage`의 auto-sync를 끄고 StatefulSet의 `nodeSelector`를 직접 제거했습니다. 현재 `loki-0`은 `skkuding-1`에서 Running이며 로그 수집도 재개되었습니다. **merge 후 `loki-stage` auto-sync(`selfHeal: true`)를 다시 켜야 합니다.** - Alloy는 stage Iris Pod 4개를 정상적으로 발견해 수집 중입니다. Pyroscope end-to-end 검증(서버 ready, profile 수신)은 merge 후 stage 자동 sync로 진행합니다. - release 전에 merge되어야 production Pyroscope가 같은 이유로 멈추지 않습니다. - 별도 후속 작업: MinIO tenant(production `monitoring-minio`, stage `minio`/`monitoring-minio`)가 사용하는 `minio/minio:RELEASE.2025-04-08T15-41-24Z`도 더 이상 pull할 수 없습니다. 노드 캐시로 동작 중이라 Pod가 다른 노드로 옮겨지면 시작되지 않습니다. --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. Closes TAS-3072 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Deployment Improvements** * Loki production workloads are scheduled on the designated Kubernetes node, while other Loki deployments are no longer restricted to a specific node. * Pyroscope setup now handles existing profile-storage buckets and can create the bucket when it is not present. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description DataTableFallback design을 최신화합니다 client/contest/[contestId]/Qna client/course/[courseId]/Notice client/course/[courseId]/Qnq admin/probelm admin/course admin/contest admin/course/[courseId]/Memeber, Assignment, Exercise, Notice, Q&A 전부 admin/course/[courseId]/exercise/[exerciseId]/submission의 table - All, Student 탭 전부 admin/course/[courseId]/assignment/[assignmentId]/submission admin/contest/[contestId]/submission admin/contest/[contestId]/qna 위의 화면을 수정했습니다 closes TAS-2856 ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Refined the admin data table loading state with updated header spacing, typography, backgrounds, and checkbox column styling. * Adjusted the contest list page’s vertical spacing for a more compact layout. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Contributor
Author
|
@copilot resolve the merge conflicts in this pull request |
|
@lukekeum I can’t apply these changes because the pull request’s branch is the repository’s default branch, which I’m not allowed to push to directly. You can ask me to create a new pull request with the requested changes instead and I'll open a separate PR on a new branch. |
4 tasks
## Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving --> shadcn button 컴포넌트에 variant와 size 추가해서 피그마에 맞췄습니다. /tas2891로 이동해서 프리뷰 가능 최대한 기존 컴포넌트에 영향 주지 않게 했습니다. 기존 컴포넌트에 적용은 따로 브랜치 파서 해야겠네여 ### 4 styles x 3 sizes - variant - default - Modified - secondary - Modified (기존에 사용되지 않던 variant입니다) - tertiary - Added - lined - Added - size - large / middle / small - Added ### icon - 2 sizes ## TODO - **변수명 정리** & **기존 변수 정리** (헷갈리는 변수들 제거해야 할지,,) --> 도와줘요ㅠㅠ - **기존 컴포넌트에 적용하기**(...) - 테스트페이지 삭제 ## Additional context <img width="1598" height="994" alt="스크린샷 2026-08-31 202352" src="https://github.com/user-attachments/assets/6c916643-f8b3-4172-9e99-851c9fd19e3e" /> <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Updated button typography and default styling, including clearer colors for disabled buttons. * Secondary buttons now use neutral colors instead of the former bordered primary treatment. * Added tertiary, lined, and icon button styles, plus large, middle, small, and icon-specific size options. * Added large, middle, and small corner-radius options for interface elements. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Grafana에서 **로그와 트레이스를 클릭 한 번으로 오갈 수 있게** 합니다. <img width="415" height="577" alt="image" src="https://github.com/user-attachments/assets/18f02b08-a592-41ff-be73-25c124dd92f0" /> <img width="654" height="630" alt="image" src="https://github.com/user-attachments/assets/773c1da2-5163-4db9-8a18-2543b8c6e2a1" /> 지금은 에러 로그를 보다가 그 요청의 트레이스를 보려면, 로그에 적힌 `trace_id` 값을 손으로 복사해 Tempo 검색창에 붙여넣어야 합니다. 반대 방향도 마찬가지입니다. | 설정 | 방향 | 하는 일 | |---|---|---| | Loki `derivedFields` | 로그 → 트레이스 | 로그의 `trace_id`를 눌러 바로 트레이스를 엽니다 | | Tempo `tracesToLogsV2` | 트레이스 → 로그 | 트레이스에서 같은 서비스의 그 시각 로그(앞뒤 5분)를 엽니다 | 그리고 **Loki 인덱스 라벨을 고칩니다.** 지금은 `service.environment`를 지정해 뒀는데, 이 이름으로 값을 보내는 서비스가 없어 환경 라벨이 비어 있습니다. 표준 이름인 `deployment.environment.name`으로 맞춥니다. 이 이름은 [#3780](https://github.com/skkuding/codedang/pull/3780)에서 각 서비스가 보내도록 정한 값입니다. 같은 설정을 **로컬 관측성 스택**(`docker/observability/`)에도 넣어서, 로컬에서도 같은 방식으로 확인할 수 있습니다. **로컬 확인** - Grafana가 두 설정을 읽어 들인 것을 확인했습니다(데이터소스 API 응답). - client에 요청을 보낸 뒤 Grafana에서 로그 → 트레이스, 트레이스 → 로그 이동이 되는 것을 눈으로 확인했습니다. ### Additional context - iris·plag는 로그 **일부에만** `trace_id`가 있어서, 이 PR만으로는 그 둘의 로그가 모두 연결되지는 않습니다. backend(client·admin)는 모든 로그에 들어 있어 바로 동작합니다. 나머지는 별도 작업(TAS-3080)에서 다룹니다. Closes TAS-3020 --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Grafana traces link to related logs for the same service, covering five minutes before and after each trace and filtering by trace ID. * Logs provide a “트레이스 보기” link to the corresponding trace. * **Changes** * Log environment indexing now includes deployment environment attributes instead of the service environment attribute. Service name and version remain indexed. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description 요청·응답 로그에 민감한 헤더가 마스킹되지 않고 있어 `redact` 설정을 보완했습니다. 토큰은 **발급될 때(응답 헤더)와 쓰일 때(요청 헤더)** 두 번 찍히므로 양쪽을 모두 막습니다. | 대상 | 경로 | 가리는 환경 | 이전 | 이후 | | --- | --- | --- | --- | --- | | access token — 사용 | `req.headers.authorization` | stage 외 전부 | 노출 | 마스킹 | | access token — 발급 | `res.headers.authorization` | stage 외 전부 | 노출 | 마스킹 | | refresh token — 사용 | `req.headers.cookie` | stage 외 전부 | 노출 | 마스킹 | | refresh token — 발급 | `res.headers["set-cookie"]` | stage 외 전부 | 노출 | 마스킹 | | 이메일인증 JWT — 사용 | `req.headers["email-auth"]` | stage 외 전부 | 노출 | 마스킹 | | 이메일인증 JWT — 발급 | `res.headers["email-auth"]` | stage 외 전부 | 노출 | 마스킹 | | 비밀번호 해시 (로그 루트) | `password` | 전 환경 | 노출 | 마스킹 | | 비밀번호 (요청 본문) | `req.body.password` | 전 환경 | 마스킹 | 마스킹 | | 비밀번호 확인 (요청 본문) | `req.body.passwordAgain` | 전 환경 | 마스킹 | 마스킹 | 마지막 두 줄이 기존 설정이고, 나머지 7경로가 이번에 추가된 것입니다. **stage만 예외인 이유** — 쿠키 헤더를 전 환경에서 가리면 값뿐 아니라 **쿠키 이름까지 사라져** 디버깅이 불편해집니다. 토큰 원문이 그대로 필요한 경우도 있어 부분 마스킹(censor) 대신 stage에서는 값을 그대로 둡니다. `appEnv == "local"`의 케이스는 이번 PR에서 다루지 않습니다. 환경 변수 `APP_ENV`가 `local`로 사용되는 사례 및 컨벤션이 정착이 되지 않았기 때문입니다. ### Additional context --- ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving - [x] Ideally, include relevant tests that fail without this PR but pass with it Closes TAS-3075 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Description 현재 admin/problem 접속 시, 위와 같이 SearchInput, (Language/Level) filter가 ProblemTable 컴포넌트 내부에 함께 종속되어있어, API를 사용하지 않는 부분임에도 불구하고 스켈레톤이 노출되고 있음을 확이하였습니다. 이는 처음 접속하는 사용자의 UX를 저하하는 요인으로, ProblemTable 내부에서 SearchInput을 우선적으로 ProblemTable과 분리합니다. #### AS-IS <img width="928" height="467" alt="스크린샷 2026-10-04 오전 8 43 22" src="https://github.com/user-attachments/assets/c59b3ec3-b8ed-423b-8daf-ad5c25adc175" /> #### TO-BE <img width="1353" height="831" alt="스크린샷 2026-10-04 오후 7 39 14" src="https://github.com/user-attachments/assets/7c2f6573-2fa5-4b06-8788-0220a7b40699" /> ### Additional context 추후 별도의 Task를 통해 종속되어 있는 filter 또한 분리할 예정입니다. 현재 브랜치를 base로 하는 브랜치를 생성하여, Stacked PR을 이용해 "제작중인 문제"(admin/problem/creating)부분도 수정 예정입니다. --- closes TAS-3082 ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary * **New Features** * Added a search input to the admin problem page. Entered text filters the problem table, and the table returns to the first page when the search changes. * **Improvements** * Updated the problem table layout to accommodate its search input, filters, and pagination. The loading fallback now fills the available width and does not display a search input. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description #3811 의 두 번째 스택입니다. admin/problem/creating 부분의 SearchBar을 분리합니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **User Interface** * Updated the problem creation page with a synchronized search bar alongside the table. * Retained language and level filters and the download control. * Adjusted the table and pagination layout for full-width display. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description #3811 의 세 번째 스택입니다. DataTable로부터 filter을 분리합니다. 여기서 filter은 Language와 Level filter을 말합니다. <img width="501" height="76" alt="스크린샷 2026-10-05 오전 2 39 54" src="https://github.com/user-attachments/assets/27358268-70c8-4580-af56-eb109896374a" /> #### AS-IS <img width="890" height="448" alt="스크린샷 2026-10-05 오전 2 40 59" src="https://github.com/user-attachments/assets/3d8e9581-921f-444c-b0be-c8279b44aeb4" /> #### TO-BE <img width="889" height="398" alt="스크린샷 2026-10-05 오전 2 41 42" src="https://github.com/user-attachments/assets/1afccad8-398c-47ab-a94c-bef16842f656" /> ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> closes TAS-3085 --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added language and difficulty multi-select filters to the admin problem list. * Filter selections update the displayed problems, and changing filters returns the table to its first page. * Added a reusable multi-select filter with selected-option badges and an “All” label when every option is selected. * **Bug Fixes** * Empty selections now clear the corresponding table filter. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description #3811 의 네 번째 스택입니다. #3814 의 두 번째 스택입니다. admin/problem/creating 부분의 filter을 분리합니다. ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it.
### Description admin/problem/creating에서 데이터테이블 내에 데이터가 없을 때 OR Fallback 시, 비정상적으로 체크박스가 길어졌음을 확인했습니다. DataTable과 DataTableFallback 컴포넌트에서 SelectColumn의 경우 - 셀 내부에는 `w-[1%] whitespace-nowrap p-0` - 체크박스를 감싸는 div에는 `w-14` 를 주어 문제를 해결했습니다. closes TAS-3086 --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it.
### Description
problem 탭 마지막 문제 - '[첨부파일 버그 재현] 원본 A' 에서 확인 가능합니다
<img width="709" height="601" alt="image"
src="https://github.com/user-attachments/assets/ae49deca-45ec-4936-9bbd-7e12a16f4634"
/>
### Additional context
<!-- e.g. is there anything you'd like reviewers to focus on? -->
---
### Before submitting the PR, please make sure you do the following
- [ ] Read the [Contributing
Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md)
- [ ] Read the [Contributing
Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch)
and follow the [Commit
Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention)
- [ ] Provide a description in this PR that addresses **what** the PR is
solving, or reference the issue that it solves (e.g. `fixes #123`).
- [ ] Ideally, include relevant tests that fail without this PR but pass
with it.
closes TAS-3089
### Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving --> 어떤 contest의 reviewer이면서 /admin 페이지에 접속 가능한 유저(예: reviewer + 다른 course의 담당자)는 사이드바에 Contest 버튼이 나타나지 않도록 되어 있지만, 주소창에 직접 입력하여 /admin/contest에 접근 가능했던 문제를 수정함. <img width="3644" height="2200" alt="image" src="https://github.com/user-attachments/assets/56119e8e-6209-48c8-a30e-7b7f8eafff32" /> <img width="3644" height="2200" alt="image" src="https://github.com/user-attachments/assets/9b165b0e-d21d-4b29-8a07-1a523d0de0cf" /> <img width="3644" height="2200" alt="image" src="https://github.com/user-attachments/assets/569665ab-35d1-4046-95b2-073e83fbf90a" /> (실제 contest create는 불가함) closes TAS-3007 ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Contest administration pages are available to users with contest management or administrative permissions. - Users without the required permissions are redirected to the main administration area. - **Bug Fixes** - Access is denied safely when account or permission information cannot be retrieved. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description 코드에디터 내의 검색 기능을 추가합니다. #### AS IS : 콘텐츠 전체 영역 검색만 가능, 코드 입력란 focus 시 검색 바 뜨지 않음. <img width="500" alt="image" src="https://github.com/user-attachments/assets/0863d2d5-915a-4cf4-bfd5-ce92839909b0" /> #### TO BE : 코드 입력란 focus 시 코드 내 검색 기능 추가. 이를 위해 @codemirror/search 패키지를 사용했습니다. - 디자인의 경우 임의로 만든 거라 의견 주시면 반영하겠습니다. - Dom에 직접 access한 이유 : `<ReactCodeMirror>` 에디터가 붙을 빈 <div> 하나만 렌더링하고 그 안 쪽은 CodeMirror가 직접 EditorView를 만들어 DOM을 채운다고 합니다. (React가 소유하거나 관리하지 않는 Dom 영역입니다.) <img width="500" alt="image" src="https://github.com/user-attachments/assets/fdbdeb7d-7e9a-4e9d-b8f0-8797195af50a" /> ### Additional context <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. closes TAS-3088 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added search controls to the code editor, with literal matching, previous and next match navigation, and a close button. The search field focuses and selects its contents when opened, and keyboard shortcuts can navigate between matches. * **Style** * Styled the border of the editor’s search panel. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving --> - InputForm / DropdownForm의 디자인을 개편합니다 - FormSection이 표시하던 Label을 선택적으로 인풋필드가 표시할 수 있게 합니다. - placeholder를 optional로 전환합니다. - FormStyle cva (size, status)를 추가합니다. - DropdownForm의 구조를 변경합니다. props drilling 및 의존성 문제를 피하기 위해, OptionSelect를 통해 Select를 가져오던 방식 대신 바로 Select를 가져오게 변경했습니다. - CourseFormFields를 Course Register 디자인에 맞게 변경합니다. label 적용만 했슴 - CreateCourseForm: week의 default value를 받지 않습니다. default value가 0이면 placeholder가 드러나지 않아 변경했습니다. admin/course의 CreateCourse Modal에서 확인 가능합니다. (값 없이 제출하면 error 확인) ### Review - DropdownForm의 구조 변경에 따른 오류 가능성 - CSS 적용 및 중복 여부 확인 (특히 disabled, error에 대하여,,) ### TODO - 전역 컴포넌트로 전환하기? - Quantity Input은 지금 사용되는 곳이 없는 거 같아서 미뤘습ㅂ니다 ### Additional context https://www.figma.com/design/c7RefqPCB4HC9DuFhT7eFg/%EC%BD%94%EB%93%9C%EB%8B%B9-%EB%A6%AC%EB%94%94%EC%9E%90%EC%9D%B8--2025ver-?node-id=31611-16716&t=WIdmHouDZlmFqoao-4 <img width="720" height="531" alt="스크린샷 2026-08-31 202656" src="https://github.com/user-attachments/assets/900c5ae7-03c5-488e-b00d-6b29f3517df5" /> <!-- e.g. is there anything you'd like reviewers to focus on? --> --- ### Before submitting the PR, please make sure you do the following - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [ ] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary - **New Features** - Course form fields support large, medium, and small sizes, with optional labels and placeholders. - Dropdowns support placeholders, disabled states, and size- and validation-aware styling. - Week and semester fields display descriptive placeholders. - **Style** - Contact fields use a revised layout with adjusted label placement and spacing. - Disabled fields and character counters display styling that reflects their state. - **Bug Fixes** - The week field starts without a preselected value. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
### Description Traefik에 OTLP 트레이싱이 꺼져 있어서, 5xx가 게이트웨이에서 났는지 앱에서 났는지 구분할 수 없고 앱까지 가지 못한 요청(라우팅 실패, 타임아웃)은 Tempo에 남지 않습니다. `infra/k8s/internal/base/traefik-config.yaml`에서 Traefik이 기존 Collector(`simplest-collector.monitoring-otel.svc.cluster.local:4317`)로 trace를 보내게 합니다. 입구 span이 생기고, 앱이 이미 읽는 W3C `traceparent` 아래로 백엔드 span이 이어집니다. stage와 production overlay가 이 base를 쓰므로 두 클러스터에 같이 적용됩니다. 샘플링은 차트 기본값 1.0입니다. 입구를 지나는 요청은 ArgoCD·Grafana를 포함해 전부 기록됩니다. ### Additional context 리뷰 시 확인해 주세요. - Collector는 gRPC 4317만 받으므로 HTTP exporter는 쓰지 않습니다. `insecure: true`는 클러스터 안 평문 전송이고, `tls: null`은 차트가 TLS 인자를 같이 넣어 Traefik v3.6+가 `TLS and Insecure options are mutually exclusive`로 종료하는 것을 막습니다. - `sampleRate`를 낮추면 수집되지 않은 요청의 `traceparent` 때문에 지금 100%인 CLIENT-API, ADMIN-API, IRIS 트레이스도 같이 줄어듭니다. - 클러스터에 깔린 차트에 `tracing.otlp.enabled`가 없으면 그 키는 Helm이 무시합니다. 싱크 후 Traefik 파드가 뜨는지, `/api` 요청은 부모 `traefik` 아래 `CLIENT-API`가 있는지, 없는 경로는 `traefik` span만 있는지를 봐 주세요. Grafana 요청에도 `traefik` span이 생깁니다. - Tempo 보관은 90일이고 service graph에도 `traefik`이 붙어서 트레이스 양이 늘어납니다. Collector와 Tempo 설정은 바꾸지 않았습니다. --- ### Before submitting the PR, please make sure you do the following - [X] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md) - [X] Read the [Contributing Guidelines](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/next/blob/main/CONTRIBUTING.md#commit-convention) - [X] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`). - [ ] Ideally, include relevant tests that fail without this PR but pass with it. Closes TAS-3026 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Improvements** * Enabled OpenTelemetry tracing for Traefik, sending trace data to the monitoring collector over gRPC. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: kimjin8748 <kimjin8748@example.com>
### Description Grafana에서 3시간이 넘는 구간을 잡으면 트레이스로 만든 그래프가 비어 버리는 문제를 고칩니다. 트레이스 자체는 90일치가 저장돼 있고 검색도 잘 됩니다. 막히는 건 트레이스를 모아 그린 그래프(요청량·응답시간 추이)뿐인데, Tempo가 이 그래프만 "한 번에 3시간어치까지"로 제한하고 있었습니다. 우리가 이 값을 정해준 적이 없어서 Tempo 기본값이 그대로 쓰이던 상태입니다. 상한을 7일로 올립니다. 트레이스 검색 쪽에 이미 적용돼 있던 값과 같은 값입니다. ### Additional context 보존 기간(90일)은 데이터를 얼마나 오래 들고 있을지를 정하는 값이고, 이번에 고친 상한은 한 번에 몇 시간어치를 그려줄지를 정하는 값입니다. ### Before submitting the PR, please make sure you do the following - [x] Read the [Contributing Guidelines](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md) - [x] Read the [Contributing Guidelines](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md#pr-and-branch) and follow the [Commit Convention](https://github.com/skkuding/codedang/blob/main/CONTRIBUTING.md#commit-convention) - [x] Provide a description in this PR that addresses **what** the PR is solving - [ ] Ideally, include relevant tests that fail without this PR but pass with it Closes TAS-3083 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * TraceQL metrics queries can now cover time ranges of up to seven days. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Additional context
Before submitting the PR, please make sure you do the following
fixes #123).