처음 프로젝트 서버를 받았을 때 솔직히 좀 막막했다. 인프라에 대한 경험이 전무했고, EC2 인스턴스 하나 주고 "여기에 서비스를 올려라"하는데, SSH 접속부터 Docker 설치까지 전부 직접해야했다.
SSAFY 에서 제공받은 .pem 키 파일로 접속한다.
Windows 환경이라 PowerShell에서 진행했다.
텍스트
ssh -i J14~.pem ubuntu@j14~.p.ssafy.io
근데 처음에 Permission Denied가 떴다.
원인이 2가지였는데,
icacls J14D103T.pem /inheritance:r
icacls J14D103T.pem /grant:r "%USERNAME%:R"
접속 성공 후 가장 먼저 한 건 Docker 설치이다.
Ubuntu 22.04 기준으로 진행했다.
# 기존 패키지 충돌 방지
sudo apt-get remove docker docker-engine docker.io containerd runc
# 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# Docker 공식 GPG 키 추가
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Docker 레포지토리 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# ubuntu 유저에게 docker 권한 부여 (sudo 없이 docker 사용)
sudo usermod -aG docker ubuntu
마지막 usermod 이후에 SSH 재접속해야 반영된다. 이거 몰라서 왜 안 되지 한참 삽질했다.
배포용 디렉토리를 미리 만들어둔다. 나중에 Jenkins가 이 경로로 소스를 전송하고, docker compose를 실행하는 구조이다.
mkdir -p /home/ubuntu/naeda/infra
Spring Boot가 8080 포트로 뜨는데, 외부에서는 443(HTTPS)으로 접근해야 하니까 Nginx를 리버스 프록시로 세팅했다.
sudo apt-get install -y nginx
/etc/nginx/sites-available/naeda 파일을 만들어서 프록시 설정을 넣는다.
server {
listen 80;
server_name j14d103.p.ssafy.io;
location / {
proxy_pass http://localhost: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;
}
}
sudo ln -s /etc/nginx/sites-available/naeda /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
여기서 주의할 점이 servername을 반드시 실제 도메인으로 적어야 한다. 처음에 server_name ;으로 해놨다가 나중에 SSL 인증서 발급할 때 certbot이 서버 블록을 못 찾아서 또 삽질했다.
EC2 보안 그룹에서 다음 포트들이 열려 있어야 한다.

EC2 초기 세팅에서 배운 점은, 로컬 Windows 환경과 Linux 서버 환경의 차이를 체감한 것이다. .pem 키 권한 문제, 줄바꿈 차이, Docker 권한 문제 등 사소한 것들이 모여서 시간을 많이 잡아먹었다. 한번 정리해두면 다음 프로젝트에서는 10분이면 끝나는 작업이다.