Pattapong J.
NoteWise
Published in
5 min readOct 30, 2015

--

Ghost Blog ตัวใหม่ที่กำลังมาแรง ด้วยแนวทางที่แตกต่างจาก wordpress ที่นับวันยิ่งมี feature เยอะมากขึ้นเรื่อยๆ ghost เลยออกมาเพื่อกลับไปเน้นที่การเป็นเพียง Blog เท่านั้น

สิ่งที่ต้องเตรียม

  • DigitalOcean droplet ขนาดที่เหมาะสม (ถ้าคาดว่าคนเข้าไม่เยอะก็ใช้ตัวเล็กสุด 5$ ก็เพียงพอในการทำงานแล้ว) และเลือก Image เป็น Ubuntu 14.04 64bit
  • ไฟล์ติดตั้งของ ghost : ถ้าเข้าไปดูในหน้าเว็บอาจจะไม่เห็นว่าจะดาวน์โหลดได้ตรงไหน วิธีการคือจำเป็นที่จะต้องสมัครสมาชิกและ login เข้าไปก่อนครับ แล้วจะมี link ให้ดาวน์โหลดโผล่ขึ้นมา หน้าตาแบบนี้ครับ
หน้า download ของ ghost

หรือข้ามไปเองโดยไปที่หน้า https://ghost.org/download/

วิธีติดตั้ง

ในขั้นตอนการลง เนื่องจาก Ghost ทำงานอยู่บน Node.js เพราะฉะนั้นเราจึงต้องมีการติดตั้ง nodejs ก่อนเพื่อที่จะรัน code ของ ghost ได้ และโดยปกติการใช้งาน nodejs เป็น server เรามักจะใช้รันเป็น app instance หลังบ้าน แล้วสร้าง webserver เช่น apache หรือ nginx มาเป็นตัว proxy คอยรับ traffic ที่เข้ามา

การ config เลยจะมีสองส่วนคือ ติดตั้งและรัน ghost และอีกส่วนคือการตั้งค่า nginx ให้เรียกใช้ ghost ได้

ติดตั้ง nodejs และ npm

เมื่อ login เข้าไปแล้วอันดับแรกก็ทำการอัพเดท package ของ ubuntu กันก่อน และลง package เพื่อการ build nodejs

apt-get update
apt-get upgrade
apt-get install -y build-essential openssl libssl-dev pkg-config

ในส่วนของ version ของ nodejs ที่จะติดตั้งนั้น ตาม doc ของ ghost เขียนไว้ว่า Ghost requires Node.js 0.10.x (not 0.12.x). We recommend Node.js 0.10.36 & npm 2.5.0. แต่เนื่องจากบทความนี้ค่อนข้างจะเก่าแล้ว (ตั้งแต่ปี 2014) และตอนนี้ nodejs ก็ปรับ v0.12 ขึ้นมาเป็น version stable แล้ว เราเลยจะติดตั้ง node v0.12 และ npm v2.9 ไปเลยนะครับ แต่เนื่องจากทาง ghost ไม่แนะนำ เพราะฉะนั้นหากใช้แล้วเกิดปัญหา ก็ลองลงเป็น v0.10 แทนนะครับ

ต่อไปก็ทำการ download node source code มาเพื่อติดตั้ง และทำการ extract ไว้

cd ~
wget http://nodejs.org/dist/v0.12.3/node-v0.12.3.tar.gz
tar xvf node-v*
cd node-v*

จากนั้นก็ทำการ make แล้วก็ติดตั้ง

./configure
make
make install

เท่านี้ก็ติดตั้งเสร็จเรียบร้อย ทดสอบโดยการรันคำสั่งเพื่อดู version

node -v
# v0.12.3
npm -v
# 2.9.1

ติดตั้ง Ghost

เริ่มต้นด้วยการ download ghost มาและ extract ไว้ใน folder ที่เราตั้งใจจะให้เป็น ที่เก็บข้อมูลของ ghost

# เผื่อใครยังไม่มี unzip ก็ต้องทำการลงก่อน
apt-get install -y unzip
# จากนั้นสร้าง folder ที่เราจะเอา ghost ไปวาง
mkdir -p /webapp/ghost
cd /webapp/ghost
wget https://ghost.org/zip/ghost-0.6.4.zip
unzip ghost-0.6.4.zip
rm -f ghost-0.6.4.zip

ตอนนี้เราจะได้ folder ที่มีข้อมูลพร้อมใช้แล้ว ในนั้นจะมี file package.json อยู่ด้วย ซึ่งเราสามารถใช้เช็คได้ว่า ไฟล์ใน folder นี้ของเราเป็น ghost verion ไหน โดยคำสั่ง

more package.json
# {
# "name": "ghost",
# "version": "0.6.4",
# "description": "Just a blogging platform.",
# ...

ต่อไปก็เป็นการลง package ของ nodejs ที่จำเป็นสำหรับ ghost ด้วยการรันคำสั่ง

npm install --production

ต่อไปคือในส่วนของ config file ใน folder ghost ที่ให้มา จะมีตัวอย่างของไฟล์ config มาให้ด้วย เราสามารถนำมาใช้ได้เลยโดยการสั่ง

