왜 자동배포인가?

로컬에서 글 쓰고 git push만 하면 서버가 알아서 최신 상태로 바뀌길 원했다.
“수동 로그인 → 빌드 → 복사”를 없애 생산성을 높이는 게 목표.


아키텍처 한 장 요약

개발 → git push (main) ↓ GitHub Actions (SSH) ↓ EC2: /home/ubuntu/myblog

  • rbenv Ruby 3.3.4

  • bundle install → jekyll build

  • _site/ → rsync → /var/www/myblog ↓ Nginx(80/443) → https://blog.juwonpark.me


서버 구성

  • OS: Ubuntu 24.04 LTS (EC2)
  • 웹서버: Nginx + Let’s Encrypt(Cloudflare 앞단)
  • Jekyll 빌드: rbenv + Ruby 3.3.4 + bundler
  • 문서 루트: /var/www/myblog
  • 소스 경로: /home/ubuntu/myblog

rbenv & Jekyll

export RBENV_ROOT="$HOME/.rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init - bash)"

ruby -v || rbenv install -s 3.3.4
rbenv global 3.3.4
gem install bundler jekyll --no-document

GitHub Actions 워크플로

  • 핵심은 서버에 SSH 접속 → 리포 강제 동기화 → 빌드 → rsync 배포.
name: Deploy to Server
on:
  push: { branches: [ main ] }
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Setup SSH
        run: |
          set -e
          mkdir -p ~/.ssh
          echo "$" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          PORT="$"; [ -z "$PORT" ] && PORT=22
          ssh-keyscan -p "$PORT" -H "$" >> ~/.ssh/known_hosts

      - name: Deploy to server
        run: |
          set -e
          PORT="$"; [ -z "$PORT" ] && PORT=22
          ssh -i ~/.ssh/deploy_key -p "$PORT" \
            -o StrictHostKeyChecking=yes \
            -o UserKnownHostsFile=~/.ssh/known_hosts \
            "$@$" '
            set -euo pipefail
            echo "[deploy] start"

            export RBENV_ROOT="$HOME/.rbenv"
            export PATH="$RBENV_ROOT/bin:$PATH"
            eval "$(rbenv init - bash)"

            cd /home/ubuntu/myblog
            RUBY_VER="$(cat .ruby-version 2>/dev/null || echo 3.3.4)"
            rbenv shell "$RUBY_VER"
            gem install bundler --no-document || true

            echo "[deploy] sync to origin/main"
            git fetch origin
            git reset --hard origin/main
            git clean -fd

            echo "[deploy] bundle install"
            bundle install

            echo "[deploy] jekyll build"
            bundle exec jekyll build -s . -d _site

            echo "[deploy] rsync to web root"
            rsync -az --delete _site/ /var/www/myblog/

            echo "[deploy] done"

테마/페이지 커스터마이징

  title: "Juwon"
  description: "주원의 윈도우95 테마 블로그"

About 링크와 페이지 상단 메뉴 파일: _includes/topbar.html

  <a href="/me/"><li>About</li></a>

처음 시작은 윈도우95 theme으로 시작했으나 내가 원하는 블로그에 적절하지 않아서 변경 —

초기 theme:

Windows 95 테마 데모

증상 원인 해결
bundle: command not found 비대화식 SSH에서 rbenv PATH 미설정 워크플로 원격 스크립트에 RBENV_ROOT/PATH + eval "$(rbenv init - bash)" 추가
rbenv: version '3.3.5' not installed 서버 Ruby와 .ruby-version 불일치 버전 3.3.4로 통일 후 rbenv shell 3.3.4
git pull 충돌 서버에 로컬 변경 파일 존재 git fetch && git reset --hard origin/main && git clean -fd
Actions Bad port '' SERVER_PORT 누락 비어있으면 22로 폴백
About 404 메뉴는 /me, 실 페이지 없음 루트 me.md 생성 + 메뉴 링크 /me/로 고정
한글 깨짐 meta/헤더에 charset 없음 <meta charset="utf-8"> + charset utf-8;

로컬 없이 “바로 글 쓰기” 루틴

  1. GitHub에서 새 포스트 파일 만들기: _posts/2025-11-11-my-post.md
  2. 본문 작성 → Commit to main
  3. Actions 탭에서 Deploy to Server가 실행되는지 확인

로그에 아래 순서가 보이면 성공:

  [deploy] sync to origin/main
  [deploy] bundle install
  [deploy] jekyll build
  [deploy] rsync to web root
  [deploy] done

결론

성공적으로 서버도 실행됨 변경사항도 잘 수정됨을 확인 이제 앞으로 개발 관련 모든 기록을 여기다가 업로드할 예정 목표는 적어도 1주일에 4번은 글쓰기 잘 할 수있을지 모르겠다