프로젝트/기술 면접 복습 플랫폼

EC2 + Docker 기반 수동 배포

yoon4360 2025. 5. 5. 16:56

이 글은 GitHub Actions 같은 자동화 도구 없이, 순수하게 EC2와 Docker만으로 수동 배포를 했던 과정을 정리한 것이다.
처음엔 막막했지만, 하나씩 개념을 찾아가며 세팅하다 보니 인프라에 대한 감각이 조금씩 생겼다.
혹시 나처럼 처음으로 배포를 해보는 신입 개발자라면, 도움이 되길 바라는 마음으로 이 글을 정리해본다.

 


 

프로젝트 구조 정리부터

interview-platform/
── frontend/ # Next.js 프론트엔드
── server/ # Spring Boot 백엔드
── nginx/ # 리버스 프록시 설정 (conf.d/default.conf)
── docker-compose.yml
── .env # 환경 변수 (DB, GPT, JWT 등)

처음에는 각 서비스를 각각 실행했는데, Docker Compose를 이용하니까
전체를 하나의 시스템처럼 제어할 수 있어서 훨씬 효율적이었다.

 


 

1. EC2 인스턴스 구성

EC2?

AWS에서 제공하는 가상 서버이다. 즉, 우리가 개발한 앱을 로컬 컴퓨터를 끄더라도 운영할 수 있도록 띄워두는 공간이다.

구성 내용

  • 타입: t3.small (기본 테스트 용도로 충분하다)
  • OS: Ubuntu 22.04 (많이 쓰는 LTS 버전이다)
  • 보안 그룹 설정:
    • 22번 포트(SSH): 내 IP만 허용 → 접속 보안을 설정했다
    • 80, 443 포트(HTTP/HTTPS): 0.0.0.0/0 → 웹에서 접근 가능하게 했다
  • 키페어(.pem): SSH 접속을 위한 인증 수단

로컬 터미널에서 접속할 때

ssh -i "my-key.pem" ubuntu@<ec2 public ip>

 

 


 

2. RDS (PostgreSQL) 설정

RDS?

AWS에서 제공하는 관리형 데이터베이스 서비스이다.
직접 DB를 설치하거나 유지보수할 필요 없이, 설정만 하면 바로 사용 가능하다.

설정 내용

  • DB 접속 정보는 .env에 저장
DB_URL=jdbc:postgresql://<rds-endpoint>:5432/interview
DB_USERNAME=postgres
DB_PASSWORD=xxxx
  • 보안 그룹 연결: RDS에서 EC2의 보안 그룹을 허용해야 접속 가능


 

3. Docker 환경 구성

Docker?

애플리케이션을 컨테이너 단위로 포장해서 어디서든 동일하게 실행할 수 있게 해주는 기술이다.
개발환경과 운영환경을 통일할 수 있어서 배포가 훨씬 쉬워진다.

Dockerfile

  • frontend/: npx next build && npx next start
  • server/: ./gradlew build → .jar 실행

docker-compose.yml

여러 개의 컨테이너(frontend, backend, qdrant, nginx)를 한번에 구성할 수 있도록 정의한 파일이다.

예시는 아래와 같다.

services:
  frontend:
    build: ./frontend
    ports: ["3000:3000"]
  backend:
    build: ./server
    ports: ["8080:8080"]
  qdrant:
    image: qdrant/qdrant
    ports: ["6333:6333"]
  nginx:
    build: ./nginx
    ports: ["80:80"]

 

.env 파일에는 API 주소가 이렇게 정의되어 있다.

NEXT_PUBLIC_API_URL=http://<ec2 public 주소>
  • 주의: Next.js에서는 NEXT_PUBLIC_ 접두사가 붙어야 프론트에서 사용할 수 있다.

 


 

4. Nginx 설정

Nginx?

정적 파일 제공, 리버스 프록시, 로드밸런싱 등을 지원하는 고성능 웹 서버다.

리버스 프록시?

외부에서 들어오는 요청을 내부 서비스로 중계해주는 역할을 한다.
내부에선 frontend, backend라는 Docker 네트워크 이름으로 통신한다.

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://frontend:3000;
    }

    location /api/ {
        proxy_pass http://backend:8080;
    }
}

 


 

수동 배포 방식 (GitHub Actions 적용 전)

흐름 요약

  1. EC2에 SSH 접속
  2. git pull로 최신 코드 반영
  3. .env 파일 수동 작성
  4. 아래 명령어로 빌드 및 실행
docker-compose down
docker system prune -a --volumes -f
docker-compose build --no-cache
docker-compose up -d
  • --no-cache 옵션은 캐시 없이 완전 새로 빌드하기 위해 사용했다.
  • docker system prune은 불필요한 이미지/볼륨 정리 용도였다.

 


 

현재 상태 

  • EC2에 도커 기반으로 프론트 + 백 + Qdrant + Nginx 배포 완료
  • 웹사이트 접속 성공: http://<ec2 public 주소>
  • 기능 정상 작동: 회원가입, 로그인, GPT 기반 질문 생성까지 에러없이 동작

배운 것

배포는 단순히 코드를 올리는 일이 아니라 서버, 네트워크, 환경 설정까지 포함된 전체 과정이다.

Docker, Nginx, EC2, RDS, 환경 변수, 리버스 프록시 등… 기초 개념 없이 감으로 배포하면 에러를 마주하게 될 것이다.

자동화 이전에 수동 배포를 한 번이라도 해보면, GitHub Actions 같은 CI/CD 도구를 훨씬 잘 이해하게 되고 필요성을 체감할 수 있을 것 같아 이렇게 진행해 보았다.