포스트

Jekyll·Chirpy 운영 트러블슈팅 — 카테고리, 미래 시각, sudo 권한 문제

Chirpy 하위 카테고리 구성, future date로 글이 빌드에서 빠지는 문제, sudo 빌드가 남긴 root 소유 캐시로 EACCES가 발생하는 문제를 한곳에 정리한다.

Jekyll·Chirpy 운영 트러블슈팅 — 카테고리, 미래 시각, sudo 권한 문제

Jekyll·Chirpy 블로그를 운영하면서 실제로 마주친 작은 함정들을 한곳에 모은다. 각각 별도 글로 둘 만큼 큰 주제는 아니지만, 다시 만나면 원인을 떠올리기 어려운 문제들이다.

Chirpy 하위 카테고리는 front matter로 만든다

_posts/의 물리 폴더는 이 블로그의 파일 정리와 permalink에는 영향을 주지만, Chirpy의 카테고리 계층은 글의 categories front matter로 구성한다.

예를 들어:

1
categories: [neovim, "LazyVim"]

처럼 두 단계로 지정하면 neovim 아래에 LazyVim 하위 카테고리가 생긴다.

따라서 _posts/neovim/처럼 파일을 옮겼다고 카테고리가 자동으로 바뀌는 것은 아니다. 파일 경로와 게시 카테고리는 별개의 축으로 관리한다.

Chirpy의 /categories/ 페이지에서 펼치기/접기 화살표가 활성화되는 것도 실제 하위 카테고리가 있을 때다.

incremental build 후 카테고리 페이지가 비는 경우

개발 중 incremental build가 _site/archives/index.html 같은 산출물을 비정상적으로 만들었다면 전체 빌드로 확인한다.

1
bundle exec jekyll build

필요하면 개발 서버를 재시작한다.

글 시각이 미래면 빌드에서 빠질 수 있다

글이 보이지 않을 때 빌드 로그에 다음과 비슷한 메시지가 있는지 확인한다.

1
Skipping: _posts/.../foo.md has a future date

Jekyll은 기본적으로 date가 현재 시각보다 미래인 글을 빌드에서 제외할 수 있다. 날짜만이 아니라 시각까지 비교하므로, 오전에 글을 작성하면서 같은 날 오후 시각을 front matter에 넣어도 미래 글이 된다.

해결

로컬에서 빠르게 확인하려면:

1
bundle exec jekyll serve --future

사이트 전체에서 미래 글도 빌드하려면 _config.yml:

1
future: true

예약 발행 의도가 없다면 가장 단순한 방법은 글의 date를 현재 이전 시각으로 맞추는 것이다.

sudo로 빌드한 뒤 EACCES가 발생하는 경우

sudo bundle exec jekyll serve처럼 Jekyll을 root로 실행하면 _site/.jekyll-cache/ 내부에 root 소유 파일이 남을 수 있다. 이후 일반 사용자로 실행하면 다음과 같은 오류가 난다.

1
Permission denied @ rb_sysopen ... (Errno::EACCES)

디렉터리 자체의 소유자만 보면 정상처럼 보일 수 있으므로 내부까지 확인한다.

1
find _site .jekyll-cache ! -user "$(id -un)" | head

둘 다 빌드 산출물/캐시이므로 문제가 확인되면 지우고 다시 생성하면 된다.

1
2
sudo rm -rf _site .jekyll-cache
bundle exec jekyll serve

예방책은 단순하다. 일반적인 개발 서버 포트에서는 Jekyll을 sudo로 실행할 이유가 없다.

정리

증상먼저 볼 것해결 방향
하위 카테고리가 안 보임categories 배열[상위, 하위]로 지정
새 글만 빌드에서 빠짐front matter date와 현재 시각시각 수정 또는 future 설정
이전엔 되던 빌드가 EACCES_site, .jekyll-cache 내부 소유자root 산출물 제거 후 일반 사용자로 재빌드

이 세 문제는 서로 원인은 다르지만 공통적으로 Jekyll이 소스 파일만 읽는 단순 변환기가 아니라 front matter, 빌드 정책, 로컬 파일 권한의 영향을 함께 받는다는 점을 보여준다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.