Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
e496fb6
[docs] Agent 파일 ignore
KiSeungMin Apr 25, 2026
dfdbb11
[feat] 유저 목록 조회 정렬 기능 추가
KiSeungMin Apr 25, 2026
fd8da3a
[feat] 통계 기능 기간 설정 기능 구현
KiSeungMin Apr 25, 2026
1d4dcb2
[feat] 복습노트 조회 대시보드 기능 구현
KiSeungMin Apr 25, 2026
aa6c805
[feat] 관리자 통계 조회 쿼리 최적화
KiSeungMin Apr 25, 2026
865d2a8
[feat] 관리자 목록 페이지네이션 블록 이동 추가
KiSeungMin Apr 25, 2026
e23dbfa
[fix] 통계 날짜별 조회 타입 변환 오류 수정
KiSeungMin Apr 25, 2026
41226c6
[feat] 관리자 목록 조회 페이징 최적화
KiSeungMin Apr 25, 2026
6df9c9f
[feat] 복습 노트, 복습 기록 페이지 분리
KiSeungMin Apr 25, 2026
bc98696
[feat] 문제 상세 페이지 복습 기록 추가
KiSeungMin Apr 25, 2026
b8b65b6
[feat] 통계 페이지 방문 수 / 합계 추가
KiSeungMin Apr 25, 2026
a64887a
[feat] 통계 페이지 고유 방문 유저 수, DAU 필드 추가
KiSeungMin Apr 25, 2026
504c561
[feat] 문제/분석 통계 추가
KiSeungMin Apr 27, 2026
9f281af
[feat] 관리자 문제 조회 및 테스트 보정
KiSeungMin Apr 27, 2026
56456fc
[feat] Loki 로그 수집 스택 추가
KiSeungMin Apr 27, 2026
e66b196
[feat] Grafana 에러 로그 대시보드 추가
KiSeungMin Apr 27, 2026
8d29c36
[ci] Loki 모니터링 배포 검증 추가
KiSeungMin Apr 27, 2026
fca9443
[Feat] 관리자 페이지 지표 추가 및 성능 개선
KiSeungMin Apr 27, 2026
9d5c58e
[Feat] Loki 로그 수집 스택 추가
KiSeungMin Apr 27, 2026
140257d
[fix] Promtail Docker API 버전 고정
KiSeungMin Apr 27, 2026
28515e0
[fix] Promtail Docker API 버전 고정
KiSeungMin Apr 27, 2026
5cddf65
[fix] Promtail 이미지 버전 업데이트
KiSeungMin Apr 27, 2026
84d8039
[fix] Promtail 이미지 버전 업데이트
KiSeungMin Apr 27, 2026
47e6817
[feat] 프로필별 구조화 로그 설정 추가
KiSeungMin Apr 30, 2026
69296c0
[fix] Spring MVC 예외 상태 코드 보존
KiSeungMin Apr 30, 2026
f14d07e
[fix] 로그 민감정보 노출 제거
KiSeungMin May 1, 2026
80f325d
[fix] 로그 노이즈 감소
KiSeungMin May 1, 2026
de4902b
[fix] DB 로그를 슬로우 쿼리 중심으로 제한
KiSeungMin May 1, 2026
6e276e5
[refactor] RabbitMQ 로그 필드 표준화
KiSeungMin May 1, 2026
eb05e4b
[refactor] 디스코드 에러 전송 기능 개선
KiSeungMin May 1, 2026
3aedbb7
[feat] 요청 ID와 상태별 HTTP 로그 레벨 적용
KiSeungMin May 1, 2026
801d143
[feat] 예외 로그 포맷 통일 및 중복 stacktrace 억제
KiSeungMin May 1, 2026
b13cf0d
[refactor] 에러 코드 재정의 및 개선
KiSeungMin May 1, 2026
45c31d6
[test] 에러 코드 계약 검증 테스트 추가
KiSeungMin May 2, 2026
6b0f4d6
[Feat] 운영 로그 추적성 개선 및 에러 코드 체계 정리
KiSeungMin May 2, 2026
3e70791
[docs] .claude.md 파일 ignore
KiSeungMin May 2, 2026
8b8d437
[feat] Flyway 설정 구현
KiSeungMin May 2, 2026
a0ad8c0
[Feat] Flyway 도입 및 기존 스키마 baseline 설정
KiSeungMin May 2, 2026
17355cf
[fix] 15레벨 초과 미션 게이지 응답 보정
KiSeungMin May 2, 2026
a50b31a
[fix] 로컬 테스트 전용 DB 스키마 분리
KiSeungMin May 2, 2026
3aa1dcd
[fix] 로컬 테스트 JWT 에러 해결
KiSeungMin May 2, 2026
deb2760
[fix] CORS patch 누락 문제 해결
KiSeungMin May 3, 2026
15f2449
[feat] 일일 AI 분석 요청을 20회로 제한
KiSeungMin May 3, 2026
ae2b7cb
[feat] 태그 조회 시 캐싱 적용
KiSeungMin May 3, 2026
9b8e0e9
[Fix] 각종 버그 및 기능 개선
KiSeungMin May 3, 2026
4f8bd24
[feat] 스페이스드 리피티션 복습 스케줄 구현
KiSeungMin May 3, 2026
dcaa10c
[feat] 복습 알림 및 재참여 알림 자동 발송 구현
KiSeungMin May 3, 2026
9214d3f
[fix] FCM 토큰 만료 시 DB에서 삭제
KiSeungMin May 3, 2026
1e6f8da
[feat] 유저 알림 수신 설정 API 구현
KiSeungMin May 4, 2026
80205e1
[feat] 오답노트 응답 필드 추가
KiSeungMin May 4, 2026
8e92281
[Feat] 복습 스케줄 및 알림 기능 개선
KiSeungMin May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 42 additions & 5 deletions .github/workflows/ci-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,13 @@ jobs:
- name: Deploy Monitoring Stack
run: |
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring pull \
mysql-exporter-dev prometheus-dev grafana-dev
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring stop prometheus-dev grafana-dev mysql-exporter-dev || true
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring rm -f prometheus-dev grafana-dev mysql-exporter-dev || true
mysql-exporter-dev prometheus-dev loki-dev promtail-dev grafana-dev
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring stop prometheus-dev grafana-dev loki-dev promtail-dev mysql-exporter-dev || true
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring rm -f prometheus-dev grafana-dev loki-dev promtail-dev mysql-exporter-dev || true
docker-compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring up -d --force-recreate \
mysql-exporter-dev prometheus-dev grafana-dev
mysql-exporter-dev prometheus-dev loki-dev promtail-dev grafana-dev
docker-compose -f docker-compose.dev.yml --env-file .env.dev ps \
mysql-exporter-dev prometheus-dev grafana-dev
mysql-exporter-dev prometheus-dev loki-dev promtail-dev grafana-dev
shell: bash

