Skip to content

Latest commit

 

History

History
872 lines (480 loc) · 19 KB

포팅메뉴얼.md

File metadata and controls

872 lines (480 loc) · 19 KB

Pocket Fridge - 포팅 매뉴얼

목차

  1. EC2에 MariaDB 설치
  2. EC2에 Docker 설치
  3. Docker에 Jenkins 설치
  4. Jenkins 프로젝트 설정
  5. Spring 빌드 매뉴얼
  6. Flask 빌드
  7. Android 빌드

EC2에 MariaDB 설치

1. Update 실행

sudo apt-get update

image_1

2. MariaDB 설치

# -y 옵션은 이후 설치하겠습니까? 질문에 대답을 yes로 하겠다는 의미
sudo apt-get install mariadb-server -y

image_2

3. MariaDB 실행

# MariaDB 실행
sudo systemctl start mariadb

# MariaDB 상태 확인
sudo systemctl status mariadb

# MariaDB 종료
sudo systemctl stop mariadb

image_3

image_4

image_5

4. root 비밀번호 설정

# root로 DB 접속
sudo mysql -u root -p

# MariaDB 설치 후 root 비밀번호를 설정한 적이 없으므로 비밀번호를 물어보는 질문에는 그냥 Enter

image_6

# 데이터베이스 목록 확인
show databases;

# mysql 데이터베이스 사용
use mysql;

image_7

image_8

# 비밀번호 정보 확인
select host, user, password from user;

image_9

# root의 비밀번호를 Ssafy6!으로 업데이트
update user set password=password('Ssafy6!') where user='root';

# 변경사항 적용
flush privileges;

image_10

5. Pocket Fridge 데이터베이스 생성

# 데이터베이스 생성
create database pocket_fridge;

image_11

6. MariaDB 외부 접속 설정

# 외부 접속 설정을 위해 DB 설정 파일을 수정
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

# bind-address 를 주석 처리

image_12

image_13

# MariaDB 재시작
sudo systemctl restart mariadb

image_14

# MariaDB 접속
sudo mysql -u root -p

# mysql 데이터베이스 사용
use mysql;

# 외부 접속을 허용할 유저 생성
create user 'andback'@'%' identified by 'Ssafy6!';

# 외부 접속할 유저에 모든 권한 부여
grant all privileges on *.* to 'andback'@'%' identified by 'Ssafy6!';

# 설정 적용
flush privileges;

image_15

image_16

7. 외부 접속 확인

image_17

EC2에 Docker 설치

1. Update 실행

sudo apt-get update

image_18

2. Docker 설치

# 도커 설치
sudo apt install docker.io -y

# 도커 버전 확인
docker -v

# 도커 실행
sudo service docker start

# Docker 그룹에 sudo 추가(도커 바로 제어할 수 있도록)
sudo usermod -aG docker ubuntu

# 권환 적용 확인을 위해 프로세스 확인 명령어로 체크
docker ps

image_19

image_20

image_21

  • 위와 같이 Permission denied가 발생한다면 Docker 데몬 소켓파일(docker.sock)의 권한 변경이 필요

    # docker.sock 권한 변경
    sudo chmod 666 /var/run/docker.sock
    
    # 다시 한번 체크
    docker ps

    image_22

Docker에 Jenkins 설치

1. Jenkins 이미지 다운로드

# docker에 Jenkins 최신버전 이미지 다운로드
docker pull jenkins/jenkins:lts

image_23

2. Jenkins 컨테이너 실행

# jenkins-andback 이라는 이름으로 Jenkins 컨테이너 실행
docker run -itd --name jenkins-andback -p 8081:8080 jenkins/jenkins:lts

image_24

3. 초기 비밀번호 확인

# 위의 단계까지 완료후 k6d206.p.ssafy.io:8081 로 접속 시 Jenkins 비밀번호 입력 화면이 출력될 것이다.

# Jenkins 초기 비밀번호 확인
docker exec jenkins-andback cat /var/jenkins_home/secrets/initialAdminPassword

# 나온 비밀번호를 입력해주면 성공!

image_25

image_26

4. Jenkins 초기 설정

image_27

  • Install suggested plugins 선택

image_28

  • 정보 입력 후 Next

image_29

  • Jenkins 도메인 주소 확인 후 Next

image_30

  • 이 화면으로 넘어가면 초기 설정 완료!

Jenkins 프로젝트 설정

1. Item 생성

image_31

