ติดตั้ง Ghost ลงบน DigitalOcean ด้วย Docker
เริ่มต้นจากสร้าง Droplets
บน DigitalOcean มี Droplets หลายแบบมากให้เราเลือกใช้ แต่ในที่นี้เราจะขอใช้ Droplets เเค่เครื่องเดียว ไม่ได้ไปใช้พวก Kubernates อะไรแบบนั้น เหตุผลก็คือ มันจะทำให้ บทความนี้ยาวขึ้นไปอีกเยอะเลย
เริ่มกันเลย อย่างแยกคือ เราต้องมีรหัสเข้า DigitalOcean ก่อนนะครับ ใครยังไม่มีก็ไปสมัครก่อนนะ เเล้วค่อยกลับมาอ่านต่อ
เลือก Droplets ที่เราต้องการ ในที่นี้เราจะใช้ Docker เราจึงเลือกที่จะใช้ image ที่เขาทำไว้ให้เเล้ว โดยกดไปที่ Marketplace ตามภาพด้านล่าง
![Marketplace image](/img/1/Create-Droplets-DigitalOcean.png)
ต่อไปก็เกี่ยวกับเรื่องของเงินๆทองๆ ตัวนี้เป็นขนาดและสเปคเครื่องที่เราจะใช้งาน ถึงเเเม้ว่าจริงๆเเล้ว เราควรที่จะ เลือกให้มันเหมาะกับขนาดของผู้ใช้ ที่จะเข้ามาใช้งานในเว็บของเรา แต่ตอนนี้เอาตาม กำลังเงิน
ไปก่อน
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-2.png)
ยังไม่หมดนะ เลือกอีก อันนี้เป็นการเลือก Datacenter อธิบายอีกนิดหน่อย คือ จะให้สร้างเครื่องที่ประเทศไหน
จบ หลักการเลือกง่ายมากครับ เราต้องคำนึงถึงว่า คนที่น่าจะเข้าเว็บเรา เขาน่าจะอยู่ที่ประเทศไหนมากที่สุด เช่น เราอยากทำเว็บให้คนไทยใช้ เเต่ดันไปเลือก New York
อันนี้ก็ไกลไป เราก็เลยเลือกแถบๆบ้านเรา ใกล้สุดที่มีในนี้คือ Singapore
ใช่ไหม คิดว่าใช่นะ
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-3.png)
ยังมีอีก อันนี้เป็นส่วนของความปลอดภัย ในการที่เราจะเข้าไปคุมเครื่องของเราที่อยู่ไกลตั้ง Singapore
มันก็ต้องมีรหัสกันหน่อย ส่วนนี้มีให้ตั้งค่าสองแบบนะครับ คือ SSH กับ PASSWORD ซึ่งจริงๆเเล้วจะเเนะนำให้ใช้ SSH แต่หากว่าใครไม่สะดวก ก็ใช้อีกวิธีไปนะครับ
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-4.png)
การสร้าง SSH Key ก็ตามที่เขาบอกเลยครับ
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-5.png)
ส่วนใครจะใช้เป็นแบบ PASSWORD อันนี้ก็สะดวกหน่อย
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-6.png)
เลือกว่าเราอยากได้กี่เครื่อง แต่เราใช้เเค่เครื่องเดียวนะ เสร็จเเล้วก็กดสร้าง
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-7.png)
จบเเล้วครับ ได้ Cloud Server เป็นของตัวเองเเล้ว แต่เราต้องจด IP Address เอาไว้ด้วยนะเพราะเราจะใช้มันต่อไป ในที่นี้ของเราคือ 111.111.111.111
![Droplet choose](/img/1/Create-Droplets-DigitalOcean-8.png)
เตรียมเครื่องของเราให้พร้อม
ไม่ได้หมายถึงเครื่องที่เราใช้อยู่ตอนนี้นะ แต่หมายถึง 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
เราต้องใช้ทั้งสามตัวคือ
- Nginx ตัวนี้เราจะใช้สำหรับเป็น proxy
- Ghost ใช่ซิ เพราะเราจะใช้มัน
- 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 นะครับ
ถึงตรงนี้เราต้องหยุดก่อนครับ ไปต่อไม่ได้เเล้ว เราต้องทำการสมัคร cloudfare
![Google domains](/img/1/Google-Domains-4.png)
เข้าไปที่ cloudfare หลังจากลงทะเบียนเสร็จเเล้วก็ให้ Login เข้าไป เพื่อที่เราจะได้สร้าง site ใหม่
*** ซึ่งขั้นตอนการ เพิ่ม site อาจจะรอนานซักหน่อยกว่าทุกอย่างจะเเล้วเสร็จ แต่คิดว่าไม่น่าจะนานมากเพราะเราพึ่งจะจดโดนเมนมาใหม่ๆ เลย
หลังจาก เพิ่ม site เราจะได้ NS มาสองตัวซึ่งเราต้องนำสองค่านี้ไปกรอกในหน้าของ Google domain ที่เราค้างไว้ก่อนหน้านี้
![cloudfare](/img/1/cf-3.png)
จากนั้นทำการกำหนด DNS ให้ cloudfare รู้จัก server ของเรา โดนการกำหนด A record ตามภาพ
*** อย่าลืมเปลี่ยน 111.111.111.111 เป็น IP ของเครื่องเราเองนะครับ
![cloudfare](/img/1/cf-4.png)
จบจริงๆเเล้วครับ สามารถเข้าเว็บเเล้วลองเล่น Ghost ดูได้เลย
![cover](/img/1/cover.png)
บ๊ายบาย… ^__^ ติดขัดตรงไหน คอมเม้นไว้ด้านล่างเลย อาจจะตอบช้า แต่ก็ตอบนะ