diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0be114b..aa1dc02 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,70 +1,114 @@ -name: Deploy Spring Boot Project +name: Deploy to Development Server on: + push: + branches: [develop] pull_request: - branches: - - main + branches: [develop] jobs: build-and-deploy: + permissions: + contents: read + packages: write runs-on: ubuntu-latest + environment: development steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - token: ${{ secrets.GH_TOKEN }} - - - name: Set up JDK 17 - uses: actions/setup-java@v2 - with: - distribution: 'adopt' - java-version: '17' - - - name: Cache Gradle packages - uses: actions/cache@v2 + token: ${{ secrets.GH_PAT }} + + # Gradle 캐시 설정 + - name: Setup Gradle cache + uses: actions/cache@v3 with: - path: ~/.gradle/caches + path: | + ~/.gradle/caches + ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: ${{ runner.os }}-gradle - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - # --- (1) build 시 테스트 무시: -x test --- - - name: Build with Gradle - run: ./gradlew build -x test - - - name: Install sshpass - run: sudo apt-get install -y sshpass + restore-keys: ${{ runner.os }}-gradle- - # 빌드 산출물(JAR 파일)을 원격 서버로 복사 - - name: Copy build artifacts + # 서브모듈 설정 + - name: Setup submodule run: | - JAR_FILE=$(ls build/libs/*.jar | sort -r | head -n 1) - echo "JAR_FILE=$JAR_FILE" >> $GITHUB_ENV - sshpass -p ${{ secrets.SSH_PASSWORD }} scp -o StrictHostKeyChecking=no -r "$JAR_FILE" ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/home/anhye0n/web/tutorial_sejong/backend/ + cd src/main/resources/config + git fetch origin develop:develop + git checkout develop + cp data-dev.sql ../data-dev.sql + cd ../../../../ - # --- (2) systemd daemon-reload 추가 후 서비스 재시작 --- - - name: Restart backend service - run: | - sshpass -p ${{ secrets.SSH_PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << EOF - cd /home/anhye0n/web/tutorial_sejong/backend/ - git submodule update --init --recursive + # GitHub Container Registry 로그인 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GH_PAT }} + + # 도커 빌더 설정 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Backend 이미지 빌드 및 푸시 + - name: Build and push Backend image + uses: docker/build-push-action@v5 + with: + context: . + file: docker-files/backend/Dockerfile + push: true + tags: ${{ secrets.BACKEND_IMAGE }} + platforms: linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max - CURRENT_PID=\$(lsof -t -i:8080) - if [ -n "\$CURRENT_PID" ]; then - echo "Stopping process using port 8080 with PID \$CURRENT_PID" - echo ${{ secrets.SSH_PASSWORD }} | sudo -S kill -9 \$CURRENT_PID - fi + # 필요한 파일만 서버로 전송 + - name: Copy deployment files + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.HOST }} + port: ${{ secrets.PORT }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + source: "docker-compose.yml,docker-files/nginx/" + target: "${{ secrets.DEPLOY_PATH }}" + strip_components: 0 - # systemd 설정 변경/추가 후 재로딩 - echo ${{ secrets.SSH_PASSWORD }} | sudo -S systemctl daemon-reload - echo ${{ secrets.SSH_PASSWORD }} | sudo -S systemctl restart tutorial_sejong_backend - echo ${{ secrets.SSH_PASSWORD }} | sudo -S systemctl status tutorial_sejong_backend + # 백엔드 배포 + - name: Deploy backend + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.HOST }} + port: ${{ secrets.PORT }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + cd ${{ secrets.DEPLOY_PATH }} - # DB 스크립트 실행 (15초 대기 후) - sleep 15 - mysql -u ${{ secrets.MARIADB_ID }} -p${{ secrets.MARIADB_PASSWORD }} < /home/anhye0n/web/tutorial_sejong/backend/tutorial_sejong.sql - EOF + # GitHub Container Registry 로그인 추가 + echo ${{ secrets.GH_PAT }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + # 환경 변수 파일 생성 + cat > .env << EOL + DB_ROOT_PASSWORD=${{ secrets.DB_ROOT_PASSWORD }} + DB_NAME=${{ secrets.DB_NAME }} + DB_USER=${{ secrets.DB_USER }} + DB_PASSWORD=${{ secrets.DB_PASSWORD }} + DOMAIN_NAME=${{ secrets.DOMAIN_NAME }} + BACKEND_PORT=${{ secrets.BACKEND_PORT }} + NGINX_PORT=${{ secrets.NGINX_PORT }} + DB_PORT=${{ secrets.DB_PORT }} + BACKEND_IMAGE=${{ secrets.BACKEND_IMAGE }} + EOL + + # 백엔드만 재배포 + docker-compose pull backend + docker-compose up -d --no-deps backend + + # 상태 확인 + docker-compose ps + + # 미사용 이미지 정리 + docker image prune -f --filter "until=168h" diff --git a/.gitignore b/.gitignore index 66b7e79..46738b1 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ out/ application*.properties src/main/resources/config -logs/* \ No newline at end of file +logs/* +.env diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4d1831c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +services: + nginx: + image: nginx:alpine@arm64 + container_name: cr-nginx + depends_on: + backend: + condition: service_started + ports: + - "${NGINX_PORT}:80" + volumes: + - ./docker-files/nginx/nginx.conf:/etc/nginx/conf.d/default.conf + networks: + - app-network + restart: unless-stopped + + mariadb: + image: mariadb:latest@arm64 + container_name: cr-mariadb + healthcheck: + test: ["CMD", "mariadb", "-h", "localhost", "-u${DB_USER}", "-p${DB_PASSWORD}", "-e", "SELECT 1"] + start_period: 30s + interval: 10s + timeout: 5s + retries: 5 + environment: + MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + MARIADB_DATABASE: ${DB_NAME} + MARIADB_USER: ${DB_USER} + MARIADB_PASSWORD: ${DB_PASSWORD} + ports: + - "${DB_PORT}:3306" + volumes: + - mariadb-data:/var/lib/mysql + networks: + - app-network + restart: unless-stopped + + backend: + image: ${BACKEND_IMAGE} + platform: linux/arm64 + container_name: cr-backend + depends_on: + mariadb: + condition: service_healthy + environment: + - DB_NAME=${DB_NAME} + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + ports: + - "${BACKEND_PORT}:8080" + networks: + - app-network + restart: unless-stopped + +networks: + app-network: + driver: bridge + +volumes: + mariadb-data: diff --git a/docker-files/backend/.dockerignore b/docker-files/backend/.dockerignore new file mode 100644 index 0000000..3dcf664 --- /dev/null +++ b/docker-files/backend/.dockerignore @@ -0,0 +1,8 @@ +.git +.gradle +.idea +build +!build/libs/*.jar +*.md +*.log +**/test/ diff --git a/docker-files/backend/Dockerfile b/docker-files/backend/Dockerfile new file mode 100644 index 0000000..6209976 --- /dev/null +++ b/docker-files/backend/Dockerfile @@ -0,0 +1,23 @@ +# 빌드 스테이지 +FROM amazoncorretto:17-alpine as build + +WORKDIR /workspace/app + +COPY gradle gradle +COPY build.gradle settings.gradle gradlew ./ +COPY src src + +RUN chmod +x ./gradlew +RUN ./gradlew bootJar +RUN mkdir -p build/libs + +# 실행 스테이지 +FROM amazoncorretto:17-alpine + +VOLUME /tmp + +COPY --from=build /workspace/app/build/libs/*.jar app.jar + +EXPOSE 8080 + +ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "/app.jar"] diff --git a/docker-files/nginx/nginx.conf b/docker-files/nginx/nginx.conf new file mode 100644 index 0000000..f13028e --- /dev/null +++ b/docker-files/nginx/nginx.conf @@ -0,0 +1,12 @@ +server { + listen 80; + server_name ${DOMAIN_NAME}; + + location / { + proxy_pass http://backend:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/scripts/set-github-secrets.sh b/scripts/set-github-secrets.sh new file mode 100644 index 0000000..e6187ff --- /dev/null +++ b/scripts/set-github-secrets.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# ANSI 색상 코드 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' # No Color + +# 사용법 체크 +if [ -z "$1" ]; then + echo "${RED}Usage: ./set-github-env-secrets.sh ${NC}" + echo "${YELLOW}Example: ./set-github-env-secrets.sh development${NC}" + exit 1 +fi + +ENVIRONMENT=$1 + +# Environment secrets 설정 +echo "⚙️ ${GREEN}GitHub ${ENVIRONMENT} environment secrets 설정을 시작합니다...${NC}" + +# .env 파일이 존재하는지 확인 +if [ ! -f .env ]; then + echo "${RED}Error: .env 파일을 찾을 수 없습니다.${NC}" + exit 1 +fi + +# .env 파일을 읽어서 secrets 설정 +while IFS='=' read -r key value +do + if [ ! -z "$key" ] && [ ! -z "$value" ]; then + gh secret set "$key" -b"$value" --env $ENVIRONMENT || exit 1 + fi +done < .env + +# SSH key 설정 (선택적) +if [ -f ~/.ssh/id_ed25519 ]; then + gh secret set SSH_PRIVATE_KEY -b"$(cat ~/.ssh/id_ed25519)" --env $ENVIRONMENT || exit 1 +fi + +echo "✅ ${GREEN}GitHub ${ENVIRONMENT} environment secrets 설정이 완료되었습니다!${NC}" diff --git a/scripts/setup-ssh-key.sh b/scripts/setup-ssh-key.sh new file mode 100644 index 0000000..2576b84 --- /dev/null +++ b/scripts/setup-ssh-key.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# ANSI 색상 코드 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' + +# SSH 디렉토리 및 파일 확인 +echo "SSH 설정을 확인합니다..." + +# .ssh 디렉토리가 없으면 생성 +if [ ! -d ~/.ssh ]; then + echo ".ssh 디렉토리를 생성합니다..." + mkdir -p ~/.ssh + chmod 700 ~/.ssh +fi + +# id_ed25519 파일이 이미 존재하는지 확인 +if [ -f ~/.ssh/id_ed25519 ]; then + echo "${YELLOW}SSH 키가 이미 존재합니다.${NC}" + echo "기존 키를 사용하시겠습니까? (y/n)" + read -r response + if [ "$response" = "y" ]; then + echo "${GREEN}기존 SSH 키를 사용합니다.${NC}" + else + echo "새로운 키로 대체하시겠습니까? 이 작업은 되돌릴 수 없습니다. (y/n)" + read -r replace + if [ "$replace" = "y" ]; then + echo "${RED}Warning: 필요한 경우 기존 키를 먼저 백업하는 것을 추천합니다.${NC}" + echo "계속하시겠습니까? (y/n)" + read -r confirm + if [ "$confirm" = "y" ]; then + echo "새로운 SSH 키를 생성합니다..." + echo "이메일 주소를 입력해주세요:" + read -r email + rm ~/.ssh/id_ed25519* + ssh-keygen -t ed25519 -b 4096 -C "$email" + else + echo "${RED}스크립트를 종료합니다.${NC}" + exit 1 + fi + else + echo "${RED}스크립트를 종료합니다.${NC}" + exit 1 + fi + fi +else + # SSH 키 생성 + echo "새로운 SSH 키를 생성합니다..." + echo "이메일 주소를 입력해주세요:" + read -r email + ssh-keygen -t ed25519 -b 4096 -C "$email" +fi + +# authorized_keys 설정 +echo "authorized_keys 파일을 설정합니다..." +cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys +chmod 600 ~/.ssh/authorized_keys + +echo "${GREEN}SSH 키 설정이 완료되었습니다!${NC}" diff --git a/src/main/java/com/tutorialsejong/courseregistration/TutorialSejongApplication.java b/src/main/java/com/tutorialsejong/courseregistration/TutorialSejongApplication.java index 3d1329c..3df0c1d 100644 --- a/src/main/java/com/tutorialsejong/courseregistration/TutorialSejongApplication.java +++ b/src/main/java/com/tutorialsejong/courseregistration/TutorialSejongApplication.java @@ -9,5 +9,4 @@ public class TutorialSejongApplication { public static void main(String[] args) { SpringApplication.run(TutorialSejongApplication.class, args); } - } diff --git a/src/main/java/com/tutorialsejong/courseregistration/common/exception/BusinessException.java b/src/main/java/com/tutorialsejong/courseregistration/common/exception/BusinessException.java index 9be2936..b0d0201 100644 --- a/src/main/java/com/tutorialsejong/courseregistration/common/exception/BusinessException.java +++ b/src/main/java/com/tutorialsejong/courseregistration/common/exception/BusinessException.java @@ -1,9 +1,6 @@ package com.tutorialsejong.courseregistration.common.exception; -import com.tutorialsejong.courseregistration.domain.auth.controller.AuthController; import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Getter public class BusinessException extends RuntimeException { diff --git a/src/main/java/com/tutorialsejong/courseregistration/common/security/JwtTokenProvider.java b/src/main/java/com/tutorialsejong/courseregistration/common/security/JwtTokenProvider.java index 22b4b51..35929f5 100644 --- a/src/main/java/com/tutorialsejong/courseregistration/common/security/JwtTokenProvider.java +++ b/src/main/java/com/tutorialsejong/courseregistration/common/security/JwtTokenProvider.java @@ -93,10 +93,9 @@ public void validateToken(String token) { .build().toString()); throw new JwtTokenExpiredException(); } catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException ex) { - String username = getUsernameFromJWT(token); logger.warn(LogMessage.builder() .action(LogAction.VALIDATE_TOKEN) - .subject("s" + username) + .subject("unknown") .result(LogResult.FAIL) .reason(LogReason.INVALID_CREDENTIAL) .build().toString()); diff --git a/src/main/java/com/tutorialsejong/courseregistration/domain/auth/dto/JwtTokens.java b/src/main/java/com/tutorialsejong/courseregistration/domain/auth/dto/JwtTokens.java index f2f6f67..28cc7b3 100644 --- a/src/main/java/com/tutorialsejong/courseregistration/domain/auth/dto/JwtTokens.java +++ b/src/main/java/com/tutorialsejong/courseregistration/domain/auth/dto/JwtTokens.java @@ -2,5 +2,6 @@ public record JwtTokens( String accessToken, - String refreshToken) { + String refreshToken +) { } diff --git a/src/main/java/com/tutorialsejong/courseregistration/domain/schedule/dto/ErrorDto.java b/src/main/java/com/tutorialsejong/courseregistration/domain/schedule/dto/ErrorDto.java index 69b0569..43996c5 100644 --- a/src/main/java/com/tutorialsejong/courseregistration/domain/schedule/dto/ErrorDto.java +++ b/src/main/java/com/tutorialsejong/courseregistration/domain/schedule/dto/ErrorDto.java @@ -2,5 +2,10 @@ import java.util.Date; -public record ErrorDto(Date timestamp, Integer statusCode, String message, String details) { +public record ErrorDto( + Date timestamp, + Integer statusCode, + String message, + String details +) { } diff --git a/src/main/resources/data-dev.sql b/src/main/resources/data-dev.sql new file mode 100644 index 0000000..2ac0c2a --- /dev/null +++ b/src/main/resources/data-dev.sql @@ -0,0 +1,54 @@ +-- 강의 일정 데이터 삽입 +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('CS', '101', '01', 'ENG', '컴퓨터과학개론', '한국어', + '전공필수', '전공', '3', '1', '3학점', + '컴퓨터공학과', '홍길동', '월수금 9:00-10:30', '공학관 101호', '오프라인', + '해당없음', 'N', '비고 없음', 0); + +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('CS', '101', '02', 'ENG', '컴퓨터과학개론', '한국어', + '전공필수', '전공', '3', '1', '3학점', + '컴퓨터공학과', '김길동', '월수금 9:00-10:30', '공학관 101호', '오프라인', + '해당없음', 'N', '비고 없음', 0); + +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('CS', '101', '03', 'ENG', '컴퓨터과학개론', '한국어', + '전공필수', '전공', '3', '1', '3학점', + '컴퓨터공학과', '오길동', '월수금 9:00-10:30', '공학관 101호', '오프라인', + '해당없음', 'N', '비고 없음', 0); + +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('MATH', '990', '02', 'SCI', '미적분학', '영어', + '전공선택', '전공', '3', '1', '3학점', + '수학과', '김철수', '화목 13:00-14:30', '과학관 201호', '오프라인', + '해당없음', 'N', '비고 없음', 0); + +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('DRAWING', '770', '02', 'SCI', '서양화', '미술', + '전공선택', '전공', '3', '1', '3학점', + '수학과', '김철수', '화목 13:00-14:30', '미술관 201호', '오프라인', + '해당없음', 'N', '비고 없음', 0); + +INSERT INTO course_schedule (sch_dept_alias, curi_no, class_no, sch_college_alias, curi_nm, curi_lang_nm, + curi_type_cd_nm, slt_domain_cd_nm, tm_num, student_year, cors_unit_grp_cd_nm, + manage_dept_nm, lesn_emp, lesn_time, lesn_room, cyber_type_cd_nm, + internship_type_cd_nm, inout_sub_cdt_exchange_yn, remark, wish_count) +VALUES ('COMPUTER', '1110', '02', 'SCI', '데이터베이스', '컴퓨터', + '전공선택', '전공', '3', '1', '3학점', + '수학과', '김철수', '화목 13:00-14:30', '소프트웨어 201호', '오프라인', + '해당없음', 'N', '비고 없음', 0); diff --git a/src/main/resources/for-test-github-actions b/src/main/resources/for-test-github-actions new file mode 100644 index 0000000..bc442e8 --- /dev/null +++ b/src/main/resources/for-test-github-actions @@ -0,0 +1 @@ +깃허브 액션 테스트용 파일입니다. diff --git a/src/main/resources/static/macro/1.jpg b/src/main/resources/static/macro/1.jpg deleted file mode 100644 index c508a57..0000000 Binary files a/src/main/resources/static/macro/1.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/10.jpg b/src/main/resources/static/macro/10.jpg deleted file mode 100644 index 7f5a976..0000000 Binary files a/src/main/resources/static/macro/10.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/11.jpg b/src/main/resources/static/macro/11.jpg deleted file mode 100644 index f9ae0f9..0000000 Binary files a/src/main/resources/static/macro/11.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/12.jpg b/src/main/resources/static/macro/12.jpg deleted file mode 100644 index 025c749..0000000 Binary files a/src/main/resources/static/macro/12.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/13.jpg b/src/main/resources/static/macro/13.jpg deleted file mode 100644 index e934b81..0000000 Binary files a/src/main/resources/static/macro/13.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/14.jpg b/src/main/resources/static/macro/14.jpg deleted file mode 100644 index 7515abb..0000000 Binary files a/src/main/resources/static/macro/14.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/15.jpg b/src/main/resources/static/macro/15.jpg deleted file mode 100644 index f2428d9..0000000 Binary files a/src/main/resources/static/macro/15.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/16.jpg b/src/main/resources/static/macro/16.jpg deleted file mode 100644 index 8cd9856..0000000 Binary files a/src/main/resources/static/macro/16.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/17.jpg b/src/main/resources/static/macro/17.jpg deleted file mode 100644 index b2f0ca3..0000000 Binary files a/src/main/resources/static/macro/17.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/18.jpg b/src/main/resources/static/macro/18.jpg deleted file mode 100644 index f02a636..0000000 Binary files a/src/main/resources/static/macro/18.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/19.jpg b/src/main/resources/static/macro/19.jpg deleted file mode 100644 index 451321d..0000000 Binary files a/src/main/resources/static/macro/19.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/2.jpg b/src/main/resources/static/macro/2.jpg deleted file mode 100644 index c4bf94c..0000000 Binary files a/src/main/resources/static/macro/2.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/20.jpg b/src/main/resources/static/macro/20.jpg deleted file mode 100644 index c4e6fec..0000000 Binary files a/src/main/resources/static/macro/20.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/21.jpg b/src/main/resources/static/macro/21.jpg deleted file mode 100644 index 2eb40c7..0000000 Binary files a/src/main/resources/static/macro/21.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/22.jpg b/src/main/resources/static/macro/22.jpg deleted file mode 100644 index 49f9821..0000000 Binary files a/src/main/resources/static/macro/22.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/23.jpg b/src/main/resources/static/macro/23.jpg deleted file mode 100644 index 3025305..0000000 Binary files a/src/main/resources/static/macro/23.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/24.jpg b/src/main/resources/static/macro/24.jpg deleted file mode 100644 index e9c998b..0000000 Binary files a/src/main/resources/static/macro/24.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/25.jpg b/src/main/resources/static/macro/25.jpg deleted file mode 100644 index 0154648..0000000 Binary files a/src/main/resources/static/macro/25.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/26.jpg b/src/main/resources/static/macro/26.jpg deleted file mode 100644 index 81f227e..0000000 Binary files a/src/main/resources/static/macro/26.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/27.jpg b/src/main/resources/static/macro/27.jpg deleted file mode 100644 index 2f8cfda..0000000 Binary files a/src/main/resources/static/macro/27.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/28.jpg b/src/main/resources/static/macro/28.jpg deleted file mode 100644 index bed725b..0000000 Binary files a/src/main/resources/static/macro/28.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/29.jpg b/src/main/resources/static/macro/29.jpg deleted file mode 100644 index 21970b0..0000000 Binary files a/src/main/resources/static/macro/29.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/3.jpg b/src/main/resources/static/macro/3.jpg deleted file mode 100644 index 2dacf0a..0000000 Binary files a/src/main/resources/static/macro/3.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/30.jpg b/src/main/resources/static/macro/30.jpg deleted file mode 100644 index 208ae9d..0000000 Binary files a/src/main/resources/static/macro/30.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/4.jpg b/src/main/resources/static/macro/4.jpg deleted file mode 100644 index edf5bd0..0000000 Binary files a/src/main/resources/static/macro/4.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/5.jpg b/src/main/resources/static/macro/5.jpg deleted file mode 100644 index 5580eda..0000000 Binary files a/src/main/resources/static/macro/5.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/6.jpg b/src/main/resources/static/macro/6.jpg deleted file mode 100644 index 4426435..0000000 Binary files a/src/main/resources/static/macro/6.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/7.jpg b/src/main/resources/static/macro/7.jpg deleted file mode 100644 index 8e8ae93..0000000 Binary files a/src/main/resources/static/macro/7.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/8.jpg b/src/main/resources/static/macro/8.jpg deleted file mode 100644 index 6923717..0000000 Binary files a/src/main/resources/static/macro/8.jpg and /dev/null differ diff --git a/src/main/resources/static/macro/9.jpg b/src/main/resources/static/macro/9.jpg deleted file mode 100644 index 1900a40..0000000 Binary files a/src/main/resources/static/macro/9.jpg and /dev/null differ