블로그 배포 (CI/CD)

GitHub main 브랜치에 push하면 웹훅으로 서버에 배포를 트리거합니다.

SSH를 사용하지 않습니다. 서버가 GitHub에서 pull → 빌드 → 배포를 수행하므로, IP 제한이 있어도 동작합니다.

배포 흐름

  1. main 브랜치에 push
  2. GitHub Actions가 서버의 /deploy-webhook으로 POST 요청
  3. 서버가 webhook 수신 → git pull → Jekyll 빌드 → /var/www/NOTE에 복사

사전 설정

1. GitHub Secret

저장소 Settings → Secrets and variables → Actions에서 추가:

Secret 설명
DEPLOY_WEBHOOK_SECRET 웹훅 인증용 비밀값 (영문/숫자 조합, 32자 이상 권장)
# 랜덤 시크릿 생성 (macOS)
openssl rand -hex 32

2. 서버 초기 설정 (최초 1회)

서버에 SSH 접속 후:

# 1. 저장소 클론 (아직 없다면)
cd /home/ubuntu
git clone https://github.com/POBSIZ/NOTE.git
cd NOTE

# 2. Jekyll 의존성 설치
cd docs && bundle install && cd ..

# 3. 웹훅 서비스 설정
REPO_PATH=$(pwd)
sudo cp docs/tools/deploy-webhook.service /etc/systemd/system/
sudo sed -i "s/changeme/YOUR_SECRET/" /etc/systemd/system/deploy-webhook.service
sudo sed -i "s|REPO_PATH|$REPO_PATH|g" /etc/systemd/system/deploy-webhook.service
sudo systemctl daemon-reload
sudo systemctl enable deploy-webhook
sudo systemctl start deploy-webhook

# 4. nginx에 webhook 경로 추가
# /etc/nginx/sites-available/NOTE 의 server 블록 안에 추가:
#
#   location = /deploy-webhook {
#       proxy_pass http://127.0.0.1:9000;
#       proxy_set_header Host $host;
#       proxy_set_header X-Real-IP $remote_addr;
#       proxy_set_header X-Forwarded-Proto $scheme;
#   }
#
sudo nginx -t && sudo systemctl reload nginx

3. GitHub Secret과 서버 Secret 일치

DEPLOY_WEBHOOK_SECRET(GitHub)과 서버의 deploy-webhook.serviceDEPLOY_WEBHOOK_SECRET 값이 동일해야 합니다.

수동 배포

Actions 탭 → Deploy BlogRun workflow

파일 구조

파일 용도
.github/workflows/deploy.yml push 시 webhook 호출
docs/tools/deploy-webhook-server.py 웹훅 수신 서버
docs/tools/deploy.sh 서버 배포 스크립트
docs/tools/deploy-webhook.service systemd 서비스 정의