인프라

[Contabo] Github Actions + GHCR + Docker Compose로 CI/CD 구현하기 (Contabo 서버)

빙기때침식곡 2025. 6. 6. 21:27
반응형

이번 글에서는 GitHub Actions, GHCR(GitHub Container Registry), Docker Compose를 이용해 코드 push → 자동 배포까지 연결하는 전체 과정을 정리한다.

 

 

 

 

[Contabo] 콘타보 우분투 계정 생성과 SSH 접속 환경 설정에 대해서 알아보자.

해보고 싶은 개인 프로젝트가 있어서 AWS 프리티어 및 Oracle 무료 인스턴스를 사용해 봤지만 사양이 넉넉치 않아서 저렴하고 성능 좋은 콘타보 인스턴스를 구매하게 되었다.     최초 로그인은

iwillcomplete.tistory.com

콘타보 초기 셋팅이 필요하다면 해당 게시물을 확인해보자.

 

 

 

우분투에서 Docker & Docker Compose 설치하기

 

CI/CD를 구성하려면 우선 서버에 Docker와 Docker Compose가 설치되어 있어야 한다.

Ubuntu 서버에서 간단하게 설치하려면 아래 명령어를 차례대로 실행하면 된다.

 

# Docker 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# Docker Compose 설치 (v2 기준)
sudo apt install docker-compose-plugin -y

# 현재 사용자에 docker 권한 부여 (로그아웃 후 적용됨)
sudo usermod -aG docker $USER

 

 


 

왜 GitHub Container Registry를 사용할까?

  • Docker Hub는 프리티어 기준으로 프라이빗 레포지토리 1개만 허용
  • GHCR은 GitHub 계정 기반으로 프라이빗 무제한
  • CI/CD 파이프라인에서 관리하기 쉬우며, GitHub Actions와 연동도 편리

 


CI/CD 구성 흐름

 

  1. GitHub Actions에서 Docker 이미지 빌드 → GHCR에 push
  2. Contabo 서버에서 docker compose pull로 최신 이미지 받기
  3. docker compose up -d로 자동 재시작

 


1. GHCR Personal Access Token 생성

 

GitHub > Settings > Developer Settings > Personal Access Token 생성

  • 기존에 발급한 토큰에 해당 권한이 있으면 그대로 사용해도 된다.

 


권한:

  • write:packages
  • read:packages
  • repo (프라이빗 리포 사용 시)

 

2. GitHub Actions 워크플로우 설정

 

.github/workflows/deploy.yml

name: Deploy to Contabo Server

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Log in to GHCR
        run: echo "${{ secrets.CR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Build & Push
        run: |
          OWNER_LC=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
          IMAGE_NAME=ghcr.io/$OWNER_LC/image-to-pdf:latest
          docker build -t $IMAGE_NAME .
          docker push $IMAGE_NAME

      - name: Copy docker-compose.yml to server
        uses: appleboy/scp-action@v0.1.6
        with:
          host: ${{ secrets.CONTABO_SERVER_IP }}
          username: ${{ secrets.CONTABO_SERVER_USER }}
          key: ${{ secrets.CONTABO_SERVER_SSH_KEY }}
          source: './docker-compose.yml'
          target: ${{ secrets.PROJECT_PATH }}

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: SSH deploy
        uses: appleboy/ssh-action@v0.1.8
        with:
          host: ${{ secrets.CONTABO_SERVER_IP }}
          username: ${{ secrets.CONTABO_SERVER_USER }}
          key: ${{ secrets.CONTABO_SERVER_SSH_KEY }}
          script: |
            docker login ghcr.io -u ${{ github.actor }} --password ${{ secrets.CR_PAT }}
            cd ${{ secrets.PROJECT_PATH }}
            docker compose pull nest
            docker compose up -d nest

 


3. docker-compose.yml 구성

services:
  nest:
    image: ghcr.io/yourgithub/yourimage:latest
    container_name: nest-app
    ports:
      - "3002:3002"
    restart: unless-stopped
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

 

참고:

  • version: '3.8'은 더 이상 필요 없음 → 삭제
  • .env 사용 안 하면 env_file:도 생략

 

4. GitHub Secrets 설정:

GitHub 리포지토리 페이지에서 Settings > Secrets and variables > Actions로 이동한 후 위의 정보를 New repository secret으로 추가합니다.

 

이를 통해 민감한 정보를 코드에 직접 노출하지 않고 관리할 수 있습니다.

 


 

마무리

 

CI/CD 파이프라인을 직접 구성해보면 처음에는 설정 요소가 많아 헷갈릴 수 있지만, 각 요소의 역할과 연결 구조만 이해하면 어렵지 않다.

특히 Docker Hub 무료 제약을 회피하고자 GHCR을 쓰는 전략은 개인 프로젝트에 매우 실용적이다.

반응형