Files
blog-backend/docker-compose.yml
pwy3282040@msecure.co 49d435079f feat: JWT 기반 인증 시스템 및 이메일 가입 구현
[인프라]
- Docker Compose 구성 (DB, Redis, MinIO)
- Spring Boot 3.5.9 + Kotlin + Gradle 설정

[인증/보안]
- Spring Security 및 JWT 필터 설정
- RTR(Refresh Token Rotation) 방식의 토큰 재발급 로직 구현
- Redis를 활용한 Refresh Token 및 이메일 인증 코드 관리

[기능 구현]
- 회원가입 (이메일 인증 포함)
- 로그인/로그아웃/토큰재발급 API 구현
- 공통 응답(ApiResponse) 및 전역 예외 처리(GlobalExceptionHandler) 적용
2025-12-26 12:58:51 +09:00

92 lines
2.5 KiB
YAML

services:
# 1. 백엔드 애플리케이션
blog-api:
build: .
container_name: blog-api
restart: always
ports:
- "8080:8080"
environment:
# Database
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/blog_db
- SPRING_DATASOURCE_USERNAME=${DB_USER}
- SPRING_DATASOURCE_PASSWORD=${DB_PASS}
# Redis
- SPRING_DATA_REDIS_HOST=redis
- SPRING_DATA_REDIS_PORT=6379
# AWS S3 / MinIO (Docker 내부 통신용)
- CLOUD_AWS_CREDENTIALS_ACCESS_KEY=admin
- CLOUD_AWS_CREDENTIALS_SECRET_KEY=password
- CLOUD_AWS_REGION_STATIC=ap-northeast-2
- CLOUD_AWS_S3_ENDPOINT=http://minio:9000
# SMTP 메일 설정
- SPRING_MAIL_HOST=smtp.gmail.com
- SPRING_MAIL_PORT=587
- SPRING_MAIL_USERNAME=${MAIL_USER}
- SPRING_MAIL_PASSWORD=${MAIL_PASS}
# SMTP 세부 설정
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=true
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=true
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIRED=true
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_CONNECTIONTIMEOUT=5000
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_TIMEOUT=5000
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_WRITETIMEOUT=5000
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- blog-net
# 2. 데이터베이스 (PostgreSQL)
db:
image: postgres:17-alpine
container_name: blog-db
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: blog_db
volumes:
- ./postgres_data:/var/lib/postgresql/data
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${DB_USER} -d blog_db" ]
interval: 5s
retries: 5
networks:
- blog-net
# 3. 캐시 서버 (Redis)
redis:
image: redis:7-alpine
container_name: blog-redis
restart: always
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 5
networks:
- blog-net
# 4. 오브젝트 스토리지 (MinIO)
minio:
image: minio/minio
container_name: minio
ports:
- "9000:9000" # API 통신
- "9001:9001" # 웹 콘솔
environment:
MINIO_ROOT_USER: "admin"
MINIO_ROOT_PASSWORD: "password"
command: server /data --console-address ":9001"
volumes:
- ./minio_data:/data
networks:
- blog-net
networks:
blog-net:
driver: bridge