cp config.example.js config.js 
vim config.js

ในส่วนของเนื้อหาการ config สามารถดูรายละเอียดได้ใน Configuring Ghost ในตัวอย่างไฟล์ ก็จะมีรายละเอียดเบื้องต้นมาให้ด้วย ซึ่งจะมี 3 ค่าที่เราต้องให้ความสนใจคือ

  1. URL : เป็นค่าที่ ghost จะใช้ในการระบุชื่อ url ทั้งหมดในเว็บเรา
  2. database : เพื่อระบุ database engine ที่ใช้และเงื่อนไขในการเข้าใช้งานต่างๆ
  3. mail : เพื่อให้ระบบสามารถส่งเมล์หรือแจ้งเตือนต่างๆมายังเราได้

ในไฟล์ config.js ที่เราพึ่งสร้างขึ้นจะมีตัวอย่าง การ config เพื่อต่อ database แบบต่างๆ และ config สำหรับ production และ development อยู่ซึ่งโดย default ทั้งคู่จะเก็บข้อมูลลงใน sqlite3 และไม่มีการ config email ไว้ ตรงนี้เราสามารถ config เพื่อใช้กับ email และ database service ที่เราต้องการได้เลย

ตัวอย่างเช่น หากเราต้องการให้ production ใช้ database เป็น postgresql และใช้ email ของ mandrillapp จะได้ config ดังนี้

....
production: {
url: 'http://<YOUR WEB SITE>',
mail: {
transport: 'SMTP',
host: 'smtp.mandrill.org',
options: {
service: 'Mandrill',
auth: {
user: '<USERNAME>',
pass: '<MANDRILL KEY>'
},
},
},
database: {
client: 'pg',
connection: {
host : '127.0.0.1',
user : '<USERNAME>',
password : '<PASSWORD>',
database : '<DB NAME>',
charset : 'utf8'
},
debug: false
},

server: {
// Host to be passed to node's `net.Server#listen()`
host: '127.0.0.1',
// Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
port: '2368'
}
},
...

ถึงตรงนี้ถ้าไม่ติดอะไร เราจะสามารถทดลองรัน server ได้โดย

npm start

แล้วจะได้ผลัพธ์เป็น

> ghost@0.6.4 start /webapp/ghost
> node index

Migrations: Database initialisation required for version 003
Migrations: Creating tables...
Migrations: Creating table: posts
Migrations: Creating table: users
Migrations: Creating table: roles
Migrations: Creating table: roles_users
Migrations: Creating table: permissions
Migrations: Creating table: permissions_users
Migrations: Creating table: permissions_roles
Migrations: Creating table: permissions_apps
Migrations: Creating table: settings
Migrations: Creating table: tags
Migrations: Creating table: posts_tags
Migrations: Creating table: apps
Migrations: Creating table: app_settings
Migrations: Creating table: app_fields
Migrations: Creating table: clients
Migrations: Creating table: accesstokens
Migrations: Creating table: refreshtokens
Migrations: Populating fixtures
Migrations: Populating permissions
Migrations: Creating owner
Migrations: Populating default settings
Migrations: Complete
Ghost is running in development...
Listening on 127.0.0.1:2368
Url configured as: http://localhost:2368
Ctrl+C to shut down

ถ้าสังเกตจะเห็นว่าการรันคำสั่งนี้ จะทำการสร้างฐานข้อมูลขึ้นมา แต่ จะเป็นฐานข้อมูลที่ใช้สำหรับ development เท่านั้น ตัวฐานข้อมูลที่ใช้ในขั้นนี้ก็จะเป็น sqlite3 จึงไม่เหมาะที่จะนำไปใช้จริง ซึ่งเดี๋ยวเราะจะพูดถึงอีกทีในตอนการ config แต่ก่อนที่จะไปถึงจุดนั้น เราจะทำการ setup nginx ขึ้นมาก่อน

ในส่วนของตัว test ที่ได้เปิดขึ้นมาสามารถหยุดการทำงานได้โดย กด Ctrl+C เพื่อกลับมาที่ terminal

การตั้งค่า nginx เพื่อเป็น proxy

ถ้าหากยังไม่ได้ติดตั้ง nginx ก็ทำการติดตั้งด้วยคำสั่ง

apt-get install nginx

หลังจากทำการติดตั้งเสร็จ จะมี web server default ให้ 1 อัน โดยสามารถตรวจสอบได้โดยลองเข้าไปที่ http://<server-ip> จะเจอหน้าข้อมูล welcome

สิ่งที่เราต้องทำคือลบ config default ตัวนี้ทิ้งไปและสร้าง config ใหม่เพื่อให้ทำการแสดงผลข้อมูลจาด ghost server ที่เราได้สร้างขึ้น

cd /etc/nginx/
rm -f sites-enabled/default
cd sites-available
vim ghost

เราจะสร้าง file config สำหรับเป็น proxy ให้ process ที่รัน ghost ที่ port 2368 แสดงผลข้อมูลผ่านทาง port 80 ของเว็บ server ตามชื่อที่กำหนด โดยมีรายละเอียดดังนี้

