Migrate Ghost to Hugo

Page content

Wordpress 블로그를 hugo로 바꾼 김에 ghost 블로그도 hugo로 이사하기로 결심했다.
Ghost 정말 애증이 담긴…

Ghost가 1.0이 되기 전에 markdown 기반의 블로그 툴을 찾는 과정 에서 발견해서 0.9 버전인가 부터 사용해 왔다. Ghost가 node 기반이라 생전 처음 듣는 node를 OS X에 설치해보고, docker for OS X이 나와서 docker로 실행해 오다, docker-compose 도 써 보고, Ansible 로 deploy도 해보고. 그러다 2019년에는 kubernetes hands-on을 해 볼 겸해서 리눅스에서 microk8s를 설치해서 ghost도 k8s로 실행해 봈다. 그리고 k8s에서 기본처럼 사용되는 SW 배포/관리 툴인 helm도 hands-on을 해 보고 싶어서 helm chart로 ghost도 배포해 보고. 횟수로 치면 대략 2016년 정보 부터 같은데 그간 Ghost는 1.0을 거쳐 2.0 그리고 지금은 3.0까지 업데이트가 된 상태이다.

처음에 Ghost에 끌렸던 이유는 markdown 기반이라는 점이 컸는데, 본격적으로 markdown을 기반으로 글을 쓰는 blog 툴이라는 점. 그리고 그때도 그랬지만, wordpress가 blog 외에 다양한 형태의 CMS(Contents Management System)으로 개발되다 보니 blog만 돌리기에는 too much하다는 느낌을 지울 수 없었다. Ghost가 sqlite를 backend DB로 사용할 수 있는 것과 달리 wordpress는 MySql등의 DB를 반드시 사용해야 한다는 점도 8GB의 리눅스 박스에서 돌리기엔 부담이 벅차서 메모리 부족으로 에러가 나기도 했다는…

Ghost에서 hugo로 이전해야겠다는 마음을 먹게 한 가장 큰 이유는 Ghost의 editor때문이 아닌가 싶다. 초기에는 정말 간단한 형태의 text editor 였는데, 시간이 지나면서 점점 복잡한 형태의 editor로 바뀌었는데 내겐 오히려 적응하는 것이 쉽지 않았다. 그냥 markdown 문법 몇 가지만 익혀서 사용하면 될 듯 한데 그걸 WIGWYG 형태로 지원하다 보니 오히려 내겐 번거로운 절차가 되어 버렸다.

어차피 Ghost blog에 올린 글들은 markdown으로 정리했던 내용이 대부분인 터라 그냥 향후에 platform 에 대한 의존성을 줄이는 셈 치고 Ghost에서 한 발 물러서기로 했다.

Hugo 를 이용한 사이트를 만드는 것도 아직 익숙하지 않아서 살짝 헤매긴 했지만, 더 큰 문제는 Ghost에 있는 글들을 어떻게 옮길 것인가 하는. 개발자 사이에서는 Hugo를 이용한 블로그를 쓰는 경우가 적지 않지만 Ghost를 사용하다 Hugo로 이전하는 경우는 그렇게 많아 보이지 않았다. 구글링을 해 보면 대부분 GhostToHugo라는 golang으로 작성된 앱을 이용해서 데이터를 전환했다는 경우가 많았다. 그래도 나도 같은 툴을 시도해 봤는데 왠걸 잘 안된다. golang 문법을 모르지만, 에러가 난 부분을 보면 file IO로 보이는데 잘 이해가 안된다. 간단하게 디버그 코드를 추가해서 확인해 보려고 해도 이상하게 내가 수정한 코드가 실행이 안되는. 아마도 이건 golang의 빌드 체계를 몰라서 그런 듯.

또 다시 구글링을 해서 찾는 방법은 누군가 PHP로 작성한 스크립트인데 역시나 안된다. 워낙 코드가 간단하긴 한데 문제는 문제가 왜 발생하는 지 전혀 감을 못 잡겠다는… 근데 그 간단한 코드를 보니 대략 어떻게 하고 있구나 하는 감이 잡혔다. 그래서 이번 기회에 그냥 스크립트를 직접 작성해 보자 하고 졸린 눈을 부비고 코드를 작성했다. mobiledoc 문법으로 되어 있는 블로그 본문을 제외한 부분은 대충 원하는 형태로 동작하도록 했는데 mobiledoc의 문법이 또 달라서 이걸 markdown으로 변경하는 것도 은근 시간이 필요한 작업으로 보였다. 그러다 다시 구글링을 mobiledoc to markdown을 주제로 하다 찾은 글이 바로 이 글 Migrating From Ghost to Hugo (Again) 이다. 2017년에 작성된 글인데 무려 내가 하고 싶었던, 내가 헤매고 있었던 부분이 모두 구현된 변환 스크립트였다. 거기에 내가 몇 줄을 사용해서 구현한 기능을 단 한 줄로 pythonic 한 코드로 깔끔하게 작성한 걸 보고 좌절감을 또… ;

지난 번 wordpress를 이전한 hugo는 Mainroad theme을 사용했는데 ghost 를 이전한 hugo는 pure를 선택했다. 둘 다 깔끔한데, hugo의 단점으로 보이는 것 중 하나가 theme 간에 대략적인 통일성은 있는데 그렇다고 기본적인 걸 모두 엄격하게 지키는 게 아니라 theme 마다 hugo configuration 파일(config.toml 혹은 config.yaml)의 내용을 모두 바꿔야 한다. 그리고 md 파일을 두는 위치도 content 아래에서는 각 theme마다 다르게 처리하고 있어 지금도 mainroad theme은 post를 사용하고, pure theme은 posts를 사용한다. (이 점도 내가 아직 hugo의 구조를 제대로 이해하지 못해서 그럴 수도 있다 물론…)

두 개 theme에서 공히 없는 기능은 monthly archive 목록을 sidebar에서 보여주는 거. 특히 journal 형태로 가족 블로그에서 아쉬운 기능이다. 특정 연도에 있던 일을 보고 싶을 때가 많은데 mainroad theme 뿐만 아니라 다른 hugo theme에서도 이런 기능이 흔하지는 않다. 아마도(?) hugo를 사용하는 사람들이 대부분 기술적인 내용을 남기는 tech blogger여서 그런게 아닌가 싶은데 나로서는 아쉬운 부분이다. 이 기능은 꼭 필요하다는 생각이 들어 시간 날 때마다 찾아봐야겠다.

이번에 Ghost에서 hugo로 옮긴 블로그는 github.io에 호스팅을 해보기로 했다. wordpress에서 이전한 hugo 블로그처럼 직접 nginx container를 이용해서 호스팅해도 되는데, 그냥 이번에는 그렇게 해보려고 한다. 거기에 netify도 연동해서 글을 쓰면 자동으로 글이 github.io에 호스팅에 반영되는 것 까지 해보려고. 실은 이건 wordpress에서 이전한 hugo 블로그에도 필요한 기능인데 netify가 제공하는 한 개의 블로그에 sosa0sa.com 도메인을 넘겨버리면 집 mac mini 서버로 redirect하는 것이 어려워져서 제약이 생길 것 같아 고민 중이다. 그건 좀 써 보면서 생각을 해 보기로…

Farewell Ghost~