ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Gitlab] 도커 컴포즈로 깃랩 구축 + 백업 + 복원 + 사용 사례
    Infra/gitlab 2024. 12. 3. 18:53

     

    깃랩을 구축 및 사용법을 공유하려고 한다.
     
    먼저 docker-compose 코드이다.
     

    version: '3.6'
    services:
      console:
        container_name: gitlab-console
        image: 'gitlab/gitlab-ce:14.7.3-ce.0'
        restart: always
        hostname: 'domain'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'https://domain'
            gitlab_rails['backup_keep_time'] = 604800
            gitlab_rails['gitlab_email_from'] = 'abcd@mail.com'
            gitlab_rails['gitlab_shell_ssh_port'] = 9022
            gitlab_rails['time_zone'] = 'Asia/Seoul'
            nginx['ssl_certificate'] = '/path/to/ssl.crt'
            nginx['ssl_certificate_key'] = '/path/to/ssl.key'
        ports:
          - '9000:9000'
          - '9022:22'
        volumes:
          - '/path/to/console/config:/etc/gitlab'
          - '/path/to/console/logs:/var/log/gitlab'
          - '/path/to/console/data:/var/opt/gitlab'
          - '/path/to/console/backups:/data/backups'
        shm_size: '256m'
    
      runner:
        container_name: gitlab-runner
        image: 'gitlab/gitlab-runner:version'
        restart: always
        volumes:
          - '/path/to/runner/config:/etc/gitlab-runner'
          - '/path/to/certs:/etc/gitlab-runner/certs'
          - '/path/to/runner/cache:/cache'
          - '/var/run/docker.sock:/var/run/docker.sock'

     
    설명하자면
     
    먼저 이 콘솔에 등록할 러너는 배포 시에 사용할 러너라서 
    '/var/run/docker.sock:/var/run/docker.sock' 이 코드는 docker.sock 을 마운트 시킨다.
    저 docker.sock 은 도커 데몬에게 명령을 내리기 위한 Unix 도메인 소켓 파일이다.
    도커 데몬과 소통하기 위한 인터페이스인 것.
    ssl 인증서와 러너 캐시를 마운트해주고
    도메인 정보를 입력한다.
     
    이제 이 docker-compose.yml이 작성된 위치에서 
    docker-compose up 을 하면 해당 컨테이너들이 동작한다.
     

     

    이렇게 하면 초기 시작은 완료된 것이다.
     

    백업

     
    이렇게 운영하다 백업하는 방법은 다음과 같다.
     

    docker exec -t gitlab-console gitlab-backup create

     
    이 때도 다양한 옵션이 있다.
    아티팩트라는 것을 포함할 수도 있고
    포함하지 않을 수 있다.
     

    docker exec -t gitlab-console SKIP=artifacts gitlab-backup create

     
    이제 이렇게 생성하면 내가 마운트한 백업 디렉토리에 생성될텐데
    이것을 옮겨주면 된다.
    아티팩트는 빌드 결과물 및 빌드 시 사용되었던 파일들이다.
    이것을 활용하면 간단하게 빌드한 이미지를 
    도커 허브같은 것을 쓰지 않고 전달도 가능하다.
     
    위의 명령어를 cron job 으로 등록해서 백업을 해두면 좋다!
     

    crontab -e

     

    # m h  dom mon dow   command
    0 1 * * * docker exec -t gitlab-console gitlab-backup create

     
    도커 허브를 쓰지 않고 빌드된 이미지를 
    다른 tag를 가지고 있는 러너에게 전달하는 
    예시 gitlab-ci.yml 

    docker image:
      stage: package
      dependencies:
        - gradle build
      image:
        name: gcr.io/kaniko-project/executor:debug
        entrypoint: [""]
      variables:
        AWS_PROFILE: profile
      script:
        - echo $AWS_DEPLOY_TARGET
        - mkdir -p /kaniko/.docker
        - echo "{ \"credsStore\"":" \"ecr-login\" }" > /kaniko/.docker/config.json
        - /kaniko/executor --cache=true --context $CI_PROJECT_DIR/back --dockerfile "Dockerfile" --destination $AWS_DEPLOY_TARGET
    
    deploy_to_gitlab:
      stage: deploy
      dependencies:
        - docker image
      tags:
        - mytag
      variables:
        AWS_PROFILE: profile
      script:
        - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_DEPLOY_TARGET
        - bash /pato/to/deploy_cmd.sh $BACKEND_APP_NAME $IMAGE_TAG $APP_PORT

     
     
     
    이제 콘솔에 들어가 설정하고 복원시키면 된다.
     

    복원

    docker exec -it gitlab-console bash

     

    이렇게 직접 들어가서 해도 되고
     

    docker exec -t gitlab-console gitlab-backup restore BACKUP=/var/opt/gitlab/backups/백업대상지정

     
    이처럼 명령어만 전달해도 된다.
    근데 이 때 시크릿도 같이 전달해야 한다.
     
    근데 이 때 

     
    깃랩 콘솔에 /etc/gitlab 디렉토리에 있는 gitlab.rb 와 gitlab-secrets.json 를 가지고
     
    gitlab-ce/console/config/gitlab.rb
    gitlab-ce/console/config/gitlab-secrets.json
    이 위치로 넣어주면 된다.
     
    gitlab.rb는
    깃랩 설정들이 들어있는데 
    여기에 아까 말했던 아티팩트를 포함시키거나 빼는 환경변수를 넣을 수 있다.
     

    gitlab_rails['env'] = {
      'SKIP' => 'artifacts'
    }

     

    이렇게 하면 백업은 완료된다.
    기존에 사용하던 계정으로 로그인된다면 성공이다.
     

    사용 사례

    깃랩 러너를 여러 머신에 설치하여 원하는 작업을 
    gitlab 의 파이프라인을 통해 할 수 있다.
     
    그 중에 배포 시에 필요한 sh 파일을 
    레포를 통해 관리하여
    깃을 통한 버전관리도 되고 여러 머신에 복사할 수 있는 기능의 레포의 ci 코드를 적으며 마무리하겠다.
     

    stages:
      - spring_copy
      - front_copy
      - aws_key_update
      - aws_key_update_local
      - aws_key_update_db
    
    spring_copy:
      stage: spring_copy
      parallel:
        matrix:
          - TAG: qa
          - TAG: dev
          - TAG: prod
      variables:
        AWS_PROFILE: profile
      tags:
        - $TAG
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^spring-copy/
          when: always
        - when: never
      script:
        - sudo cp -r ./spring_server/dep/* /dep/
        - sudo find /dep/ -type f -exec chmod +x {} +
        - echo "Files copied to /dep"
    
    front_copy:
      stage: front_copy
      parallel:
        matrix:
          - TAG: qa-front
          - TAG: dev-front
          - TAG: prod-front
      variables:
        AWS_PROFILE: profile
      tags:
        - $TAG
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^front-copy/
          when: always
        - when: never
      script:
        - sudo cp -r ./front_server/dep/* /home/ubuntu/dep/
        - sudo find /home/ubuntu/dep/ -type f -exec chmod +x {} +
        - echo "Files copied to /home/ubuntu/dep"
    
    spring_aws_key_update:
      stage: aws_key_update
      parallel:
        matrix:
          - TAG: qa
          - TAG: dev
          - TAG: prod
      variables:
        AWS_PROFILE: profile
      tags:
        - $TAG
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
          when: always
        - when: never
      script:
        - sudo -u ubuntu aws configure set aws_access_key_id $(aws configure get aws_access_key_id --profile ${AWS_PROFILE})
        - sudo -u ubuntu aws configure set aws_secret_access_key $(aws configure get aws_secret_access_key --profile ${AWS_PROFILE})
        - sudo aws configure set aws_access_key_id $(aws configure get aws_access_key_id --profile ${AWS_PROFILE})
        - sudo aws configure set aws_secret_access_key $(aws configure get aws_secret_access_key --profile ${AWS_PROFILE})
        # aws env 전달 (ein 프로젝트) 
        - |
          cat > spring_server/aws.env << EOF
          AWS_S3_KEY=$AWS_S3_KEY
          AWS_S3_SECRET=$AWS_S3_SECRET
          AWS_SES_KEY=$AWS_SES_KEY
          AWS_SES_SECRET=$AWS_SES_SECRET
          EOF
        - sudo cp spring_server/aws.env /dep/
        - sudo chmod +x /dep/aws.env
    
    front_aws_key_update:
      stage: aws_key_update
      parallel:
        matrix:
          - TAG: qa-front
          - TAG: prod-front
          - TAG: prod2-front
    
      variables:
        AWS_PROFILE: profile
      tags:
        - $TAG
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
          when: always
        - when: never
      script:
        - sudo -u ubuntu aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo -u ubuntu aws configure set aws_secret_access_key $AWS_S3_SECRET
        - sudo aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
    
    local_dev_aws_key_update:
      stage: aws_key_update_local
      variables:
        AWS_PROFILE: profile
      tags:
        - mytag1
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
          when: always
        - when: never
      script:
        - sudo -u local-dev aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo -u local-dev aws configure set aws_secret_access_key $AWS_S3_SECRET
        - sudo aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
    
    local_dev2_aws_key_update:
      stage: aws_key_update_local
      variables:
        AWS_PROFILE: profile
      tags:
        - mytag2
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
          when: always
        - when: never
      script:
        - sudo -u local-dev-2 aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo -u local-dev-2 aws configure set aws_secret_access_key $AWS_S3_SECRET
        - sudo aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
    
    db_aws_key_update:
      stage: aws_key_update_db
      parallel:
        matrix:
          - TAG: db-prod
          - TAG: db-qa
          - TAG: db-dev
      variables:
        AWS_PROFILE: m42-prod
      tags:
        - $TAG
      rules:
        - if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
          when: always
        - when: never
      script:
        - sudo -u ubuntu aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo -u ubuntu aws configure set aws_secret_access_key $AWS_S3_SECRET
        - sudo aws configure set aws_access_key_id $AWS_S3_KEY
        - sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
Designed by Tistory.