ติดตั้ง Ghost ลงบน DigitalOcean ด้วย Docker

Posted on Nov 4, 2021

เริ่มต้นจากสร้าง Droplets

บน DigitalOcean มี Droplets หลายแบบมากให้เราเลือกใช้ แต่ในที่นี้เราจะขอใช้ Droplets เเค่เครื่องเดียว ไม่ได้ไปใช้พวก Kubernates อะไรแบบนั้น เหตุผลก็คือ มันจะทำให้ บทความนี้ยาวขึ้นไปอีกเยอะเลย

เริ่มกันเลย อย่างแยกคือ เราต้องมีรหัสเข้า DigitalOcean ก่อนนะครับ ใครยังไม่มีก็ไปสมัครก่อนนะ เเล้วค่อยกลับมาอ่านต่อ

เลือก Droplets ที่เราต้องการ ในที่นี้เราจะใช้ Docker เราจึงเลือกที่จะใช้ image ที่เขาทำไว้ให้เเล้ว โดยกดไปที่ Marketplace ตามภาพด้านล่าง

Marketplace image

ต่อไปก็เกี่ยวกับเรื่องของเงินๆทองๆ ตัวนี้เป็นขนาดและสเปคเครื่องที่เราจะใช้งาน ถึงเเเม้ว่าจริงๆเเล้ว เราควรที่จะ เลือกให้มันเหมาะกับขนาดของผู้ใช้ ที่จะเข้ามาใช้งานในเว็บของเรา แต่ตอนนี้เอาตาม กำลังเงิน ไปก่อน

Droplet choose

ยังไม่หมดนะ เลือกอีก อันนี้เป็นการเลือก Datacenter อธิบายอีกนิดหน่อย คือ จะให้สร้างเครื่องที่ประเทศไหน จบ หลักการเลือกง่ายมากครับ เราต้องคำนึงถึงว่า คนที่น่าจะเข้าเว็บเรา เขาน่าจะอยู่ที่ประเทศไหนมากที่สุด เช่น เราอยากทำเว็บให้คนไทยใช้ เเต่ดันไปเลือก New York อันนี้ก็ไกลไป เราก็เลยเลือกแถบๆบ้านเรา ใกล้สุดที่มีในนี้คือ Singapore ใช่ไหม คิดว่าใช่นะ

Droplet choose

ยังมีอีก อันนี้เป็นส่วนของความปลอดภัย ในการที่เราจะเข้าไปคุมเครื่องของเราที่อยู่ไกลตั้ง Singapore มันก็ต้องมีรหัสกันหน่อย ส่วนนี้มีให้ตั้งค่าสองแบบนะครับ คือ SSH กับ PASSWORD ซึ่งจริงๆเเล้วจะเเนะนำให้ใช้ SSH แต่หากว่าใครไม่สะดวก ก็ใช้อีกวิธีไปนะครับ

Droplet choose

การสร้าง SSH Key ก็ตามที่เขาบอกเลยครับ

Droplet choose

ส่วนใครจะใช้เป็นแบบ PASSWORD อันนี้ก็สะดวกหน่อย

Droplet choose

เลือกว่าเราอยากได้กี่เครื่อง แต่เราใช้เเค่เครื่องเดียวนะ เสร็จเเล้วก็กดสร้าง

Droplet choose

จบเเล้วครับ ได้ Cloud Server เป็นของตัวเองเเล้ว แต่เราต้องจด IP Address เอาไว้ด้วยนะเพราะเราจะใช้มันต่อไป ในที่นี้ของเราคือ 111.111.111.111

Droplet choose

เตรียมเครื่องของเราให้พร้อม

ไม่ได้หมายถึงเครื่องที่เราใช้อยู่ตอนนี้นะ แต่หมายถึง Droplets ที่เราพึ่งสร้างไปก่อนหน้า เหตุที่ต้องมีส่วนนี้ก็เพราะว่า เราอยากให้มันมีเองนั่นเเหละ ถึงแม้ว่ามันจะไม่ใช่ก็ตาม โดยทั่วไปเเล้ว เครื่องที่สร้างจาก DigitalOcean เขาจะไม่ได้สร้าง user มาให้เรานอกจาก root ไม่เป็นอะไร ไม่แคร์ สร้างเองก็ได้ เเล้วทำไมต้องสร้างล่ะ ???? ไปตามหาอ่านเองจาก Google เลยนะครับ หรือจะอ่านจากตรงนี้ก็ได้นะ

