DAMDA 프로젝트 배포

Park JeaHyun·2022년 9월 26일
0

DAMDA

목록 보기
6/6

Naver Cloud Platform 배포

1. 서버 생성


서버는 네이버 클라우드 플랫폼(NCP)에 생성했다.

  • 서버 사양: [Standard] 2vCPU, 4GB Mem, 50GB Disk [g1]
  • OS: CentOS 7.8
  • 스토리지: [HDD] 기본 스토리지 50 GB /dev/xvda

처음 서버를 만들게 되면 비공인IP(사설IP)만 만들어지기 때문에 공인IP도 할당 받았다. 서버를 만들 때 발급받은 인증키는 잘보관하도록 하자. (카카오톡 나한테 보내기로 저장 & 바탕화면에 저장)

2. jea 계정 추가 및 sudo 권한 부여


경로: /etc/sudoers

3. 도메인 구매


적절한 도메인 이름을 구매

wogus.net 이라는 이름을 구매했다. (연간 17달러) 구매는 위 사이트에서 했지만 관리는 https://dnszi.com/ 이곳에서 한다.

구매한 도메인 이름을 dnszi에 등록하면 네임서버 5개를 알려준다. 이 네임서버 5개를 iwantmyname 사이트의 도메인 관리창에 업데이트 해준다.

이제 dnszi 사이트에서 아래와 같이 도메인과 서버 IP를 연결해 주자.

4. 포트 포워딩


포트 포워딩을 하는 이유 : 간단하게 cmd 창에서 ‘nslookup 도메인’을 입력하는 것으로 해당 서버의 IP를 알아낼 수 있다. 따라서 해커가 IP와 포트를 알기 때문에 (리눅스의 원격제어 포트는 22번 포트) 마구잡이로 비밀번호를 입력해서 원격제어를 시도할 수 있다.

따라서 포트 포워딩을 통해 실제 서버에 바로 접근하는 것을 막도록 하자

NCP에 들어가 보면 포트 포워딩 정보가 있다. 편집 버튼을 눌러서 포트 포워딩 정보를 입력해주자. 정리하자면 현재 IP는 3개이다.

  • 비공인 IP : 10.41.183.202 / 네이버 클라우드 플랫폼 내부의 사설IP.
  • 공인 IP : 115.85.181.76 / 서버의 진짜 IP
  • 서버 접속용 공인 IP : 210.89.189.222 / 진짜 서버에 접속하기 위한 중개자 역할 IP

즉, 이제 원격제어를 위해서 접속하려면 서버 접속용 공인 IP의 2227번 포트를 이용해서 접근해야 진짜 서버의 22번 포트를 접근할 수 있다.

5. 서버(NCP)내 도커 설치


도커 설치 명렁어

# 도커 설치
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
sudo yum install docker-ce -y
sudo systemctl start docker
sudo systemctl enable docker

# 도커 컴포즈 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 도커를 sudo 없이 사용
sudo usermod -aG docker ${USER}
# 도커를 sudo 없이 사용하려면, putty 재시작 필수

도커 설정 초기화 명령어

# 컨테이너 삭제
docker rm -f $(docker ps -qa)

# 이미지 삭제
docker rmi -f $(docker images -qa)

# 안쓰는 네트워크 삭제
docker network prune -f

# 안쓰는 볼륨 삭제
docker volume prune -f

# 도커 프로젝트 삭제
sudo rm -rf /docker/projects
sudo rm -rf /docker_projects

6. MySQL 설치


NGINX 설치 전에 DB를 먼저 설치해줘야 NGINX 로그가 남는다고 하니 먼저 설치하자. root 계정의 비밀번호는 0000으로 설정해준다.

# 컨테이너 실행
docker run \
  --name mariadb__1 \
  -d \
  --restart unless-stopped \
  -e MARIADB_ROOT_PASSWORD=0000 \
  -e TZ=Asia/Seoul \
  -p 3306:3306 \
  -v /docker_projects/mariadb__1/conf.d:/etc/mysql/conf.d \
  -v /docker_projects/mariadb__1/mysql:/var/lib/mysql \
  -v /docker_projects/mariadb__1/run/mysqld:/run/mysqld/ \
  mariadb:latest

# mariadb__1 컨테이너 안에서 ls 명령을 실행
docker exec mariadb__1 ls

# mariadb__1 컨테이너 안에서 mysql -u root -p 명령을 실행
# 복잡한 명령언 -it 옵션을 붙어야 한다.
docker exec -it mariadb__1 mysql -u root -p
exit;

7. 방화벽 설정(ACG)

기존 원격제어를 위해서 22번 포트만 서버에서 열어두었었다. 이제 MySQL, HTTPS, HTTP 등을 위해 81, 80, 443, 3306 포트를 열자.

8. 서버 및 DB 계정 정보

계정정보계정명비밀번호
서버 (210.89.189.222 (2227), 115.85.181.76)jea / root둘 다 jh20141836
DB (MySQL, 외부 접근 가능)jea / root둘 다 0000
DB (MySQL, 원격지에서 접속 불가능 오직 서버에서만 접속 가능)jealocal1234
# 보안설정
docker exec -it mariadb__1 /usr/bin/mariadb-secure-installation
- Switch to unix_socket authentication [Y/n] n
- Change the root password? [Y/n] n
- 나머지 Y

