Ghost에 한글 URL 적용

Ghost는 기본 영문 URL을 지원한다. 요것이 Ghost 글을 쓰며, 영문으로 URL을 계속 만들어주는 것도 귀찮다. 그래서 그냥 한글 제목을 바로 URL로 적용할 수 있도록 수정했다. 귀차니즘 또 1승

Ghost에 한글 URL 적용
Photo by ibmoon Kim / Unsplash
Docker를 이용해 AWS Lightsail에 Ghost5 설치
AWS Lightsail에 docker를 이용해 싸게, 그리고 쉽고 빠르게 Ghost 블로그 개설 방법을 설명한다.
나에게 맞게 Ghost 설정하기
Ghost를 시작하고, 이제 내 입맛에 맞게 각종 항목 변경 사항을 기록해둔다. 추가 혹은 조정 사항은 나에게 불필요한 요소 제거, 댓글 추가, 코드 하이라이트 추가, 목차 보기 기능 추가이다.

두 개의 글을 통해 현재 사용 중인 고스트 설치 및 설정을 완료하였다. 그럭저럭 쓰는데 별다른 문제는 없었다.  하지만, 아직 귀찮은 요소가 남았다.

고스트가 한글 URL을 지원하지 않아 그럴듯한 영문 URL을 생성해 주는 작업. 고스트가 기본으로 한글 제목을 발음 나는 대로 영어로 옮겨서 작성은 해준다. 하지만 그렇게 만들어진 URL은 정말 쓰레기 같은 정보만 담고 있다. 그 어떤 사람에게도 도움이 되지 않는다.

그래서, 결국 한글 URL 지원하도록 고스트를 수정하기로 했다.

사전 준비

locale 변경

AWS는 기본 locale이 영어로 되어있다. 그렇기에 한글 입력이 안될 수 있다. 그렇기에 대충 한글을 쓸 수 있게 locale 변경 법을 먼저 정리한다.

# 한글 언어팩 다운
sudo apt install language-pack-ko

재부팅시에도 한국/한글 locale 적용을 위해 sudo vi /etc/default/locale를 이용해 설정을 아래와 같이 변경한다.

LANG="ko_KR.UTF-8"
LANGUAGE="ko_KR:ko:en_US:en"

locale 설정 끝~

Ghost의 새로운 docker volume 생성

수정 대상 소스는 ghost의 versions 디렉티리에 존재한다. 현재 해당 디테토리는 docker 이미지로 관리가 되어, 수정한다면 docker 이미지 변경 저장 과정이 필요하다. 흠. 수정 대상 디렉터리를 docker volume으로 관리한다면 소스 변경 및 유지 보수가 편리할 것 같다.

기존 docker-compose.yaml에 "ghost-ver:/var/lib/ghost/versions" 항목을 추가하여 볼륨 설정을 추가한다.

version: '3.9'

services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    restart: unless-stopped
    volumes:
      - conf:/etc/nginx/conf.d
      - certs:/etc/nginx/certs:ro
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  nginx-proxy-acme:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    depends_on:
      - nginx-proxy
    restart: unless-stopped
    environment:
      NGINX_PROXY_CONTAINER: ${NGINX_PROXY_CONTAINER}
    volumes:
      - certs:/etc/nginx/certs:rw
      - acme:/etc/acme.sh
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro

  ghost:
    image: ghost:5
    container_name: ghost
    depends_on:
      - nginx-proxy
      - nginx-proxy-acme
      - db
    restart: unless-stopped
    ports:
      - 8080:2368
    environment:
      VIRTUAL_HOST: ${GHOST_VIRTUAL_HOST}
      VIRTUAL_PORT: ${GHOST_VIRTUAL_PORT}
      LETSENCRYPT_HOST: ${GHOST_LETSENCRYPT_HOST}
      LETSENCRYPT_EMAIL: ${GHOST_LETSENCRYPT_EMAIL}
      database__client: ${GHOST_DB_CLIENT}
      database__connection__host: ${GHOST_DB_HOST}
      database__connection__port: ${GHOST_DB_PORT}
      database__connection__user: ${MYSQL_USER}
      database__connection__password: ${MYSQL_PASSWORD}
      database__connection__database: ${MYSQL_DATABASE}
      url: ${GHOST_URL}
    volumes:
      - ghost-data:/var/lib/ghost/content
      - ghost-ver:/var/lib/ghost/versions

  db:
    image: mysql:8
    container_name: db
    depends_on:
      - nginx-proxy
      - nginx-proxy-acme
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    volumes:
      - db-data:/var/lib/mysql
      - ghost-ver:/var/lib/ghost/versions

volumes:
  conf:
  certs:
  vhost:
  html:
  acme:
  ghost-data:
  ghost-ver:
  db-data:

수정 후 sudo docker compose up -d 명령으로 docker 재기동~! 그럼 준비 끝~~!

한글 URL 지원하도록 소스 수정

ghost의 소스를 docker 볼륨을 생성하여 처리하였다. 그렇기에 이제는 /var/lib/docker/volumes/ 디렉터리 내에 ghost의 versions의 파일이 위치한다. 예) /var/lib/docker/volumes/myghost_ghost-ver/_data/

5.14.1/node_modules/@tryghost/validator/lib/validator.js 파일의 아래 사항을 수정한다.

validator.extend('isSlug', function isSlug(str) {
    return validator.matches(str, /^[a-z0-9\-_ㄱ-ㅎㅏ-ㅣ가-힣]+$/);
});

5.14.1/node_modules/@tryghost/string/lib/slugify.js 내의 코드 주석으로 만들기.

// Remove non ascii characters
//string = unidecode(string);

sudo docker compose up -d 명령을 이용해 docker 재기동하면 ghost가 한글 URL을 지원합니다.


참고 자료

  1. http://egloos.zum.com/killins/v/3014274
  2. https://tmigod.com/%EA%B3%A0%EC%8A%A4%ED%8A%B8-%EB%B8%94%EB%A1%9C%EA%B7%B8-%ED%95%9C%EA%B8%80-url-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EB%B2%95/