-
[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.ymldocker 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
'Infra > gitlab' 카테고리의 다른 글
[GitLab] 깃랩 CI/CD 캐시 (1) 2024.12.11 [GitLab] EC2 인스턴스에 깃랩 러너 동작원리 + 등록하기 + SSL 구성 (2) 2024.05.12