SpringBoot

[트러블 슈팅]FastAPI+Spring Boot EC2+Docker+Nginx

감자꾸 2025. 7. 21. 01:08

현재 나는 교대근무자를 위한 루틴 관리 앱 프로젝트를 진행 중이다.

간단히 소개하면, 근무자가 종이로 된 교대근무 일정표를 사진으로 찍으면 OCR로 인식을 해서, 자동으로 저장되고 이걸로 스케쥴 표를 쉽게 앱을 확인하고 관리할 수 있는 앱이다.

 

이번 주면, 데모데이기에, 다들 밤 새면서 개발 중이다.

 

서버 쪽은 API 구현이 일찌감치 끝나서, API 연동 작업 중 생기는 오류를 고치도록 대기 중에 있다.

그래서 어제는 오랜만에 일찍 자볼까하고, 새벽 2시 반쯤 노트북을 막 끈 상태였다. (요즘 바빠서, 아침 5-6시에 잔다...)

 

그런데... 갑자기 걸려온 디코 전화..

프론트: "비상이야!!!!!! 딥러딩 모델을 서버에 올려서 결과를 받아야 할 것 같아, 근데 지금 다른 작업도 할 게 많이 남아 시간이 없어서, 지금 최대한 올려줘야 할 것 같아"

:"ㄴ...ㅔ? 지금 곧 새벽 3시인데요??"
프론트:"그렇게 됐어,, 지금 딥러닝 파트 회의실로 와봐"

 

 

 

이렇게 새벽 3시에 긴급호출 당하여, 딥러닝, 나(백) ,프론트 이렇게 디스코드에서 모였다.

 

상황을 들어보니, 기존에는 모델을 TFLite 모델로, 안드로이드랑 iOS에서 직접 돌렸는데, 

이게 돌아가다가 터진다는 것이다...또, 성능이 너무 안좋아진다고도 하고,, 그래서 서버에서 파이썬 FastAPI로 올려줘야 한다는 것이다.

 

즉, 훈련된 모델을, 근무표 이미지 올리면, 셀 분할해서 테이블에 넣고 Json 반환까지,, 를 서버에서 처리해줘야 한다는 것이다.

 

다행히 나는 졸업 프로젝트에서 이 방식을 해본 적이 있어서, 하는 건 어렵지 않았기에 서버에서 하는 걸로 해결이 된다면 무조건 해야지!..

 

그래서 3시부터 시작된,, 서버 올리기

 

일단 기다리는 프론트 담당자있기에 최대한 빠르게 해야했다.

 

우선 파이썬이기에 vscode로 들어가서 원격 호스트를 접속한다.

 

본래 깃에 올려두고 이걸 풀 받아서, 서버에 올려야 하는데, 시간이 없기에 우선, 로컬에서 코드 작성 후, scp 명령어로 다이렉트로 서버에 복사했다.

 

그렇게 해서 생긴,, 파이썬 폴더

 

하지만 이게 끝이 아니다

도커 컨테이너로 빌드해서 올려야 하는 작업이 필요하다.

 

그래서 아래와 같이 파이썬 폴더에도 Dockerfile을 설정해주었다.

# 베이스 이미지
FROM python:3.10-slim

# 작업 디렉토리 설정
WORKDIR /app

# 종속성 파일 복사 및 설치
COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

# 소스코드 복사
COPY . .

# 포트 열기
EXPOSE 8000

# FastAPI 서버 실행 (Uvicorn)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

 

requirements는 이 폴더에서 사용하는 모듈이다.

안에 구성은 아래처럼 되어있다.

이 설치가 꽤 오래 걸린다.

 

위 dockerfile을 설정하고 빌드하면,

이렇게 컨테이너가 생성된다.

 

하지만 이게 또 끝이 아니다.

 

Nginx에서 이 파이썬 8000포트를 프록시해줘야 한다.

그래서 Nginx의 설정 파일도 바꿔줘야 한다.

 

나는 "/"로 오는 요청은 스프링 서버로 보내고, "/api"로 오는 요청은 FastAPI 서버로 보내도록 설정하였다.

 

아래는 내가 설정한 Nginx의 일부분이다.

//Spring 서버 
    location / {
        proxy_pass http://spring: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;
    }
    //FastAPI 서버
    location /api/ {
        proxy_pass http://shifterz-container:8000/api/; //shifterz-contianer는 컨테이너 이름
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

 

여기서도 끝이 아니다.

자꾸 Nginx 오류가 생겨서 이거 고치느라,, 정말 힘들었다....

nginx나 스프링 컨테이너를 올리면 파이썬이 꺼지고,,,

FastAPI 를 올리면 nginx와 스프링 컨테이너가 꺼지거나

FastAPI 랑 스프링만 올라와 있고, nginx만 꺼져있거나

 

3 컨테이너가 모두 올라온 적이 없다...

 

이리저리 해결방법을 찾던 도중,,,

 

하니의 네트워크를 만들어서 여기에 nginx랑 FastAPI 랑 스프링 컨테이너를 연결해주면 되는 방법이다.

 

1. offnal-network라는 네트워크 생성

 docker network create offnal-network

2. FastAPI 컨테이너와 연결

docker network connect offnal-network shifterz-container

3. 스프링,nginx 컨테이너와 연결

docker network connect offnal-network spring
docker network connect offnal-network nginx

 

 

4. 현재 offnal-network에 연결된 컨테이너들 확인

docker network inspect offnal-network

 

[
    {
        "Name": "offnal-network",
        "Id": "",
        "Created": "2025-07-18T21:25:16.6758423Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "",
                    "Gateway": ""
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "": {
                "Name": "nginx", // Nginx
                "EndpointID": "",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "": {
                "Name": "spring", // Spring
                "EndpointID": "",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "": {
                "Name": "shifterz-container", //FastAPI
                "EndpointID": "",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

 

이렇게 잘연결되어 있음을 확인할 수 있다.

 

그 후 더 이상 보이지 않는,, 사이트에 접속할 수 없습니다..와 502

 

스프링 스웨거와 FastApi 스웨거가 잘 뜬다......!!!!!!!!!!!!!

이 소식을 안고,, 디코에 노티하러 쓩쓩 달려갔다

오전 7시에 난 그렇게 해방되었다... 4시간의 투혼 끝 해방