image_32

  • Item 이름 입력
  • Freestyle 선택 후 OK

2. SSH 연결 설정

  1. SSH Plugin 설치(Jekins 관리 → 플러그인 관리 → 설치 가능)

    image_33

  2. Key 파일 지정(Jenkins 관리 → 시스템 설정 → Publish over SSH 설정)

    • Key 입력 칸에 EC2 Pem 파일, 즉 K6D206T.Pem 파일 내용을 복사 / 붙여넣기 해준다.

      image_34

  3. SSH Server 추가 버튼 클릭 후 설정

    image_35

    • Name : 원하는 이름으로 설정
    • Hostname : 도메인(k6d206.p.ssafy.io)
    • Username : ubuntu
    • Test Configuration 선택 후 Success 확인!!

3. Gitlab 연결 설정

  1. Gitlab 플러그인 설치(Jenkins 관리 → 플러그인 관리 → 설치 가능)

    image_36

  2. Gitlab 설정(Jenkins 관리 → 시스템 설정 → Gitlab 설정)

    image_37

    • Connection name : 원하는 이름으로 설정

    • Gitlab host URL : https://lab.ssafy.com

    • Credentials 설정(Add 버튼 클릭)

      1. Gitlab → User Settings → Access Tokens

      image_38

      • Name : 원하는 이름으로 설정
      • Expires at : 필요한 기간만큼 설정
      • Scopes : 목적에 따라 체크
      1. Credentials 설정

        image_39

        • API Token : 방금 발급받은 API Token 값
        • ID : 원하는 이름으로 설정
        • Description : 적지 않아도 무방
    1. 연결 확인

    image_40

    • Test Connection 클릭 후 Success 확인!!

    4. 프로젝트 설정

    • 만든 프로젝트 → 구성 → 소스 코드 관리

      image_41

      • Repository URL : Gitlab Repository URL 주소

      • Credentials

        image_42

        • Username : Gitlab 아이디
        • Password : Gitlab 패스워드
        • ID : 원하는 이름으로 설정
        • Description : 적지 않아도 무방
      • Branch는 develop으로 설정

    • 빌드 유발

      image_43

      • Build when a change ... 체크

      image_44

      • 빌드 유발 하단의 고급 버튼 클릭

      image_45

      • Gitlab Webhook 설정을 위해 Generate 버튼으로 Secret token 발급

      GitLab Webhook 설정

      • Gitlab → setting → Webhooks

        image_46

        • URL : Jenkins Item URL 주소
        • Secret Token : Jenkins에서 발급한 Token
      • Add Webhook 클릭

    • Build

      image_47

      • Add build step → Execute shell 선택
      • 백엔드 프로젝트 빌드를 위해 아래의 명령어 입력
        • cd Backend/andback
        • chmod +x gradlew
        • ./gradlew clean build
      • Flask는 빌드 후 조치에서 작성
    • 빌드 후 조치

      image_48

      image_49

      • Name : 미리 설정해 둔 SSH
      • Source files : 배포할 파일 설정
      • Remove prefix : 제거할 접두사 설정
      • Remote directory : 배포할 파일이 저장될 디렉토리 설정, 이 때 EC2에 디렉토리가 없으면 에러 발생
      • Exec command : 배포가 된 후 실행할 명령어 작성
    • Shell Script

      • 아래의 쉘 스크립트를 EC2에서 작성해 ~/deploy/scripts 에 넣어준다.

      • init_spring_server.sh

        image_50

        echo "> 현재 구동중인 Pocket Fridge Spring pid 확인"
         CURRENT_PID=$(ps -ef | grep java | grep andback | awk '{print $2}')
        echo "$CURRENT_PID"
        if [ -z $CURRENT_PID ]; then
        echo "> 현재 구동중인 Pocket Fridge Spring이 없으므로 종료하지 않습니다."
        else
        echo "> kill -9 $CURRENT_PID"
        kill -9 $CURRENT_PID
        fi
        sleep 5
        echo "> Pocket Fridge Spring이 실행됩니다..."
        nohup java -jar /home/ubuntu/deploy/Backend/andback/build/libs/andback-0.0.1-SNAPSHOT.jar >> /home/ubuntu/deploy/logs/andbacklogs.log 2>&1 &
      • init_flask_server.sh

        image_51

        echo "> 현재 구동중인 Pocket Fridge Flask pid 확인"
         CURRENT_PID=$(ps -ef | grep app | awk '{print $2}')
        echo "$CURRENT_PID"
        if [ -z $CURRENT_PID ]; then
        echo "> 현재 구동중인 Pocket Fridge Flask가 없으므로 종료하지 않습니다."
        else
        echo "> kill -9 $CURRENT_PID"
        kill -9 $CURRENT_PID
        fi
        sleep 5
        echo "> Pocket Fridge Flask가 실행됩니다..."
        pip install --upgrade pip
        nohup python3 /home/ubuntu/deploy/ML/main/app.py >> /home/ubuntu/deploy/logs/flasklogs.log 2>&1 &

