[see-realview] 1차 배포 완료

Seokjun Moon·2024년 1월 14일
0

1차 배포 시작

사실 카테캠에서는 배포가 내 담당이 아니어서, 그리고 거기서는 다른 환경이기 때문에 사실상 내 첫 배포에 도전하는 과정이다! 가상머신 요금이 부담스럽기 때문에... 일단은 aws ec2 무료 버전을 사용했다. t2 micro, 30GB 라는 아주 소소한 시작으로! 해보는 첫 배포 일기

Docker

저 자그마한 ec2에서 자바 프로젝트를 빌드하고.. 배포하려면.. 너무 오래 걸린다!!! 실제로 해보니, m2 맥북이 얼마나 강력한지... 느낄 수 있었다. 맥북에서는 빌드 시간이 5초?도 안걸리던 반면, ec2에서는 1시간이 지나도 완료되지 않았다.

실제 1시간이 넘어도... 완료되지 않던 작업이 맥북에서는 단 5초도 안걸리는 마법... 아마 가장 기본 모델은 vCPU 1개와 1GB 램으로 구성되어 있는데, 아마 램이 부족해서 그런 것 같다. 이 문제는 추후에 Spring Boot Application을 실행할 때 작동을 하지 않아 swap 메모리를 늘리니 해결되었다.

아무튼!그래서 맥북에서 빌드 후 Docker(도커)를 통해 이미지를 업로드, ec2에서는 이미지를 pull 후에 컨테이너를 띄우는 것만 했다. 이걸 통해 도커가 얼마나 강력한지... 느낄 수 있었다. 그리고 Apple Silicon 칩셋이 얼마나 강력한지도!!

아무튼,

맥북에서 빌드 후

$ docker buildx build --push --platform linux/amd64 -t seokjun0915/see-realview-backend:1.0 .

를 통해 빌드를 진행했다. 이때, --platform linux/amd64를 꼭 넣어야 한다!! 애플 실리콘 칩셋에서 빌드를 하고 실행은 ec2에서 진행하기 때문에 빌드 옵션을 무조건 추가해야 다른 플랫폼에서 실행할 수 있다.

이후 docker-compose.yml 파일을 작성해보자.

version: "3.7"

services:
  see-realview-backend:
    container_name: see-realview-backend
    ports:
      - "8080:8080"
    image: seokjun0915/see-realview-backend:1.0
    volumes:
      - see-realview-images:/app/see-realview/images
    networks:
      - see-realview-net
    links:
      - see-realview-db
      - see-realview-redis
    depends_on:
      see-realview-db:
        condition: service_healthy
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://see-realview-db:3306/see-realview?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false
      SPRING_DATASOURCE_USERNAME: {유저!!}
      SPRING_DATASOURCE_PASSWORD: {비밀번호!!}
      {여기에 추가로 필요한 환경변수들}

  see-realview-db:
    container_name: see-realview-db
    image: mysql:8.0.33
    restart: always
    volumes:
      - mysql_volume:/app/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=ms38559851!
      - MYSQL_DATABASE=see-realview
    ports:
      - "3306:3306"
    networks:
      - see-realview-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  see-realview-redis:
    container_name: see-realview-redis
    image: redis:latest
    hostname: redis
    expose:
      - 6379
    ports:
      - "6379:6379"
    labels:
      - "name=radis"
      - "mode=standalone"
    extra_hosts:
      - host.docker.internal:host-gateway
    networks:
      - see-realview-net


networks:
  see-realview-net:
    driver: bridge


volumes:
  mysql_volume:
    driver: local

  see-realview-images:
    driver: local

이렇게 작성했다. db, application, redis를 묶어주기 위한 네트워크를 추가하고, 볼륨을 별도로 설정해주고, 환경변수를 주입해주었다. 사실 하나하나 자세히 찾아보고 작성한 내용이 아니라 .. 추후 도커 공부를 더 해야겠다!

그리고 ec2에 접속하여

$ docker-compose up

를 실행하면 끝!!! 여러 오류가 진짜 많았다... redis 호스트 문제, mysql 연결 문제, api 경로 설정 문제 등등 .... 처음엔 로그가 없어서 정말 불편했는데, 왜 로그를 많이 남기라고 하는지 알 수 있었다 ㅠㅠㅠㅠ 없으면 ..... 버그 픽스가 불가능 ....

그리고 ec2 아이피로 접속을 해보자

정상적으로 작동한다!!!

겪었던 문제들

ec2 메모리 부족

  • 서버를 구동시킬 때, 메모리가 부족해서 프리징되는 순간이 빈번하다면, 아래 명령어로 swap 메모리를 늘려보자
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
$ sudo vim /etc/fstab
$ /swapfile swap swap defaults 0 0

Redis 연결 에러

  • redis configuration을 할 때, 도커로 실행할 때에는 호스트 주소를 host.docker.internal 로 설정해야 한다.
  • 만약 오류가 계속 뜬다면, redis 컨테이너명을 넣어준다
  • 어플리케이션과 동일한 네트워크로 묶어주기

MySQL 연결 에러

  • applicaion.yml 파일에서 spring.jpa.databse: mysql 를 추가해야 한다.
  • 도커 네트워크를 어플리케이션과 동일하게 지정해야 한다.

HttpURLConnection

  • 다운로드 속도가 느리다. Spring에서 지원해주는 WebClient 를 사용해보자
  • 이미지 url의 prefix를 http로 하면 다운로드가 불가능한 몇몇 사진이 존재한다. 가능하면 https로 바꿔주자

WebClient 버퍼 문제

  • 응답받을 데이터의 크기가 버퍼보다 크면 오류가 발생한다. WebClient configuration을 할 때, 아래처럼 버퍼 재설정 코드를 추가해보자
public WebClient imageWebClient() {
    return WebClient.builder()
            .exchangeStrategies(ExchangeStrategies.builder()
                    .codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(100 * 1024 * 1024))
                    .build())
            .build();
}

미흡한 점

  • 아직 프론트를 만든게 아니라 타임리프로 임시 화면만 구상했기 때문에, 추후 프론트도 함께 띄우고 nginx를 도입해서 제대로된 배포를 해야 한다.
  • 아카이빙을 소홀히 했다 ..!! 더 많은 기록을 자세히 남겨보자.
  • 도커 공부해보기!
profile
차근차근 천천히

0개의 댓글