aws 서버에 프로젝트 배포를 하는데 build fail 오류가 생겨 해결방법을 기록한다git으로 서버배포할 때 참고한 블로그

-> https://velog.io/@wndudrla1011/chapter-8

 

EC2 서버에 프로젝트 배포하기 - 루타블의 개발일기

🔧 먼저 깃허브에서 코드를 받아올 수 있게 EC2에 깃을 설치하겠다.sudo yum install git🔧 설치가 완료되면 다음 명령어로 설치 상태를 확인git --version🔧 git이 성공적으로 설치되면 git clone으로 프로

velog.io

위에 스텝대로 무난히 진행되다가 build fail 메세지가 출력됨 

$ ./deploy.sh
> Git Pull
Already up to date.
> 프로젝트 Build 시작
Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* What went wrong:
Directory '/home/ubuntu/app/repository/MyApp' does not contain a Gradle build.

A Gradle build should contain a 'settings.gradle' or 'settings.gradle.kts' file in its root directory. It may also contain                                                     a 'build.gradle' or 'build.gradle.kts' file.

To create a new Gradle build in this directory run 'gradlew init'

For more information about the 'init' task, please refer to https://docs.gradle.org/8.5/userguide/build_init_plugin.html i                                                    n the Gradle documentation.

For more details on creating a Gradle build, please refer to https://docs.gradle.org/8.5/userguide/tutorial_using_tasks.ht                                                    ml in the Gradle documentation.

* Try:
> Run gradlew init to create a new Gradle build in this directory.
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Get more help at https://help.gradle.org.

천천히 읽어보니 setting.gradle이 없단다..

로컬에서 프로젝트 폴더에 확인해보니 정말 없다..어휴 결국 직접 파일을 만들어 git에 push 해주었다

#settings.gradle
rootProject.name = 'MyApp'

settinds.gradle 파일은 build.gradle과 같은 경로에 생성해주었다.

다시 ec2로 가서 빌드설정파일을 실행해주었다

$ ./deploy.sh
> Git Pull
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 17 (delta 6), reused 17 (delta 6), pack-reused 0
Unpacking objects: 100% (17/17), 7.59 KiB | 22.00 KiB/s, done.
From https://github.com/ds-jeong/MyApp
   5fce017..21f8cda  master     -> origin/master
Updating 5fce017..21f8cda
Fast-forward
 .gradle/8.5/executionHistory/executionHistory.bin  | Bin 440109 -> 440109 bytes
 .gradle/8.5/executionHistory/executionHistory.lock | Bin 17 -> 17 bytes
 .gradle/8.5/fileHashes/fileHashes.bin              | Bin 41647 -> 41647 bytes
 .gradle/8.5/fileHashes/fileHashes.lock             | Bin 17 -> 17 bytes
 .gradle/buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 17 bytes
 .gradle/file-system.probe                          | Bin 8 -> 8 bytes
 build/libs/MyApp-0.0.1-SNAPSHOT-plain.jar          | Bin 6494917 -> 6494917 bytes
 settings.gradle                                    |   1 +
 8 files changed, 1 insertion(+)
 create mode 100644 settings.gradle
> 프로젝트 Build 시작
<-<-------------> 0% CONFIGURING [11m 13s]
> root project
^C^Z
[1]+  Stopped                 ./deploy.sh

오? 된거같다 근데 command가 멈췃다

흠..springBoot 프로젝트를 배포할땐 느리다는데 그문제인가..

서치를 해보니 나같은 경우가 있더라 

->https://sundries-in-myidea.tistory.com/102

 

AWS EC2 프리티어에서 메모리 부족현상 해결방법

AWS free tier를 사용하다보면 2%가 부족할 때가 있다. AWS 프리티어는 가난한 대학생에게는 한줄기 빛과 같은 존재인데, AWS의 프리티어라서 적게 돈이 나가는 것도 좋고, 실제로 이것저것 해볼 수 있

sundries-in-myidea.tistory.com

감사하게도 위 블로그를 참고했더니 1분도안되서 빌드가 끝나고 튕기는 현상도 없다

