Files
caliverse_doc/07. OperationSystem/운영툴 서버 설정.md
2025-05-01 07:27:54 +09:00

15 KiB

운영툴 서버 설정

  • 운영툴 주소
    • 10.20.20.12
  • 운영툴 구성을 위한 필요 프로그램 설치
    • Docker Desktop Installer
    • Git-2.43.0-64-bit
    • jdk-17.0.10_windows-x64_bin
    • node-v20.11.0-x64
    • python-3.12.1-amd64
    • jenkins.msi
  • Docker MariaDB 구성
    • 소스코트 내 \Server\docker\admintool 에 있는 docker-compose 실행
      • .env 파일에 root 계정의 패스워드 설정
      • db\initdb.d 내에 최초 설치시 실행될 스크립트 구성
        • 스키마 추가, 변경 경우 여기에 같이 추가해주는것이 좋음
  • 젠킨스 Git Credential 구성
    • enkins 관리 → Credentials → (global)도메인 선택 → Add credential 선택
    • kind → Username with password
    • Scope → Global
    • Username → jenkins_user
    • Password → jen3596!@
      • Username, Password는 git 계정을 의미
    • ID → admintool_git (표시 이름)
  • 젠킨스 플러그인 관련 설정

    • 플러그인 설치
        • 기본적인 플러그인은 최초 설치시 설정
        • NodeJs Plugin
        • Docker Pipeline
        • Docker
        • Gradle
        • Pipeline
        • Publish Over SSH
        • Subversion Plug-in
    • Tools 설정
      • JDK installations 설정
        • Name : jdk
        • JAVA_HOME : C:\Program Files\Java\jdk-17
      • Gradle installations 설정
        • name : gradle
        • version : 7.6.4
      • NodeJS installation
        • name : nodejs
        • version : 21.6.2
  • Frontend Stage 배포 작업 구성(24-08-23 기준)

    pipeline {
        agent any
    
        environment {
            DOCKER_IMAGE = "caliverse/admintool-front"
            DOCKER_TAG = "1.0.0"		// 신규 버전
            DOCKER_TAG_PRE = "1.0.0"	// 이전 버전
            FILE_NAME = 'admintool_front.tar'
            DOCKER_NAME = 'admintool-front'
            DOCKER_PORT = '8080'
        }
    
        stages {
            stage('Docker Build') {
                steps {
                    sh 'docker rmi $DOCKER_IMAGE:$DOCKER_TAG_PRE || true'   //이전 이미지 삭제
                    sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG .'   //새 이미지 생성
                    echo 'Docker Image 생성'
                    sh 'docker save -o $FILE_NAME $DOCKER_IMAGE:$DOCKER_TAG'   //이미지 .tar 로 생성
                    echo "Docker Image > .tar 파일로 생성"
                }
            }
            stage('Transfer Docker Image') {
                steps {
                    // aws .tar transfer
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: 'stage-frontend',
                                transfers: [
                                    sshTransfer(
                                        sourceFiles: "${FILE_NAME}",
                                        remoteDirectory: '',
                                        execCommand: """
                                        	echo ".tar 전송 완료
                                        """,
                                        execTimeout: 120000
                                    )
                                ],
                                usePromotionTimestamp: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
            stage('Deploy to Remote'){
                steps{
                    // aws command
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: 'stage-frontend',
                                transfers: [
                                    sshTransfer(
                                        execCommand: """
                                            docker stop ${DOCKER_NAME} || true &&
                                            docker rm ${DOCKER_NAME} || true &&
                                            docker rmi ${DOCKER_IMAGE}:${DOCKER_TAG_PRE} || true &&
                                            docker load -i ${FILE_NAME} &&
                                            docker run -d \
                                                -p ${DOCKER_PORT}:${DOCKER_PORT} \
                                                --name ${DOCKER_NAME} \
                                                -v ./admintool/log:/var/log/nginx \
                                                -e TZ=\${TZ:-Asia/Seoul} \
                                                ${DOCKER_IMAGE}:${DOCKER_TAG} &&
                                            rm ${FILE_NAME}
                                            echo 'Docker Container Create Complete'
                                        """,
                                        execTimeout: 120000
                                    )
                                ],
                                usePromotionTimestamp: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
        }
    }
    
  • Frontend Reverse Proxy(nginx.conf)

    server {
        listen 8080;
        listen  [::]:8080;
        server_name localhost;
    
        location / {
            root   /usr/share/nginx/admintool;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
    
        # api reverse proxy
        location /api/ {
            proxy_pass http://172.30.148.164:23450;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/admintool;
        }
    }
    
  • Frontend Dockerfile

    FROM node:20.11.0 as build
    
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm run build
    
    FROM nginx:alpine
    COPY nginx.conf /etc/nginx/conf.d/default.conf
    COPY --from=build /app/build /usr/share/nginx/admintool
    
    # port 8080
    EXPOSE 8080
    
    CMD ["nginx", "-g", "daemon off;"]
    
  • Backend Stage 배포 작업 구성(24-08-23 기준)

    pipeline {
        agent any
    
        environment {
            DOCKER_IMAGE = 'caliverse/admintool-back'
            DOCKER_TAG = '1.0.0'
            DOCKER_TAG_PRE = '1.0.0'
            FILE_NAME = 'admintool_back.tar'
            DOCKER_NAME = 'admintool-back'
            DOCKER_PORT = '23450'
        }
    
        stages {
            stage('Gradle Build') {
                steps {
                    script {
                        sh 'chmod +x gradlew'  //gradle 권한 설정
                        sh './gradlew clean build -x test'     //빌드 test는 하지않는다
                    }
                }
            }
            stage('Docker Image Build') {
                steps {
                    script {
                        sh 'docker rmi $DOCKER_IMAGE:$DOCKER_TAG_PRE || true'   //이전 이미지 삭제
                        sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG .'
                        echo 'Docker Image Create'
                        sh 'docker save -o $FILE_NAME $DOCKER_IMAGE:$DOCKER_TAG'
                        echo 'Docker Image > .tar File Create'
                    }
                }
            }
            stage('SSH Tunneling') {
                steps {
                    script {
                        sh 'ssh -f -N -L 127.30.148.164:2211:172.30.148.164:2211 ubuntu@52.32.111.3 -p 2211 -i /home/admintool/USWest2-KeyPair.pem -o StrictHostKeyChecking=no &'
                    }
                }
            }
            stage('Transfer Docker Image') {
                steps {
                    // aws .tar transfer
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: 'stage-backend',
                                transfers: [
                                    sshTransfer(
                                        sourceFiles: "${FILE_NAME}",
                                        remoteDirectory: '',
                                        execCommand: """
                                            echo '.tar Transfer Complete'
                                        """,
                                        execTimeout: 120000
                                    )
                                ],
                                usePromotionTimestamp: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
            stage('Deploy to Remote'){
                steps{
                    // aws command
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: 'stage-backend',
                                transfers: [
                                    sshTransfer(
                                        execCommand: """
                                            docker load -i ${FILE_NAME} &&
                                            docker stop ${DOCKER_NAME} || true &&
                                            docker rm ${DOCKER_NAME} || true &&
                                            docker rmi ${DOCKER_IMAGE}:${DOCKER_TAG_PRE} || true &&
                                            docker run -d \
                                                -p ${DOCKER_PORT}:${DOCKER_PORT} \
                                                --name ${DOCKER_NAME} \
                                                -e TZ=\${TZ:-Asia/Seoul} \
                                                -v ./admintool/log:/logs \
                                                ${DOCKER_IMAGE}:${DOCKER_TAG} &&
                                            rm ${FILE_NAME}
                                        """,
                                        execTimeout: 120000
                                    )
                                ],
                                usePromotionTimestamp: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
        }
    }
    
  • Backend Dockerfile

    FROM openjdk:17
    ARG JAR_FILE=build/libs/CaliverseAdminAPI.jar
    COPY ${JAR_FILE} admintool.jar
    ENTRYPOINT ["java","-jar","/admintool.jar"]
    
  • Frontend 작업 구성(24-02-21 기준) - 사용안함

    pipeline { agent any environment { CI = 'false' } stages { stage('Pull Code') { steps { git branch: 'dev', credentialsId: 'admintool_git', url: 'http://44.227.18.113/caliverseadmin/backofficefront.git' } } stage('Move Files') { steps { bat 'xcopy /E /Y ..\Dev_FrontEnd_Build\* D:\AdminTool\FrontEnd\' } } stage('Build') { steps { dir('D:\AdminTool\FrontEnd\') { bat 'npm install' bat 'npm install pm2' bat 'npm run build' } } } stage('Stop') { steps { dir('D:\AdminTool\FrontEnd\') { script { try { bat 'pm2 delete AdminTool'
    } catch (error) {}

                  }
    
              } 
          }
      }
      stage('Create ecosystem.config.js if not exists') {
          steps {
              script {
                  def configFile = 'D:\\AdminTool\\FrontEnd\\ecosystem.config.js'
                  def configContent = '''module.exports = {
                    apps: [{
                      name: 'AdminTool',
                      script: './node_modules/react-scripts/scripts/start.js',
                      instances: 2,
                      exec_mode: 'cluster'
                    }]
                  }'''
                  if (!fileExists(configFile)) {
                      writeFile file: configFile, text: configContent
                      echo "Created ecosystem.config.js"
                  } else {
                      echo "ecosystem.config.js already exists"
                  }
              }
          }
      }
      stage('Start') {
          steps {
              dir('D:\\AdminTool\\FrontEnd\\') {
                  bat  '''
                      set BUILD_ID=dontKillMe
                      node_modules\\.bin\\pm2 start --name AdminTool                         
    
                  '''
              }
    
          }
      }
    }
    

    }

  • Backend 작업 구성(24-02-21 기준) - 사용안함

    pipeline { agent any environment { CI = 'false' } stages { stage('Pull Code') {

          steps {
              git branch: 'dev', credentialsId: 'admintool_git', url: 'http://44.227.18.113/caliverseadmin/backofficeapi.git'
          }
      }
    
      stage('Move Files') {
          steps {
              bat 'xcopy /E /Y ..\\Dev_BackEnd_Build\\* D:\\AdminTool\\BackEnd\\'
          }
      }
      stage('Stop') {
          steps {
              script {
                  bat '''
                      for /f "tokens=5" %%a in ('netstat -ano ^| findstr :9099') do (
                          set pid=%%a
                      )
    
                      if not "%pid%"=="" (
                          taskkill /F /PID %pid%
                          echo Process Ended. PID: %pid%
                      ) else (
                          echo No PID!!
                      )
                  '''
              }
          }
      }
      stage('Build') {
          steps {
              dir('D:\\AdminTool\\BackEnd\\') {
                  script {
                      def buildResult = bat returnStatus: true, script: 'gradlew bootJar'
                      if (buildResult != 0) {
                          error 'Failed to build the project'
                      }
                  }
              }
          }
      }
      stage('Run') {
          steps {
              dir('D:\\AdminTool\\BackEnd\\build\\libs\\') {
                  script {
                      bat  '''
                      set JENKINS_NODE_COOKIE=dontKillMe
                      start /b cmd /c java -jar -Dspring.profiles.active=dev .\\CaliverseAdminAPI.jar &
                      '''
                  }
              }
          }
      }
    
    }
    

    }