팀장
팀원
팀원
팀원
팀원
김창현
김정은
이예나
이한아
황요한
✏️TEENKIRI: 초등학생을 위한 온라인 교육 사이트
TEENKIRI는 초등학생을 위한 혁신적인 온라인 교육 플랫폼입니다. 현대 사회에서 교육의 질은 학생의 미래를 결정짓는 중요한 요소입니다. TEENKIRI는 모든 학생이 차별 없이 양질의 교육을 받을 수 있도록, 무료로 최고의 학습 콘텐츠를 제공합니다.
TEENKIRI의 목표는 무상으로 제공되는 고품질 교육을 통해 경제적 격차로 인한 교육 불평등을 해소하고, 모든 학생에게 공정한 교육 기회를 제공하는 것입니다. 이를 통해 학부모의 경제적 부담을 줄이고, 학생들이 자신의 잠재력을 최대한 발휘할 수 있도록 지원합니다.
기능
설명
간편한 회원가입
구글 로그인 또는 이메일 인증을 통한 간편한 회원가입으로, 학생들은 빠르고 쉽게 TEENKIRI의 모든 강의를 수강할 수 있습니다.
다양한 강좌
과목별로 다채로운 강좌와 강의를 그리고 추천목록을 제공하여 학생들이 자신에게 맞는 선생님과 강좌를 자유롭게 선택할 수 있습니다.
온라인 영상 강의
언제 어디서든 수강 가능한 고품질 녹화 강의를 제공하여 학생들이 자신의 학습 속도에 맞춰 체계적으로 학습하고 진행률을 확인할 수 있습니다.
소통 기능
채팅, 자유게시판, 댓글 등을 통해 다른 학생들과 자유롭게 의견을 나누고 소통할 수 있습니다.
질의응답 시스템
학습 중 어려운 부분이나 궁금한 점이 생기면 사진이나 글로 질문을 남길 수 있으며, 실시간 알림을 통해 해당 강좌의 강사가 신속하고 정확한 답변을 제공합니다.
실시간 알림
질문에 대한 답변이나 댓글 알림을 학생들에게 실시간으로 전달하여 빠르고 원활한 학습 환경을 지원합니다.
실시간 채팅
과목별 실시간 채팅을 이용하여, 궁금한 점이 생기면 사용자간 실시간으로 질문을 주고 받을 수 있습니다.
신고 기능
부적절한 게시글이나 댓글, 채팅을 신고하여 관리하며, 안전하고 건전한 학습 환경을 유지합니다.
API 명세서
WBS 보기
요구사항 명세서 보기
Kubernetes
docker compose
아키텍처
다중호스트
단일호스트
확상성
Scale-Out
Scale-Up
로드밸런싱
자동설정
직접설정
HA
장애 감지 및 자동 복구
장애 발생 시 서비스 다운
설정편의성
내부 서비스 디스커버리 자동 설정
서비스의 IP 주소나 도메인을 직접 지정
통신플로우
세션 로그인 플로우
Back-End
teenkiri_k8s.yml
name: deploy ordersystem with k8s
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: checkout github (source code checkout)
uses: actions/checkout@v2
- name: install kubectl
uses: azure/setup-kubectl@v3
with:
version: "v1.25.9"
id: install
- name: configure aws (key setting)
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{secrets.AWS_KEY}}
aws-secret-access-key: ${{secrets.AWS_SECRET}}
aws-region: ap-northeast-2
- name: update cluster information
run : aws eks update-kubeconfig --name teenkiri-cluster --region ap-northeast-2
- name: login ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: build and push docker images to ecr (env:변수명지정)
env:
REGISTRY: 346903264902.dkr.ecr.ap-northeast-2.amazonaws.com
REPOSITORY: teenkiri
run: |
docker build -t $REGISTRY/$REPOSITORY:latest -f ./Dockerfile .
docker push $REGISTRY/$REPOSITORY:latest
- name: eks kubectl apply
run: |
kubectl apply -f ./k8s/teenkiri_depl.yml
kubectl rollout restart deployment teenkiri-deployment -n teenkiri
certificate.yml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# 인증서 서버 주소. 해당 서버의 리소스를 통해 인증서 발행
server: https://acme-v02.api.letsencrypt.org/directory
email: snikuz12@naver.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
# 3. Certificate 생성
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: teenkiri-com-tls
namespace: teenkiri
spec:
secretName: teenkiri-com-tls
duration: 2160h # 90일
renewBefore: 36h # 15일전에 갱신
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: server.teenkiri.site
dnsNames:
- server.teenkiri.site
teenkiri_depl.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: teenkiri-deployment
namespace: teenkiri
spec:
replicas: 3
selector:
matchLabels:
app: teenkiri
template:
metadata:
labels:
app: teenkiri
spec:
containers:
- name: teenkiri
image: 346903264902.dkr.ecr.ap-northeast-2.amazonaws.com/teenkiri:latest
ports:
- containerPort: 8080
resources:
limits:
cpu: "1"
memory: "500Mi"
requests:
cpu: "0.5"
memory: "500Mi"
env:
- name: REDIS_HOST
valueFrom:
secretKeyRef:
key: REDIS_HOST
name: teenkiri-app-secrets
- name: REDIS_PORT
valueFrom:
secretKeyRef:
key: REDIS_PORT
name: teenkiri-app-secrets
- name: DB_HOST
valueFrom:
secretKeyRef:
key: DB_HOST
name: teenkiri-app-secrets
- name: DB_USERNAME
valueFrom:
secretKeyRef:
key: DB_USERNAME
name: teenkiri-app-secrets
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
key: DB_PASSWORD
name: teenkiri-app-secrets
- name: JWT_SECRET
valueFrom:
secretKeyRef:
key: JWT_SECRET
name: teenkiri-app-secrets
- name: JWT_SECRET_RT
valueFrom:
secretKeyRef:
key: JWT_SECRET_RT
name: teenkiri-app-secrets
- name: AWS_ACCESS_KEY
valueFrom:
secretKeyRef:
key: AWS_ACCESS_KEY
name: teenkiri-app-secrets
- name: AWS_SECRET_KEY
valueFrom:
secretKeyRef:
key: AWS_SECRET_KEY
name: teenkiri-app-secrets
- name: JWT_TIME
valueFrom:
secretKeyRef:
key: JWT_TIME
name: teenkiri-app-secrets
- name: JWT_TIME_RT
valueFrom:
secretKeyRef:
key: JWT_TIME_RT
name: teenkiri-app-secrets
- name: GOOGLE_TOKEN
valueFrom:
secretKeyRef:
key: GOOGLE_TOKEN
name: teenkiri-app-secrets
- name: GOOGLE_SECRET
valueFrom:
secretKeyRef:
key: GOOGLE_SECRET
name: teenkiri-app-secrets
- name: KAKAO_TOKEN
valueFrom:
secretKeyRef:
key: KAKAO_TOKEN
name: teenkiri-app-secrets
- name: KAKAO_SECRET
valueFrom:
secretKeyRef:
key: KAKAO_SECRET
name: teenkiri-app-secrets
- name: NAVER_TOKEN
valueFrom:
secretKeyRef:
key: NAVER_TOKEN
name: teenkiri-app-secrets
- name: NAVER_SECRET
valueFrom:
secretKeyRef:
key: NAVER_SECRET
name: teenkiri-app-secrets
- name: AUTH_HOST
valueFrom:
secretKeyRef:
key: AUTH_HOST
name: teenkiri-app-secrets
- name: AUTH_PORT
valueFrom:
secretKeyRef:
key: AUTH_PORT
name: teenkiri-app-secrets
- name: AUTH_EMAIL
valueFrom:
secretKeyRef:
key: AUTH_EMAIL
name: teenkiri-app-secrets
- name: AUTH_KEY
valueFrom:
secretKeyRef:
key: AUTH_KEY
name: teenkiri-app-secrets
- name: BUCKET
valueFrom:
secretKeyRef:
key: BUCKET
name: teenkiri-app-secrets
teenkiri_ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: teenkiri-ingress
namespace: teenkiri
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "3G"
nginx.ingress.kubernetes.io/client-body-buffer-size: "3G"
nginx.ingress.kubernetes.io/affinity: "cookie" # 세션 스티키니스 활성화
nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session" # 세션 쿠키 이름
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1" # 쿠키 해시 알고리즘
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- "server.teenkiri.site"
secretName: teenkiri-com-tls
rules:
- host: server.teenkiri.site
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: teenkiri-service
port:
number: 80
teenkiri_service.yml
apiVersion: v1
kind: Service
metadata:
name: teenkiri-service
namespace: teenkiri
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 8080
- name: tomcat
port: 8090
targetPort: 8090
selector:
app: teenkiri
Configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
proxy-body-size: "3G"
client-body-buffer-size: "3G"
소셜로그인 오류 이유
소셜로그인 오류 해결
파일업로드
nginx 파일크기 미설정으로 인한 오류
tomcat 파일크기 미설정으로 인한 오류
ingress.yml 수정내역
nginx.ingress.kubernetes.io/affinity: "cookie" # 세션 스티키니스 활성화
nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session" # 세션 쿠키 이름
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1" # 쿠키 해시 알고리즘
ingress.yml 수정내역
nginx.ingress.kubernetes.io/affinity: "cookie" # 세션 스티키니스 활성화
nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session" # 세션 쿠키 이름
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1" # 쿠키 해시 알고리즘
application.yml 수정내역
spring:
servlet:
multipart:
max-file-size: 3GB # 파일당 최대 크기
max-request-size: 3GB # 전체 요청 크기
회원가입 및 로그인, 회원탈퇴
구글 로그인
카카오 로그인
아이디 저장
아이디 찾기
비밀번호 찾기
비밀번호 재설정 링크 사용자 이메일로 전송
구글 로그인
id 저장
로그인 및 로그아웃
로그인
로그아웃
회원탈퇴
회원탈퇴 확인
강좌 생성 및 강좌 리스트, 강좌 상세
강좌 추천
강좌 수강신청 및 내가 수강중인 강좌 리스트
강의 시청 플레이어, 강의 진행률 서버와 통신, 강의 수강완료 여부 통신
강의 후기 작성 및 조회
강좌 찜, 찜 목록
자유게시판 검색
자유게시판 작성, 수정, 삭제, 댓글, 신고
질문 게시판 검색
질문 게시판 작성, 수정, 삭제, 댓글, 신고, 알림
실시간 채팅
알림 드롭다운, 알림 목록 조회
게시판별 신고 목록 - 관리자
신고 누적으로 계정 정지된 회원 확인 - 관리자
회원 탈퇴 처리 확인