$ ./deploy.sh
> Git Pull
Already up to date.
> 프로젝트 Build 시작
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

> Task :buildEnvironment

------------------------------------------------------------
Root project 'MyApp'
------------------------------------------------------------

classpath
No dependencies

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 12s
1 actionable task: 1 executed
> step1 디렉토리로 이동
> Build 파일 복사
> 현재 구동 중인 애플리케이션 pid 확인
현재 구동 중인 애플리케이션 pid:
> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않는다.
> 새 애플리케이션 배포
> JAR Name: MyApp-0.0.1-SNAPSHOT-plain.jar

제대로 올라간듯 하다

-> https://velog.io/@m1njae/AWS-%ED%83%84%EB%A0%A5%EC%A0%81-IP-%EC%A3%BC%EC%86%8C-%EC%84%A4%EC%A0%95

 

[AWS] 탄력적 IP 주소 설정

EC2 인스턴스를 껐다가 다시 실행하면 IP가 변경된다고? 탄력적 IP 주소를 설정하자!

velog.io

위에 블로그를 참고해서 화면을 위한 탄력 ip를 할당받았다

-> https://velog.io/@hoooons/AWS-EC2-%EB%A1%9C-React-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

그리곤 위에 블로그를 참고해서 여러 패키지를 다운로드를 완료했다 

npm error code ENOSPC
npm error syscall write
npm error errno -28
npm error nospc ENOSPC: no space left on device, write
npm error nospc There appears to be insufficient space on your system to finish.
npm error nospc Clear up some disk space and try again.
npm error A complete log of this run can be found in: /home/ubuntu/.npm/_logs/2024-08-05T13_08_44_437Z-debug-0.log

react root 폴더에서 npm start 명령어를 시도했더니 위와 같은 에러를 뱉는다..

서버에서 최적화하고 난리를 쳐도 안되길래 서치끝에 찾아냈다

pakage.json내에 sourcemap 를 false 처리해주는것..

보통 개발환경에서는 바로 소스코드를 확인할수 있도록 디폴트가 true로 되있지만

실서버에선 소스코드를 확인할 일이 없고, 빌드시 해당 과정에서 메모리를 많이 사용한다..