upstream ghost_app_server {
server 127.0.0.1:2368 fail_timeout=0;
}

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.html index.htm;

client_max_body_size 4G;
server_name _; # ใช้ _ หมายถึงว่า เป็นชื่อเว็บอะไรก็ได้

keepalive_timeout 5;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://ghost_app_server;
}
}

เมื่อทำการ save เสร็จ ต่อไปคือต้องย้าย config นี้ไปไว้ใน folder site-enables เพิ่มเริ่มใช้งาน

ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

เนื่องจากก่อนหน้านี้เราได้ยกเลิกการทำงานของ ghost ที่เป็น development ไป เพราะฉะนั้นถ้าเราทำการ restart nginx ตอนนี้ ก็จะเจอกับ error นะครับ

ตั้งค่า upstart เพื่อจัดการกับ ghost service

เพื่อให้ ghost app ของเราเริ่มทำงานโดยอัตโนมัติ และสามารถสั่ง start stop restart ได้โดยง่าย เลยเลือกใช้ upstart ที่มากับ ubuntu อยู่แล้ว และใช้ง่ายมากเพื่อเป็นตัวช่วยในการจัดการในส่วนนี้นะครับ

โดยวิธีการตั้งค่าคือ สร้าง file config ขึ้นมาใน folder /etc/init

vim /etc/init/ghost.conf

ในส่วนของชื่อไฟล์ตรงนี้สำคัญมาก เพราะจะเป็นชื่อที่เราใช้ในการเรียก start/stop service นะครับ เช่น ถ้าเราตั้งชื่อไฟล์ว่า abc.conf เวลาเรียก start service ก็จะใช้คำสั่ง service abc start หรือหยุดด้วยคำสั่ง service abc stop ซึ่งในกรณีนี้เราใช้ ชื่อ ghost เพื่อให้จำง่ายว่านี่คือ ghost app

ซึ่งตัวไฟล์มีรายละเอียดดังนี้

start on startup

script
cd /webapp/ghost
npm start --production >> /var/log/ghost.log 2>&1
end script

สิ่งที่เราสั่งไปคือ

  • ให้เรียก script นี้ start ตอนที่ระบบเริ่ม
  • ตอนเริ่มการทำงานให้ทำงานโดย
  1. ไปที่ folder /webapp/ghost
  2. สั่ง npm start — production คำสั่งนี้จะทำให้เป็นการเรียก config ในส่วนของ production มาใช้งาน และให้ส่งผลลัพธ์การทำงานทั้งหมดไปเขียนใน log ชื่อ /var/log/ghost.log

ตอนนี้ทุกอย่างก็พร้อมใช้งานแล้ว เราสามารถเริ่มการทำงานของระบบได้โดย

service ghost start
service nginx restart

ตอนนี้ก็จะได้ ghost พร้อมใช้งานแล้วครับ!

เพิ่มเติม

หลังจากที่ใช้ upstart มาซักพัก กลายเป็นว่าเหมือนกับ service มัน expire เองถ้าไม่มีการเรียกนานๆ นะครับ แล้ว service ก็ไม่ยอม start กลับขึ้นมาใหม่ เลยเปลี่ยนมาใช้วิธีอื่นแทน ตามใน doc ของ ghost เรื่อง deployment มีเขียนถึงการทางเลือกในการทำให้ service รันอยู่ตลอดเวลาไว้

เช่น

ใช้ Forever (https://npmjs.org/package/forever)

You can use forever to run Ghost as a background task. forever will also take care of your Ghost installation and it will restart the node process if it crashes.

  • To install forever type npm install forever -g
  • To start Ghost using forever from the Ghost installation directory type NODE_ENV=production forever start index.js
  • To stop Ghost type forever stop index.js
  • To check if Ghost is currently running type forever list

สิ่งที่น่าสนใจ

  • หลังจากติดตั้ง ghost เสร็จแล้ว จึงค่อยเห็นว่า =มันไม่มีระบบ comment= ครับ หลังจากที่ลองหาข้อมูลดูเลยพบว่า เค้า design ให้เป็นอย่างนี้แหละ เพราะระบบ comment หรือ discuss เดี๋ยวนี้นั้นมีให้บริการอยู่มาก และใช้ง่ายกว่า ไม่ต้องไปต่อสู้กับ spam เอง หรือไม่ต้องเสียเวลาให้ user ทำการ register เช่น facebook comment หรือ disqus
  • การเขียนบทความใน ghost ใช้ markdown ทีแรกก็สงสัยเหมือนกันว่าทำไมไม่ใช้ WYSIWYG ไปเลย แต่พอมาลองเขียนดูจริง ๆ ก็สนุกและง่ายดีเหมือนกัน เขียนได้ง่ายกว่าเร็วกว่า wordpress อีก
  • ถ้าต้องการในเรื่องความปลอดภัยของ server เข้าไปด้วย ลองอ่านเพิ่มที่นี่ Installing Ghost on Ubuntu, Nginx and MySQL by 0v.org

--

--