Network/Raspberry Pi 5

[Raspberry Pi 5] jar 배포

이주여이 2025. 3. 3. 10:37

토이 프로젝트 진행 중에 라즈베리파이 내부에 jar를 배포해야 했다.

 

처음에 war 방식으로 진행하다가 나중에 집와서 방식이 다르다는 것을 깨닫고 ‘아..’ 했다.

 

추후에 다시 작업할 일 있으면 참고할려고 메모용으로 남기는 포스팅이다.

 

선수 작업으로 해당 jar에 맞는 jdk가 설치되어 있어야 한다.

 

1. 포트포워딩 작업

알아서 포트포워딩하자.

2. Apache2 conf 파일 수정

Apache2 기준으로 수정 파일 경로는 ‘/etc/apache2/sites-available/000-defeault.conf’이다.

 

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        ServerName {URL}:{PORT}
        ServerAlias {URL}:{PORT}

        ProxyPreserveHost On
        ProxyPass / http://192.168.0.10:{PORT}/
        ProxyPassReverse / http://192.168.0.10:{PORT}/
</VirtualHost>

 

  • URL : DDNS(이걸 적으라는건 아니고 내 기준에선 이걸 입력했다)
  • PORT : 포트포워딩한 API 전용 포트

3. application.yaml 확인

spring:
  config:
    activate:
      on-profile: PROD
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://{IP}:{PORT}/{DB NAME}
    username: {USERNAME}
    password: {PASSWORD}

swagger:
  base-url: {PATH}

 

  • url : API 서버는 팀장님 라즈베리파이에서 배포하는데 DB는 내 라즈베리파이에 있는 MariaDB를 쓰기 때문에 내 쪽 공인 IP로 접근한다.
  • swagger-base-url : {팀장님 DDNS}:{API 서버 전용 포트}

 

4. FTP 전송

FTP 프로그램을 통해 jar 파일을 전송한다.

 

5. jar 실행 테스트

java -jar app.jar --spring.profiles.active=PROD

 

application.yaml에서 profile로 DEV랑 PROD랑 나눠서 쓰기 때문에 적은 부분이고 없으면 생략 가능하다.

 

6. 서비스 등록 작업(백그라운드 실행)

cd /etc/systemd/system
nano {서비스명}.service

 

[Unit]
Description={서비스명}
After=network.target

[Service]
User={서비스 실행 계정}
WorkingDirectory={jar 파일있는 배포용 디렉토리}
ExecStart=java -jar {jar 파일있는 배포용 디렉토리}/app.jar --spring.profiles.active=PROD
SuccessExitStatus=143
Restart=always
RestartSec=5
StandardOutput=file:{jar 파일있는 배포용 디렉토리}/log/output.log
StandardError=file:{jar 파일있는 배포용 디렉토리}/log/error.log

[Install]
WantedBy=multi-user.target

 

배포 폴더 내부에 log 디렉토리가 없으면 ‘systemctl start {서비스명}’으로 실행할 때 fail 뜨니까 확인하자.

 

systemctl daemon-reload
systemctl enable {서비스명}.service
systemctl start {서비스명}.service
systemctl status {서비스명}.service

 

뒤에 ‘.service’는 생략해도 되긴 하던데..

 

알아서 하길..