- name: Verify Monitoring Integration
Expand Down Expand Up @@ -203,6 +203,43 @@ jobs:
exit 1
shell: bash

- name: Verify Loki Log Collection
run: |
echo "Checking Loki readiness..."
for i in $(seq 1 12); do
if curl -fsS http://localhost:3101/ready | grep -q ready; then
echo "Loki is ready"
break
fi
echo "Waiting Loki ready... ($i/12)"
sleep 5
done

if ! curl -fsS http://localhost:3101/ready | grep -q ready; then
echo "ERROR: Loki did not become ready"
docker logs --tail=200 ono-loki-dev || true
docker logs --tail=200 ono-promtail-dev || true
exit 1
fi

echo "Checking Loki received dev logs..."
for i in $(seq 1 12); do
result=$(curl -fsG "http://localhost:3101/loki/api/v1/label/container/values" || true)
if echo "$result" | grep -Eq '"ono-(app|mysql|redis|rabbitmq|prometheus|grafana|loki|promtail|mysql-exporter)-dev"'; then
echo "Loki received dev log labels"
exit 0
fi
echo "Waiting Loki log labels... ($i/12)"
sleep 5
done

echo "ERROR: Loki did not receive expected dev log labels"
curl -fsG "http://localhost:3101/loki/api/v1/labels" || true
docker logs --tail=200 ono-loki-dev || true
docker logs --tail=200 ono-promtail-dev || true
exit 1
shell: bash