빌드 시 사용되는 환경 변수

Spring 빌드

// Spring 빌드
./gradlew clean build

// 빌드 완료된 jar 파일을 백그라운드로 실행
nohup java -jar /home/ubuntu/deploy/Backend/andback/build/libs/andback-0.0.1-SNAPSHOT.jar &

Flask 빌드

// Flask 빌드 & 백그라운드로 실행
nohup python3 app.py &

배포 시 특이사항

  • Spring은 8080번 포트 사용
  • Flask는 5000번 포트 사용

데이터베이스 접속 정보

[File Path]

  • S06P31D206 -> Backend -> andback -> main -> resources -> application-local.yml

image_52

사용하는 외부 서비스 정보

데이터베이스

  • 덤프 파일

    [File Path]

    S06P31D206 -> Backend -> andback -> main -> resources -> dump.sql

  • ERD 다이어그램

    image_53

Spring 빌드 매뉴얼

Spring yml 설정

데이터베이스 설정

  • yml 설정

image-20220520103132735

  • url : 주소/데이터베이스이름 넣기
  • username : 데이터베이스 아이디 입력
  • password : 데이터베이스 비밀번호 입력

구글 메일 설정

  • 로그인 > Google 계정 관리 > 보안 > 2단계 인증

image-20220520103622054

  • 로그인 > Google 계정 관리 > 보안 > 앱 비밀번호 > 메일, Windows 컴퓨터 선택

image-20220520103704991

  • 앱 비밀번호 생성

image-20220520103740356

  • IMAP 사용 설정

image-20220520104007711

  • yml 설정

image-20220520103300558

  • useranme : 구글 이메일 주소
  • password : 구글 비밀번호

Oauth 설정

OAuth2는 인증서버에서 로그인 후 인증서버에서 우리의 서버로 토큰을 보내주기 위해 Callback url을 등록해주어야 합니다.

OAuth2를 제공해주는 개발자 센터에 OAuth2 인증을 사용하기 위한 어플리케이션 등록 합니다.

구글 클라우드 플랫폼 바로가기

image-20220520104647941

API 및 서비스 클릭

image-20220520104741516

사용자 인증 정보 클릭 후 프로젝트 만들기 클릭

image-20220520104923865

이름을 입력하고 만들기 버튼 클릭

애플리케이션에 대한 정보를 포함하여 OAuth 동의 화면을 구성해야 한다.

image-20220520105012071

Google 계정이 있는 모든 사용자가 접근이 가능하게 할 것이기 때문에 외부 선택 후 만들기 클릭

image-20220520105042922

앱 이름과 사용자 지원 이메일 작성후 저장 후 계속 버튼 클릭

image-20220520105107370

email / profile / openid 클릭 후 업데이트 버튼 클릭 후 저장 후 계속

image-20220520105146624

저장 후 계속 버튼 클릭

image-20220520105252655

OAuth 클라이언트 ID 클릭

image-20220520105318867

이름 URI입력 후 저장

image-20220520105356190

클라이언트 아이디와 비밀번호를 받는다

  • yml 설정

image-20220520105513456

  • url : auth url
  • client-id 위에서 받은 클라이언트 id
  • client-secret : 위에서 받은 클라이언트 비밀번호
  • callback-url : 로그인 완료후 받은 url
  • scope : 위에서 설정한 scope

Firease 설정

  • 아래 주소로 들어가서 프로젝트를 생성한다

    바로가기

서버 프로젝트 설정

  • 만들어진 프로젝트에 들어간다

image-20220520110619012

  • 톱니바퀴 클릭 → 프로젝트 설정

image-20220520110647402

  • 서비스 계정 클릭 → 자바 체크 → 새 비공개 키 생성