มาทำความรู้จักกับ Command su และ sudo ตอนที่ 1

SSH เข้าไปที่เครื่องที่เราพึ่งสร้างก่อนหน้า

*** สำหรับใครต้องไม่อยากใช้ root ก็ไปตามอ่านวิธีการสร้าง user ได้ครับ

ช้าก่อน เเล้วจะไปพิมพ์ที่ไหน สำหรับใครที่ใช้ Linux, MacOs อันนี้ก็เปิด Terminal ขึ้นมาเลยครับ ส่วนใครที่ใช้ Windows อันนี้อาจจะต้องติดตั้งโปรแกรมเพิ่มเติมเข้ามา ซึ่งก็มีให้เลือกค่อยข้างจะเยอะ มั้งนะ แต่เพื่อความง่าย เราจะเเนะนำให้ใช้ Git Bash

อัพเดทโปรแกรมให้ทันสมัยหน่อย

apt-get update

หลังจากสั่งเสร็จหน้าตาก็จะคล้ายๆแบบนี้

Hit:1 https://download.docker.com/linux/ubuntu focal InRelease
Get:2 http://mirrors.digitalocean.com/ubuntu focal InRelease [265 kB]
Get:3 http://mirrors.digitalocean.com/ubuntu focal-updates InRelease [114 kB]
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Get:5 http://mirrors.digitalocean.com/ubuntu focal-backports InRelease [101 kB]
Get:6 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:7 http://mirrors.digitalocean.com/ubuntu focal-updates/main amd64 c-n-f Metadata [14.4 kB]
Get:8 http://mirrors.digitalocean.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [580 B]
Fetched 608 kB in 1s (462 kB/s)
Reading package lists... Done

เป็นอันเสร็จสิ้นครับ นอกเหนือจากนี้อาจจะต้องไปถาม Google เอาเเล้วนะครับ

ติดตั้ง docker และ docker-compose

ง่ายมากครับ ในขั้นตอนนี้ เนื่องจากตอนสร้าง Droplets หากใครยังไม่ลืม เราได้เลือก Image จาก Marketplace ซึ่งภายในนั้นจะมี docker และ docker-compose มาให้เราเรียบร้อยเเล้ว จบครับ ไม่ต้องทำอะไร แต่ก็เช็คดูหน่อยดีกว่า

docker run hello-world

คาดหวังว่ามันจะได้แบบนี้นะครับ ใครไม่ได้คล้ายๆแบบนี้ ก็อีกครั้งครับ Google เลย

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

อีกอันที่เราต้องใช้ก็ docker-compose

docker-compose --help

ก็จะได้หน้าตาคล้ายๆแบบนี้

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file

เป็นอันเสร็จสิ้นครับในส่วนของการติดตั้ง docker และ docker-compose

ติดตั้ง nginx, ghost, mysql, จาก docker-compose

เราต้องใช้ทั้งสามตัวคือ

  1. Nginx ตัวนี้เราจะใช้สำหรับเป็น proxy
  2. Ghost ใช่ซิ เพราะเราจะใช้มัน
  3. Mysql เพราะ Ghost มันต้องใช้เราเลยต้องเอามาด้วย

เริ่มกันเลยดีกว่า

สร้าง Folder สำหรับเก็บเว็บไซต์ของเรา อันนี้ผมจะสร้างไว้ที่ /home/www/ghost

mkdir -p /home/www/ghost

จากนั้นทำการย้าย cursor ไปไว้ยัง path ที่เราพึ่งสร้าง

cd /home/www/ghost

สร้างไฟล์ docker-compose.yml

vim docker-compose.yml

นำข้อมูลด้านล่างนี้ไปใส่ ก็เป็นเรียบร้อยครับ

version: '3.1'
services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
  ghost:
    image: ghost:4-alpine
    restart: always
    volumes:
      - ./content:/var/lib/ghost/content
    environment:
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: secret
      database__connection__database: ghost
      url: http://DOMAIN
      NODE_ENV: production
      VIRTUAL_HOST: DOMAIN

  db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: secret