- name: Clean up old Docker images
run: |
docker image prune -f --filter "until=24h"
Expand Down
48 changes: 43 additions & 5 deletions .github/workflows/ci-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,13 +219,13 @@ jobs:
- name: Deploy Monitoring Stack
run: |
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring pull \
mysql-exporter-prod prometheus-prod grafana-prod
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring stop prometheus-prod grafana-prod mysql-exporter-prod || true
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring rm -f prometheus-prod grafana-prod mysql-exporter-prod || true
mysql-exporter-prod prometheus-prod loki-prod promtail-prod grafana-prod
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring stop prometheus-prod grafana-prod loki-prod promtail-prod mysql-exporter-prod || true
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring rm -f prometheus-prod grafana-prod loki-prod promtail-prod mysql-exporter-prod || true
docker-compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring up -d --force-recreate \
mysql-exporter-prod prometheus-prod grafana-prod
mysql-exporter-prod prometheus-prod loki-prod promtail-prod grafana-prod
docker-compose -f docker-compose.prod.yml --env-file .env.prod ps \
mysql-exporter-prod prometheus-prod grafana-prod
mysql-exporter-prod prometheus-prod loki-prod promtail-prod grafana-prod
shell: bash

- name: Verify Monitoring Integration
Expand All @@ -248,6 +248,44 @@ jobs:
docker logs --tail=200 ono-prometheus-prod || true
shell: bash

- name: Verify Loki Log Collection
continue-on-error: true
run: |
echo "Checking Loki readiness..."
for i in $(seq 1 12); do
if curl -fsS http://localhost:3100/ready | grep -q ready; then
echo "Loki is ready"
break
fi
echo "Waiting Loki ready... ($i/12)"
sleep 5
done

if ! curl -fsS http://localhost:3100/ready | grep -q ready; then
echo "WARNING: Loki did not become ready"
docker logs --tail=200 ono-loki-prod || true
docker logs --tail=200 ono-promtail-prod || true
exit 1
fi

echo "Checking Loki received production logs..."
for i in $(seq 1 12); do
result=$(curl -fsG "http://localhost:3100/loki/api/v1/label/container/values" || true)
if echo "$result" | grep -Eq '"ono-(app-prod-blue|app-prod-green|mysql-prod|redis-prod|rabbitmq-prod|prometheus-prod|grafana-prod|loki-prod|promtail-prod|mysql-exporter-prod)"'; then
echo "Loki received production log labels"
exit 0
fi
echo "Waiting Loki production log labels... ($i/12)"
sleep 5
done

echo "WARNING: Loki did not receive expected production log labels"
curl -fsG "http://localhost:3100/loki/api/v1/labels" || true
docker logs --tail=200 ono-loki-prod || true
docker logs --tail=200 ono-promtail-prod || true
exit 1
shell: bash

- name: Clean up old Docker images
run: |
docker image prune -f --filter "until=24h"
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/restart-monitoring.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,16 @@ jobs:
if: ${{ github.event.inputs.target == 'dev' }}
run: |
docker compose -f docker-compose.dev.yml --env-file .env.dev --profile monitoring up -d --force-recreate \
mysql-exporter-dev prometheus-dev grafana-dev
mysql-exporter-dev prometheus-dev loki-dev promtail-dev grafana-dev
docker compose -f docker-compose.dev.yml --env-file .env.dev ps \
mysql-exporter-dev prometheus-dev grafana-dev
mysql-exporter-dev prometheus-dev loki-dev promtail-dev grafana-dev
shell: bash

- name: Restart monitoring stack (prod)
if: ${{ github.event.inputs.target == 'prod' }}
run: |
docker compose -f docker-compose.prod.yml --env-file .env.prod --profile monitoring up -d --force-recreate \
mysql-exporter-prod prometheus-prod grafana-prod
mysql-exporter-prod prometheus-prod loki-prod promtail-prod grafana-prod
docker compose -f docker-compose.prod.yml --env-file .env.prod ps \
mysql-exporter-prod prometheus-prod grafana-prod
mysql-exporter-prod prometheus-prod loki-prod promtail-prod grafana-prod
shell: bash
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,13 @@ application-prod.properties
application-local.yml
application-dev.yml
application-prod.yml
application-test.yml
FirebaseAdminKey.json

**/db/migration/
**/db/migration/*
!**/db/migration/
!**/db/migration/README.md
!**/db/migration/V*.sql

