Thoughts, stories and ideas.

Ghost 고군분투 설치기

AWS 환경 셋팅

  • 추후 업데이트

1. Ghost 설치하기

아래는 간략하게 리스트만 기록해두고, 자세한 내용은 추후에 업데이트할 예정.

  • node 설치
sudo apt-get update
sudo apt-get install git
wget https://nodejs.org/dist/v6.9.4/node-v6.9.4-linux-x64.tar.gz
mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node
rm -rf node-v*
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc
sudo mv node /opt/
sudo chown -R root: /opt/node
sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm
node -v
  • yarn 설치
sudo npm install --global yarn
  • ghost 다운로드
curl -L https://ghost.org/zip/ghost-latest.zip -o ghost-latest.zip
sudo apt-get install unzip
unzip ghost-latest.zip -d ghost && cd ghost
yarn install
  • Nginx, MySql 설치
sudo apt-get install nginx
sudo apt-get install mysql-server
mysql -u root -p
  • Knex-migrator
sudo npm install -g knex-migrator
  • Configuration
$ cp core/server/config/env/config.production.json config.production.json
$ vi config.production.json

"url": "example.com",
"server": {
    "host": "0.0.0.0"
},
  • Run
NODE_ENV=production knex-migrator init
NODE_ENV=production node index.js

  • 포트 80 to 2368 연결해줄 웹서버 설정하기
$ sudo vi /etc/nginx/sites-available/ghost.conf

server {  
    listen 80;
    server_name example.com;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
    }
}

$ sudo ln -s /etc/nginx/sites-available/ghost.conf /etc/nginx/sites-enabled/ghost.conf
$ sudo service nginx restart
  • SSL 인증 적용하기

Letsencrypt 인증서 발급

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

$ ./letsencrypt-auto certonly --standalone -d <example.com>

인증키 저장 위치

  • 개인키: /etc/letsencrypt/live/<example.com>/privkey.pem
  • 인증키: /etc/letsencrypt/live/<example.com>/fullchain.pem

Nginx Configuration 파일 설정해주기

$ sudo vi /etc/nginx/sites-available/ghost.conf

server {
     listen 80;
+    listen 443 ssl;
     server_name example.com;
+    ssl_certificate       /etc/nginx/ssl/server.crt;
+    ssl_certificate_key   /etc/nginx/ssl/server.key;
     ...
     location / {
+       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+       proxy_set_header Host $http_host;
+       proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:2368;
        ...
     }
 }
 
 $ sudo service nginx restart

모든 리다이렉션에 대해 적용

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx 

$ sudo certbot --nginx
  • Email Setting (Gmail SMTP)
"mail": {  
        "service": "Gmail",
        "transport": "SMTP",
        "options": {
            "host": "smtp.gmail.com",
            "secureConnection": "true",
            "port": "465",
            "auth": {
                "user": "USERNAME",
                "pass": "PASSWORD"
            }
        }
}

2. 부가기능 설치

Ghost-s3-storage 세팅하기

블로그에 업로드한 이미지를 기존의 웹 어플리케이션이 아닌, AWS S3에 저장한 후 AWS를 이용하여 클라이언트에게 CDN으로 전송하도록 하였다.

장점

  1. Digital Ocean은 이미지를 로드하는게 느리고, 용량제한이 있음
  2. scalable하게 관리해주는 AWS S3가 활용도가 높을 것으로 예상됨 사실은 단지 AWS S3 서비스를 이용해보고 싶어서. 처음이라..
  3. 앞으로 MarkDown을 많이 사용하면서 빠르게 컨텐츠를 업로드할 에정이라, 파일들을 쉽게 웹링크로 관리할 필요가 있다고 판단.

Setting up the Bucket

버킷 생성 후, Permissions > Bucket Policy 에 아래 코드 삽입

{
  "Statement": [
    {
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
      "Sid": "AllowPublicRead"
    }
  ],
  "Version": "2008-10-17"
}

Setting up the user

AWS 유저 셋팅 페이지 (Identity and Access Management)로 이동

  • 새로운 유저 생성 후, Programmatic Access 부여
  • Attach existing policy directly > AmazonS3FullAccess
  • 생성 완료 후, Access key ID 와 Secret access key 복사

Integrating S3 and Ghost

npm install ghost-storage-adapter-s3
mkdir -p ./content/adapters/storage
cp -r ./node_modules/ghost-storage-adapter-s3 ./content/adapters/storage/s3
  • Configuration
"storage": {
  "active": "s3",
  "s3": {
    "accessKeyId": "YOUR_ACCESS_KEY_ID",
    "assetHost": "YOUR_OPTIONAL_CDN_URL",
    "bucket": "YOUR_BUCKET_NAME",
    "pathPrefix": "YOUR_OPTIONAL_BUCKET_SUBDIRECTORY",
    "region": "YOUR_REGION_SLUG",
    "secretAccessKey": "YOUR_SECRET_ACCESS_KEY",
    "endpoint": "YOUR_OPTIONAL_ENDPOINT_URL (only needed for 3rd party S3 providers)"
  }
}

GHOST_STORAGE_ADAPTER_S3_ASSET_HOST  // optional
GHOST_STORAGE_ADAPTER_S3_PATH_PREFIX // optional
GHOST_STORAGE_ADAPTER_S3_ENDPOINT // optional