สำหรับใครที่ขี้เกียจพิมพ์ ผมได้เตรียมไว้นี้ไว้ให้เเล้ว

curl https://gist.githubusercontent.com/ChinnakornP/0803ae403b4f1d982a509253cce145b1/raw/fc715034f33e97b81f370116efe7f57e6288daa5/docker-compose.yml --output docker-compose.yml

*** สำคัญ คือ ต้องแก้ข้อมูลตรงส่วน DOMAIN ให้เป็นชื่อ domain ที่เราจะใช้งานจริงๆ เช่น abc.com

เรียบร้อยหมดทุกอย่างเเล้ว ต่อไปเราก็จะ start services ทั้งหมดในไฟล์ docker-compose ที่เราพึ่งเขียนไปทั้งหมดนั้นขึ้นมา แต่ว่ายังทำไม่ได้ ในไฟล์ .yml ของเรานั้นมีการ map volumn ออกมาข้างนอก container เราต้องสร้าง folder ให้มันซะก่อน

mkdir content

หลังจากนั้นก็ค่อย Start docker-compose

docker-compose up -d

รอมันรันไปจนเสร็จ หลังจากนั้นตรวจเช็คดูอีกทีว่า services ทุกตัวนั้น พร้อมทำงานหมดหรือยัง

docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS       PORTS                               NAMES
bd2196442b36   nginxproxy/nginx-proxy   "/app/docker-entrypo…"   6 hours ago   Up 6 hours   0.0.0.0:80->80/tcp, :::80->80/tcp   ghost_nginx-proxy_1
5aa1bc2354e9   ghost:4-alpine           "docker-entrypoint.s…"   6 hours ago   Up 6 hours   2368/tcp                            ghost_ghost_1
343ebe91a072   mysql:5.7                "docker-entrypoint.s…"   6 hours ago   Up 6 hours   3306/tcp, 33060/tcp                 ghost_db_1

ถ้าได้แบบนี้ก็จบเเล้วครับ สำหรับคนที่มีโดเมนอยู่เเล้วเพียงเเค่ กำหนดค่า A @ 111.111.111.111 ในส่วนของ dns ก็จะสารมารถเข้าเว็บได้เเล้ว

เเต่สำหรับคนที่ยังไม่มี DOMAIN เราได้เตรียม ส่วนต่อไปไว้ให้คุณเเล้ว

จดโดเมนกับ domains.google พร้อมย้าย dns ไปไว้กับ cloudfare

เข้าไปที่ domains.google หวังว่าคงมี Gmail นะครับ

Google domains Google domains Google domains Google domains

ถึงตรงนี้เราต้องหยุดก่อนครับ ไปต่อไม่ได้เเล้ว เราต้องทำการสมัคร cloudfare

Google domains

เข้าไปที่ cloudfare หลังจากลงทะเบียนเสร็จเเล้วก็ให้ Login เข้าไป เพื่อที่เราจะได้สร้าง site ใหม่

cloudfare cloudfare

*** ซึ่งขั้นตอนการ เพิ่ม site อาจจะรอนานซักหน่อยกว่าทุกอย่างจะเเล้วเสร็จ แต่คิดว่าไม่น่าจะนานมากเพราะเราพึ่งจะจดโดนเมนมาใหม่ๆ เลย

หลังจาก เพิ่ม site เราจะได้ NS มาสองตัวซึ่งเราต้องนำสองค่านี้ไปกรอกในหน้าของ Google domain ที่เราค้างไว้ก่อนหน้านี้

cloudfare

จากนั้นทำการกำหนด DNS ให้ cloudfare รู้จัก server ของเรา โดนการกำหนด A record ตามภาพ

*** อย่าลืมเปลี่ยน 111.111.111.111 เป็น IP ของเครื่องเราเองนะครับ

cloudfare

จบจริงๆเเล้วครับ สามารถเข้าเว็บเเล้วลองเล่น Ghost ดูได้เลย

cover

บ๊ายบาย… ^__^ ติดขัดตรงไหน คอมเม้นไว้ด้านล่างเลย อาจจะตอบช้า แต่ก็ตอบนะ