
모바일(플러터) -- FTP(음성데이터) --> SpringBoot
FTP를 내장한 스프링부트 서버를 개발해 도커 이미지로 만들어 GCP에 호스팅 하던 중
음성데이터가 스프링부트로 전해지지 않는 문제가 생겼습니다.
제가 미리 해놓았던 작업은 아래과 같습니다.
ports:
- "8080:8080" #스프링부트의 포트
- "2121:2121" #FTP 서버 포트
- "21100:21100" # FTP Passive 모드

먼저 로그를 확인해봤습니다.
WARN 1 --- [pool-4-thread-2] o.a.f.impl.IODataConnectionFactory : FtpDataConnection.getDataSocket()
java.net.SocketTimeoutException: Accept timed out
위의 로그로 보아
호스팅된 스프링부트의 FTP 파트에서 문제가 생긴 것 같아 로컬과 호스팅 둘 다로 음성데이터를 보내보니(호스팅된 스프링부트는 제 스마트폰으로, 로컬 스프링부트로는 에뮬레이터를 썼습니다.) 클라우드 환경에서는 수행되지 않는 작업이 아래와 같이 파일이 업로드되는 부분이었습니다.
2024-09-05T21:38:06.436+09:00 INFO 12711 --- [pool-4-thread-2] org.apache.ftpserver.command.impl.STOR : File uploaded /audio_0.mp4
위의 로그 대신 클라우드에 호스팅된 서버에서는 아래의 로그가 발생했습니다.
2024-09-05T12:36:56.591Z INFO 1 --- [pool-4-thread-2] o.a.f.listener.nio.FtpLoggingFilter : SENT: 425 Can't open data connection.
ftp서버의 패시브 포트가 제대로 작동하지 않아 계속해서 문제를 찾던 중 코드에서 passiveport를 아래와 같이 작성해둔 것을 보았습니다.
dataConnConfigFactory.setPassivePorts("21100-21110");
21100~21110까지의 포트를 전부 열어둬야 하는데 인그레스와 도커 컴포즈 파일에서 21100하나만을 열어뒀고, 그래서 passive로 지속적으로 데이터를 받을 때 문제가 생긴 것이었습니더.
방화벽에서 포트 열어주기 (allow-passive-ftp 정책을 수정해줬습니다.)

도커 컴포즈에서 스프링부트 컨테이너의 포트 수정해주기
ports:
- "8080:8080"
- "2121:2121"
- "21100:21100"
- "21100-21110:21100-21110" # 패시브 모드 포트 범위