왜 자동배포인가?
로컬에서 글 쓰고 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:
| 증상 | 원인 | 해결 |
|---|---|---|
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; |
로컬 없이 “바로 글 쓰기” 루틴
- GitHub에서 새 포스트 파일 만들기: _posts/2025-11-11-my-post.md
- 본문 작성 → Commit to main
- Actions 탭에서 Deploy to Server가 실행되는지 확인
로그에 아래 순서가 보이면 성공:
[deploy] sync to origin/main
[deploy] bundle install
[deploy] jekyll build
[deploy] rsync to web root
[deploy] done
결론
성공적으로 서버도 실행됨 변경사항도 잘 수정됨을 확인 이제 앞으로 개발 관련 모든 기록을 여기다가 업로드할 예정 목표는 적어도 1주일에 4번은 글쓰기 잘 할 수있을지 모르겠다