여러가지 우여곡절 끝에 ghost 2.2 update를 완료했다.

그 우여곡절에 대해 한번 정리를 해본다.

기존에 사용하던 버전

1.14 버전을 쓰고 있었는데 어드민 들어갈 때마다 버전업하라고 알려주길래 ghost update 명령어로 업데이트를 실행했었다.

첫번째 실패

1.x 최신 버전을 설치한 상태에서 2.x 버전으로 업데이트가 가능하다는 오류를 발견했다.

업데이트 이후에도 2.x 업데이트 시 db migration이 자꾸 실패해서 결국 롤백했다.

ubuntu update 이후 먹통이 된 블로그

그리고 며칠 후 ubuntu를 16에서 18로 버전업 할 일이 있어 버전업을 했다.

그런데 우분투를 버전업한 이후 ghost start를 실행하면, 서비스를 띄우다가 타임아웃 에러가 나면서 서비스 실행 실패가 뜨는 것이었다.

우선 디버깅을 위해 ghost run으로 서비스 없이 실행을 한 후, 하나씩 해결하기로 했다.

nvm과 system node 문제

우선 첫번째로 겪은 문제는 ghost cli 문제였는데, npm install -g ghost-cli로 최신 버전을 설치해도 ghost --version으로 뜨는 버전은 과거 버전이 자꾸 뜨는 문제였다.

여러차례 삽질 결과 PATH 경로에 system node.js 경로가 nvm module path 보다 앞에 위치해서 생기는 문제로 판단이 되었고, system node.js를 삭제했다.

우선 이 문제는 해결.

nvm을 잘 쓰자.

node.js 최신 버전에서의 문제

최신 버전에서는 기존 1.x 버전대의 ghost.js 실행 시 오류가 났다.

이 문제는 lts/boron(6.x.x)으로 node.js의 버전을 바꿔서 해결.

ghost run은 됐지만 ghost start는 여전히 먹통.

systemctl 문제

여러건의 구글링 끝에 ghost.js를 백그라운드에서 실행하기 위해 systemctl이라는 것을 사용한다는 것을 알 수 있었다.

관련해서 ghost_blog-roto-codes.service 라는 이름으로 서비스가 실행이 된다는 것을 알게 되었고, journalctl -f 명령어를 통해 로그를 볼 수 있다는 것을 알게 되었다.

npm not found

journalctl로 로그를 띄워둔 후, ghost start로 서비스를 시작해보니 npm을 못 찾는 이상한 에러가 보였다.

이 문제는 ghost_blog-roto-codes.service 설정 파일을 수정해서 참조하는 node.js 경로 및 PATH를 추가하는 것으로 해결했다.

우선 살리는데 성공

겨우겨우 기존 블로그를 살리는 것에 성공해서 어드민 메뉴로 들어가 기존에 작성한 글들을 export 했다.
json 형식의 데이터로 export가 되었다.

새로운 마이그레이션 플랜

마이그레이션이 자꾸 안 되는 문제는 해결이 안 되어서 결국 생각한 방법은 새로운 도메인으로 2.x.x 버전의 ghost.js를 설치하고, 위에서 export 받은 데이터를 import 한 후 nginx 설정을 고쳐서 blog.roto.codes 가 새로 설치한 블로그를 바라보게 하는 것이였다.

2.x.x 설치는 됐으나..

route 53blog2.roto.codes 도메인 설정을 했다. 그 후 blog2 라는 폴더를 새로 만들고 이 폴더에 ghost install 명령어로 ghost.js의 최신 버전을 설치했다.

그러나 설치가 다 끝나고 ghost start로 실행 시 자꾸 db insert 에러가 발생.

emoji 문제

에러 로그를 자세히 보니, 초기 앱을 기동하면서 샘플로 넣는 블로그 포스트 내용에 emoji가 있는데, mysql에서 utf-8 인코딩으로는 emoji 캐릭터 문자를 넣을 수 없다고 한다. utf-8에서 utf8mb4로 바꾸면 된다.

바꾸니 잘 되었다.

성공

blog2.roto.codes를 성공적으로 띄우고, 위에서 export 받은 데이터를 import 했다. 버전이 달아서 import가 안 되면 어쩌나 했는데, 다행스럽게 import가 잘 되었다.

이후 기존에 업로드한 첨부파일들을 blog2 아래 폴더에 이동 시켰다.

게시물들이 잘 뜨는 걸 확인하고 nginx 설정을 바꿔서 blog.roto.codes 새로 설치한 블로그를 바라보도록 수정했다.

배우게 된 것

  • systemctl
  • journalctl
  • mysql에서 emoji를 쓰러면 utf8mb4로 인코딩 해야한다
  • 업데이트 하기 전에 백업 꼭 하자...