image-20220520110713160

  • 스프링 부트 설정

  • 위에서 Firebase 프로젝트를 생성하면서 서버에 넣을 설정파일을 다운받았다

  • 그 파일을 아래 사진처럼 경로에 넣어준다

image-20220520110756662

  • yml 설정

image-20220520111014953

Mattermost notification 설정

  • yml 설정

image-20220520105932463

IntelliJ에서 프로젝트 빌드

image_54

  • Spring 프로젝트를 연 후 우측 상단에 보이는 Build 버튼을 클릭하면 프로젝트 빌드가 실행된다.

IntelliJ에서 프로젝트 실행

image_55

  • Build가 완료되었다면 main을 실행시키기 위해 AndbackApplication을 열어준다.

image_56

  • 초록색 화살표를 클릭해 "Run 'AndbackApplication'" 을 클릭해 프로젝트를 실행한다.

cmd에서 프로젝트 빌드

cd "Spring 프로젝트가 있는 경로 입력"
  • Spring 프로젝트가 있는 경로로 이동해준다.
gradlew build
  • gradlew 파일을 이용하여 빌드를 실행한다.

cmd에서 프로젝트 실행

cd "Spring 프로젝트 경로/build/libs"
  • Spring 프로젝트가 빌드가 완료되었다면 build/libs 폴더가 생성된다. 이 경로로 이동해준다.
java -jar "jar 파일 이름"
  • java -jar 명령어로 jar 파일을 실행시키면 Spring 프로젝트가 실행된다.

Flask 빌드

1. Anaconda 설치

Anaconda | Anaconda Distribution

2. 가상환경 생성 후 라이브러리 추가

  • Anaconda Prompt 실행 후 가상환경 생성

    conda create -n pocket_fridge python=3.9 # 가상환경 생성
    conda activate pocket_fridge # pocket_fridge 가상환경 활성화
    # conda deactivate # 현재 가상환경 비활성화
    # conda info --envs # anaconda의 모든 가상환경 리스트 출력
    # conda env remove --n <가상환경 이름> # 가상환경 삭제 시 사용
  • 필요 라이브러리 추가

    cd <프로젝트폴더>/ML/main
    pip install -r requirements.txt
    

3. IntelliJ에서 Python 인터프리터 설정

  • File > Project Structure

    image-20220520103132398

  • SDKs > Add Python SDK...

    image-20220520103644592

  • Conda Environment > Existing environment > Interpreter > 만든 가상환경 (pocket_fridge) 선택 > OK

    image-20220520103832549

  • 프로젝트 실행 환경 설정 > Edit Configurations...

    image-20220520104055986

  • app.py > Configuration > Python interpreter > Use specified interpreter > 방금 만든 SDK 선택 > OK

    image-20220520104158037

Android 빌드

환경설정

IDE

  • Android Studio Bumblebee | 2021.1.1 Patch 2
  • Android gradle plugin : 7.1.2
  • gradle version: 7.2

Build config

android_54


local.properties에 다음의 정보를 입력 후 빌드한다.

// local.properties

barcode_service_key="공공데이터포털 - 바코드연계제품정보 api key"
google_auth_server_id="Google Cloud Platform 서버쪽 OAuth 클라이언트 ID"
firebase_storage_recipe_thumbnail_base_url="cloud storage 공개 url"
firebase_storage_recipe_cook_step_base_url="cloud 공개 url"
firebase_category_img_base_url="cloud storage 공개 url"
  • 공공데이터포털 - 바코드연계제품정보에서 Open API 이용 신청을 하여 key를 발급받는다.
  • google_auth_server_id는 외부서비스 - OAtuh2.0을 참고하시오.
  • cloud storage 공개 url은 외부서비스 - 파이어베이스를 참고하시오.



google-services.json

android_55

google-services.json 파일을 app 모듈 내부에 위치

해당 파일은 외부서비스 - 파이어베이스를 참고하시오.

Firebase

프로젝트 생성 및 앱 등록

android56 android57 android58 android59 android60 android61


Google Cloud Platform > 해당 프로젝트 > API 및 서비스 > 사용자 인증 정보에 자동으로 키가 생성된 것을 확인할 수 있다. android60


Firebase Storage

사용할 이미지를 storage에 폴더별로 나눠서 올린다. android64 android65


google cloud platform에 접속하여 다음의 설정을 해준다. android66 android67 android68 android69

Google 소셜 로그인

Google Cloud Platform > 해당 프로젝트 > API 및 서비스 > 사용자 인증 정보

android69 android70