# 마스터계정(jea 생성) 및 DB 생성
docker exec -it mariadb__1 mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO jea@`%` IDENTIFIED BY '0000';
GRANT ALL PRIVILEGES ON *.* TO jealocal@`localhost` IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON *.* TO jealocal@172.17.0.1 IDENTIFIED BY '1234';

CREATE DATABASE nginx;
exit;
❓ 3306 포트 포워딩 해주지 않아도 되는건가? 원격 접속 포트(22)만 해주면 되는건가?

9. NGINX 설정


복잡한 NGINX 설정, SSL 설정등에서 해방되기위해서 NGINX PROXY MANAGER 설치
NGINX에 80 / 81 / 443 포트를 열어두었다. 8024는 의미없음.
이제 서버에 들어오는 80 / 81 / 443 포트는 NGINX가 받는다.

# 컨테이너 compose 파일이 담길 폴더 생성
sudo mkdir -p /docker_projects/nginx__1
cd /docker_projects/nginx__1

# 컨테이너 compose 파일 생성
sudo vim docker-compose.yml

# docker-compose.yml 내용 시작
version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      - '8024:8024' # Additional Sample Port
    environment:
      TZ: "Asia/Seoul"
      DB_MYSQL_HOST: "172.17.0.1"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "jea"
      DB_MYSQL_PASSWORD: "0000"
      DB_MYSQL_NAME: "nginx"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
# docker-compose.yml 내용 끝

# 설정파일대로 컨테이너 생성
docker-compose up -d

# 관리콘솔 접속확인
http://wogus.net:81/
  • wogus.net 접속 후 초기 관리자 계정 생성
    • Full Name: Administrator
    • Nickname: Admin
    • Email: jea5158@naver.com
    • Password: jh20141836

10. 젠킨스


젠킨스 설치

docker run \
  --name jenkins_1 \
  -p 8081:8080 \
  -e TZ=Asia/Seoul \
  -v /docker_projects/jenkins__1/var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /docker_projects/jenkins_1/data:/data \
  -u root \
  -d \
  --restart unless-stopped \
  jenkins/jenkins:lts

java 17 설치

  • 방법 1 : jenkins_1 컨테이너에 접속해서 설치
docker exec -it jenkins_1 bash

apt-get update

apt-get install openjdk-17-jdk -y

exit
  • 방법 2 : HOST OS에서 컨테이너로 명령을 전송해서
docker exec jenkins_1 apt-get update

docker exec jenkins_1 apt-get install openjdk-17-jdk -y

접속

docker exec -it jenkins_1 bash

확인

java --version

env

env | fgrep JAVA_HOME

mlocate 설치 및 검색

apt-get install mlocate

updatedb

locate java | fgrep 17 | fgrep javac

#찾음 : /usr/lib/jvm/java-17-openjdk-amd64

JAVA_HOME 환경변수 변경

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

#JAVA_HOME 환경변수 변경 확인
echo $JAVA_HOME

jenkins_1 bash 접속

docker exec -it jenkins_1 bash

jenkins_1 bash 도커 설치

apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
rm /etc/apt/keyrings/docker.gpg
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin
exit

11. 빌드


  1. 젠킨스 내부에서 빌드하는 방식
  • 프로젝트 경로
    /var/jenkins_home/damda1

  • chmod 744 ./gradlew

  • ./gradlew clean build

  • Dockerfile

FROM openjdk:17-jdk-alpine
ARG JAR_FILE=build/libs/damda-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  • docker build -t damda .

  • 이미지 실행

docker run \
  --name=damda_1 \
  -p 8080:8080 \
  -d \
  damda
  • 컨테이너 삭제
docker rm -f damda_1
  • 이미지 삭제
docker rmi -f damda
  1. 젠킨스 파이프라인 방식
pipeline {
    agent any
    
    tools {
        jdk 'openjdk-17-jdk'
    }
    
    stages {
        stage('Prepare') {
            steps {
                git branch: 'master',
                    credentialsId: '8adcdfea-cde9-4613-983c-8294600d5082',
                    url: 'git@github.com:likelion-backendschool/DAMDA_project.git'
            }
            
            post {
                success { 
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }    
        }
        
        stage('Build Gradle Test') {
            
            steps {
                sh (script:'''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh """
                    chmod +x gradlew
                    """
                }
                
                dir('.') {
                    sh """
                    ./gradlew clean build
                    """
                }
            }
            
            post {
                success { 
                    sh 'echo "Successfully Build Gradle Test"'
                }
                 failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }    
        }
        
        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker stop damda_1
                docker rm -f damda_1
                docker rmi -f damda
                """
            }
            
            post {
                success { 
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }
        
        stage('Bulid Docker Image') {
            steps {
                sh 'echo " Image Bulid Start"'
                sh """
                docker build -t damda .
                """
            }
            
            post {
                success {
                    sh 'echo "Bulid Docker Image Success"'
                }

                failure {
                    sh 'echo "Bulid Docker Image Fail"'
                }
            }
        }
        
        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker run \
                  --name=damda_1 \
                  -p 8080:8080 \
                  -v /docker_projects/damda_1/volumes/gen:/gen \
                  --restart unless-stopped \
                  -e TZ=Asia/Seoul \
                  -d \
                  damda
                """
            }
            
            post {
                success {
                    sh 'echo "Docker Run Success"'
                }

                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}

12. nginx 설정


0개의 댓글