#pakage.json
  /*    "build": "react-scripts build",*/
  "scripts": {
    "start": "react-scripts start",
    "build" : "GENERATE_SOURCEMAP=false react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

해서 위와 같이 수정 후 git에 반영해주고 aws에서는 다시 pull.. 

수정 된 json 파일을 가지고 왔지만 혹시 몰라 디스크공간을 확보 위까지 진행했다

/*시스템 재부팅*/
$ sudo reboot

여기까지하고 보통 npm start가 된다

주소창에 탄력ip:3000으로 치면 화면이나와야 정상

혹시 몰라 aws에 보안 그룹을 확인해보니 3000 port 는 열려있음

원인을 찾다가 캐시문제인가 싶어서 아래 스텝을 진행해보았다

/*임시 파일 삭제*/
$ sudo rm -rf /tmp/*

/*로그 파일 삭제*/
$ sudo rm -rf /var/log/*.log

/*npm 캐시 삭제*/
npm cache clean --force

/*패키지 제거*/
$ sudo apt-get autoremove
$ sudo apt-get clean

/*시스템 재부팅*/
$ sudo reboot

여기까지 실행 후 npm 재설치를 해줬는데.. 여전한 에러..

$ npm install
npm error code ENOTEMPTY
npm error syscall rename
npm error path /home/ubuntu/app/repository/MyApp/src/main/frontend/node_modules/acorn
npm error dest /home/ubuntu/app/repository/MyApp/src/main/frontend/node_modules/.acorn-I5v5oviz
npm error errno -39
npm error ENOTEMPTY: directory not empty, rename '/home/ubuntu/app/repository/MyApp/src/main/frontend/node_modules/acorn' -> '/home/ubuntu/app/repository/MyApp/src/main/frontend/node_modules/.acorn-I5v5oviz'
npm error A complete log of this run can be found in: /home/ubuntu/.npm/_logs/2024-08-05T13_25_20_689Z-debug-0.log
/*node_modules 삭제*/
$ rm -rf node_modules

/*npm 캐시 clean*/
$ npm cache clean --force
$ npm install

/*package-lock.json 삭제*/
$ rm package-lock.json
$ npm install

/*node_modules 권한 수정*/
$ sudo chown -R $USER:$GROUP node_modules

/*.npm 디렉토리 권한 및 파일 확인*/
sudo chown -R $USER:$GROUP ~/.npm

/*시스템 재부팅*/
$ sudo reboot

이제서야 된다..흠? node_modules 충돌인건가; 어쨋든 서버가 올라가는걸 확인했다

보안설정

우분투 OS의 root는 기본적으로 설정되있지 않기때문에 비밀번호를 설정해준다 

$ sudo passwd root

 

ssh 접속을 허용해주는 설정파일을 변경해준다

$ sudo vi/etc/ssh/sshd_config

 

방화벽설정

기존에 UFW를 사용했다면 중지하고 iptables 프로그램을 설치해야한다

 

UFW 중지

$ ufw disable

$ iptables -F

 

iptables를 안정적으로 사용하기 위해 패키지 설치

$ apt-get install iptables-persistent netrilter-persistent

 

패키지 설치가 완료되면 /etc/iptables 폴더에 rules.v4 와 rules.v6가 생성됬는지 확인

 

설정 파일 수정

//파일 수정은 다른 블로그 참고
vi /etc/sysconfig/iptables

 

서비스 반영

service iptables save

service iptables restart

 

iptables 명령어

//현재 열려있는 포트

netstat -nap​

//80번포트를 열어두는 명령어

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

//데몬에 변경된 사항을 저장

sudo iptables-save > /etc/iptables/rules.v4

//iptables 정지

service iptables stop

//iptables 시작

service iptables start

 

fail2ban 해킹접속 제한

https://eungbean.github.io/2019/11/05/fail2ban/ 참고

 

Ubuntu 시간동기화

 

1. rdate설치

root@server:/opt# apt-get install rdate

2. tzdata재설정

root@server:/opt# dpkg-reconfigure tzdata

3. crontab 를 이용하여 꾸준히 시간을 동기화하는 명령어

$crontab -e

00 01 * * * /usr/bin/rdate -s time.bora.net

 

/(루트)

최상의 디렉토리인 루트 디렉토리

/bin

리눅스 시스템사용에 있어 가장 기본적이라고 할 수 있는 mv, cp, rm 등과 같은 명령어들이 이 디렉토리에 존재

/boot

리눅스 부트로더(Boot Loader)가 존재하는 디렉토리. 즉, GRUB 과 같은 부트로더에 관한 파일들(grub.conf 등)이 이 디렉토리에 존재한다.

/dev

시스템 디바이스(device)파일을 저장하고 있는 디렉토리. 즉, 하드디스크 장치파일 /dev/sda, CD-ROM 장치파일 /dev/cdrom 등과 같은 장치파일들이 존재하는 디렉토리이다.

/etc

리눅스 시스템 설정파일이 존재 

/etc/sysconfig(시스템 제어판용 설정파일), /etc/passwd(사용자관리 설정파일), /etc/named.conf(DNS 설정파일) 등과 같은 파일들이 존재한다.

/etc/mai/

sendmail.cf 나 access 파일등의 sendmail 의 설정파일들이 존재하는 디렉토리.

/etc/ssh/

SSH 서비스, 즉 sshd 데몬에서 사용하는 각종 설정파일들이 존재하는 디렉토리.

/etc/squid/

squid 프락시서버의 설정파일들이 저장된 디렉토리.

/etc/samba/

삼바관련 설정파일들이 저장된 디렉토리

/etc/skel/

계정사용자 생성시의 초기화파일들이 저장된 디렉토리(useradd 에서 사용함)

/etc/rc.d/

부팅레벨별 부팅스크립트파일들이 존재하는 디렉토리.

/etc/rc.d/init.d/

시스템 초기화 파일들의 실제파일들이 존재함.

/etc/pam.d/

PAM 설정 정보파일들이 저장된 디렉토리.

/etc/httpd/

RPM 으로 설치된 아파치 설정파일(httpd.conf 등)들이 저장된 디렉토리.

/etc/cron.d/, /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/, /etc/cron.weekly/

모두 크론설정파일이 존재하는 디렉토리임.

/etc/xinetd.d/

xinetd 수퍼데몬에 의해 서비스되는 서비스설정파일이 존재함.

/home

사용자의 홈디렉토리, useradd 명령어로 새로운 사용자를 생성하면 대부분 사용자의 ID와 동일한 이름의 디렉토리가 자동으로 생성됨.

/lib

커널모듈파일과 라이브러리파일 즉, 커널이 필요로하는 커널모듈파일들과 프로그램(C, C++ 등)에 필요한 각종 라이브러리 파일들이 존재하는 디렉토리.

/media

DVD, CD-ROM, USB 등과 같은 탈부착이 가능한 장치들의 마운트포인트로 사용되는 디렉토리.

/mnt

/media 디렉토리와 비슷한 용도로 탈부착이 가능한 장치들에 대하여 일시적인 마운트포인트로 사용하는 디렉토리.

/proc

일명 "가상파일시스템" 이라고 하는 곳으로 현재 메모리에 존재하는 모든 작업들이 파일형태로 존재하는 곳이다. 디스크상에 실제 존재하는 것이 아니라 메모리상에 존재하기 때문에 가상파일시스템이라고 부른다. 실제 운용상태를 정확하게 파악할 수 있는 중요한 정보를 제공하며 여기에 존재하는 파일들 가운데 현재 실행중인 커널(kernel)의 옵션 값을 즉시 변경할 수 있는 파라미터파일들이 있기 때문에 시스템 운용에 있어 매우 중요한 의미를 가진다.

/root

시스템 최고관리자인 root 사용자의 개인 홈디렉토리.

/sbin

ifconfig, e2fsck, ethtool, halt 등과 같이 주로 시스템 관리자들이 사용하는 시스템관리자용 명령어를 저장하고 있는 디렉토리.

/tmp

일명 "공용디렉토리" . 시스템을 사용하는 모든 사용자들이 공동으로 사용하는 디렉토리. mysql 에서 사용하는 mysql.sock 등과 같은 소켓파일, 또는 아파치에서 사용하는 세션파일등이 생성되기도 한다. 웹해킹에 사용되기도 해서 주의를 요망.

/usr

시스템이 아닌 일반사용자들이 주로 사용하는 디렉토리. 즉, c++, chsh, cpp, crontab, du, find등과 같이 일반사용자들용 명령어들은 /usr/bin 에 위치한다.

/usr/bin/

일반 사용자들이 사용가능한 명령어 파일들이 존재하는 디렉토리.

/usr/X11R6/

X 윈도우 시스템의 루트 디렉토리.

/usr/include/

C 프로그램에 필요한 헤드파일(*.h) 디렉토리.

/usr/lib/

/lib 에 들어가지 않은 라이브러리 디렉토리.

/usr/sbin/

/bin 에 제외된 명령어와 네트워크관련 명령어가 들어있는 디렉토리.

/usr/src/

프로그램 소스(주로 커널소스)가 저장되는 디렉토리.

/usr/local/

MySQL, Apache, PHP 등과 같은 어플리케이션들을 소스로 컨파일설치할 때 사용되는 장소.

/usr/share/man/

명령어들의 도움말을 주는 메뉴얼(manual)페이지 디렉토리. 즉, 이 디렉토리에는 시스템에서 사용하는 모든 맨페이지파일(man page)이 존재함.

/var

시스템운용중에 생성되었다가 삭제되는 데이터를 일시적으로 저장하기 위한 디렉토리. 거의 모든 시스템로그파일은 /var/log 에 저장되고, DNS 의 zone 설정파일은 /var/named 에 저장되고, 메일파일은 /var/spool/mail 에 저장되며, 크론설정파일은 /var/spool/cron 디렉토리에 각각 저장됨.

/var/tmp/

/tmp 디렉토리와 같은 공용디렉토리. 즉, /tmp 디렉토리와 /var/tmp 디렉토리의 퍼미션은 1777 로서 sticky bit 가 설정되어 있는 공용디렉토리이다. 리눅스 시스템에서 공용디렉토리는 /tmp 와 /var/tmp 둘뿐이다.

/var/log/

시스템로그파일(messages, secure, xferlog 파일등)이 저장되는 디렉토리.

/var/ftp/

vsftp 등과 같은 FTP 서비스를 위한 다운로드될 파일들 즉, FTP 홈디렉토리.

/var/named/

BIND 즉, DNS 에서 사용하는 zone 파일들이 저장되는 디렉토리.

/var/spool/mail/

각 계정사용자들의 메일파일이 저장되는 디렉토리.

/var/spool/lpd/

프린트를 하기 위한 임시 디렉토리(스풀링 디렉토리).

/var/spool/mqueue/

발송을 위한 메일 일시저장 디렉토리.

/var/spool/cron/

각 사용자들의 cron 설정파일들이 저장된 디렉토리.

/var/spool/at/

atd 즉, 예약작업에 관한 파일들이 저장되는 디렉토리.

/lost+found

최상위 디렉토리인 / 디렉토리에만 존재하는 것이 아니라 파일시스템마다 존재할 수 있는 디렉토리임. 이 디렉토리는 fsck 또는 e2fsck 등과 같은 파일시스템 체크 및 복구유틸리티 실행후에 주로 생성이 되는 것으로서 복구되지 않은 채로 블록(block)만 존재하는 파일 즉, 연결이 끊어진 inode 들이 숫자파일형태로 존재하는 곳임. 숫자형태로 존재하는 파일들은 mv 명령어로 파일이름만 바꾸면 바로 복구될 수 있다.

https://www.fosstechnix.com/install-zulu-openjdk-version-11/

 

Install Zulu OpenJDK Version 11 on Ubuntu 20.04/18.04/16.04 LTS

In this article, We are going to perform How to Install Zulu OpenJDK Version 11 on Ubuntu 20.04 LTS

www.fosstechnix.com

 

데비안 계열 ( 배포판 Ubuntu , Mint)는 apt명령어를 사용한다

apt가 무엇인지는 설치 후 자세히 알아보자

Command 창에서 apt 명령어로 Ubuntu용 Zulu 저장소의 키를 추가한다

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9

 

공식문서에 등록된 ServerKey 추가해야 패키지를 가져올 수 있다

아래 메세지가 뜨면 등록이 된 것

sudo apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main'
Executing: /tmp/apt-key-gpghome.PgxUnr6sbZ/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9

​

gpg: key B1998361219BD9C9: public key "Azul Systems, Inc. (Package signing key.) <pki-signing@azulsystems.com>" imported

​

gpg: Total number processed: 1

​

gpg: imported: 1

​

 

Zulu JDK의 저장소 추가

sudo apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main'

 

패키지 업데이트

sudo apt update

 

Zulu OpenJDK 버전 11 설치

sudo apt install zulu-11

 

설치가 완료되면 정상적으로 설치됬는지 확인

java -version

 

환경변수 정의

sudo nano /etc/environment

PATH 아랫줄에 해당문구를 붙여넣는다.

​

JAVA_HOME="/usr/lib/jvm/zulu-11-amd64"

 

환경변수 설정 조회

echo $JAVA_HOME

컴퓨터에 설정에 들어가 개발자용 탭에서 상태바를 켬으로 변경

 

Window 기능 켜기/끄기에서 Linux용 Windows 하위시스템을 체크하고 확인

 

윈도우에 마이크로스토어에서 Ubuntu 다운로드

자동으로 입력한 아이디로 접속 되면 끝

 
 
 
 
 
 
 
 
 

 

+ Recent posts