이번 글에서는 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 구성 흐름
- GitHub Actions에서 Docker 이미지 빌드 → GHCR에 push
- Contabo 서버에서 docker compose pull로 최신 이미지 받기
- 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을 쓰는 전략은 개인 프로젝트에 매우 실용적이다.