### Environment variables
.env
Expand All @@ -61,3 +65,7 @@ monitoring/README.md

### macOS
.DS_Store

### Local agent guidance
/AGENTS.md
.claude.md
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ jar {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.1.0'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'net.logstash.logback:logstash-logback-encoder:7.4'
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
implementation 'com.google.api-client:google-api-client:2.4.0'
Expand All @@ -55,6 +56,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-amqp'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

// Hibernate Core
Expand All @@ -77,6 +80,7 @@ dependencies {

tasks.named('test') {
useJUnitPlatform()
systemProperty 'spring.profiles.active', 'test'
}

tasks.withType(JavaCompile) {
Expand Down
47 changes: 47 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,48 @@ services:
profiles:
- monitoring

# Loki - DEVELOPMENT (Profile: monitoring)
loki-dev:
image: grafana/loki:2.9.8
container_name: ono-loki-dev
restart: unless-stopped
command:
- -config.file=/etc/loki/loki.yml
ports:
- "127.0.0.1:3101:3100"
volumes:
- ./monitoring/loki.dev.yml:/etc/loki/loki.yml:ro
- loki_dev_data:/loki
mem_limit: 512m
cpus: "0.50"
networks:
- ono-network
profiles:
- monitoring

# Promtail - DEVELOPMENT (Profile: monitoring)
promtail-dev:
image: grafana/promtail:3.6.10
container_name: ono-promtail-dev
restart: unless-stopped
environment:
DOCKER_API_VERSION: "1.44"
command:
- -config.file=/etc/promtail/promtail.yml
volumes:
- ./monitoring/promtail.dev.yml:/etc/promtail/promtail.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- promtail_dev_positions:/tmp
mem_limit: 256m
cpus: "0.25"
depends_on:
- loki-dev
networks:
- ono-network
profiles:
- monitoring

mysql-exporter-dev:
image: prom/mysqld-exporter:v0.15.1
container_name: ono-mysql-exporter-dev
Expand Down Expand Up @@ -180,6 +222,7 @@ services:
- ./monitoring/grafana/dashboards:/etc/grafana/dashboards:ro
depends_on:
- prometheus-dev
- loki-dev
networks:
- ono-network
profiles:
Expand All @@ -201,5 +244,9 @@ volumes:
driver: local
prometheus_dev_data:
driver: local
loki_dev_data:
driver: local
promtail_dev_positions:
driver: local
grafana_dev_data:
driver: local
47 changes: 47 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,48 @@ services:
profiles:
- monitoring

# Loki - PRODUCTION (Profile: monitoring)
loki-prod:
image: grafana/loki:2.9.8
container_name: ono-loki-prod
restart: unless-stopped
command:
- -config.file=/etc/loki/loki.yml
ports:
- "127.0.0.1:3100:3100"
volumes:
- ./monitoring/loki.prod.yml:/etc/loki/loki.yml:ro
- loki_prod_data:/loki
mem_limit: 768m
cpus: "0.75"
networks:
- ono-network
profiles:
- monitoring

# Promtail - PRODUCTION (Profile: monitoring)
promtail-prod:
image: grafana/promtail:3.6.10
container_name: ono-promtail-prod
restart: unless-stopped
environment:
DOCKER_API_VERSION: "1.44"
command:
- -config.file=/etc/promtail/promtail.yml
volumes:
- ./monitoring/promtail.prod.yml:/etc/promtail/promtail.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- promtail_prod_positions:/tmp
mem_limit: 256m
cpus: "0.25"
depends_on:
- loki-prod
networks:
- ono-network
profiles:
- monitoring

mysql-exporter-prod:
image: prom/mysqld-exporter:v0.15.1
container_name: ono-mysql-exporter-prod
Expand Down Expand Up @@ -234,6 +276,7 @@ services:
- ./monitoring/grafana/dashboards:/etc/grafana/dashboards:ro
depends_on:
- prometheus-prod
- loki-prod
networks:
- ono-network
profiles:
Expand All @@ -254,5 +297,9 @@ volumes:
driver: local
prometheus_prod_data:
driver: local
loki_prod_data:
driver: local
promtail_prod_positions:
driver: local
grafana_prod_data:
driver: local
Loading
Loading