Deploy แอพ Rails 6 บน Digital Ocean ตอนที่ 1 - สร้าง Droplets, SSH, ติดตั้ง Ruby และ PostgreSQL

เมื่อเราพัฒนาแอพ Rails บนเครื่อง local เสร็จแล้วและต้องการที่จะ deploy แอพของเราเพื่อให้ผู้ใช้หรือลูกค้าเข้ามาใช้จากโลกภายนอก (production) การใช้ VPS (Virtual Private Server) สำหรับรันเว็บแอพก็เป็นทางเลือกหนึ่งที่น่าสนใจสำหรับ Rails ทั้งในส่วนของราคาที่ไม่สูงมาก ถึงแม้ว่าขั้นตอนในการ setup ติดตั้งและ maintain อาจจะเยอะซักหน่อยแต่ก็ไม่ถือว่ายากเกินไป

ในโพสนี้ผมจะอธิบายขั้นตอนในการ Deploy แอพ Rails 6 บน Digital Ocean โดย Digital Ocean เป็น Cloud VPS ที่ราคาไม่แรงมาก มีความเสถียรที่ดี ใช้งานง่ายสามารถใช้งานผ่าน web console ได้เลยเวลามีปัญหา Digital Ocean จะมีโปรโมชั่นอยู่เป็นช่วงๆ แต่ถ้าคุณขี้เกียจรอช่วงโปรฯ ก็สามารถสมัครใช้งานผ่าน referral link ของผมตรงนี้ ได้เลย เมื่อเข้าไปที่ลิ้งแล้วกด Sign Up คุณจะได้รับ Credit $50 สำหรับ 30 วัน เมื่อสมัครเข้าใช้งาน

สำหรับเนื้อหาของการ Deploy แอพ Rails 6 บน Digital Ocean ในโพสนี้จะแบ่งเป็น 2 ตอน โดยเนื้อหาในตอนแรกจะประกอบด้วย -การสร้าง Droplet หรือ VPS บน Digital Ocean ทำการ intialize VPS, สร้าง user ที่จำเป็นต้องใช้และกำหนด SSH key เพื่อให้เครื่อง local สามารถติดต่อเข้ามาที่ VPS ได้ด้วยการ ssh ผ่านคอนโซล

  • ติดตั้ง RVM ใช้เป็น Ruby version manager เราจะดาวโหลดและติดตั้ง Ruby เวอร์ชั่น 2.5.5 โดยใช้ RVM
  • ติดตั้ง Node.js เป็น javascript runtime ซึ่งแอพ Ruby On Rails ของเราจำเป็นต้องใช้
  • ติดตั้ง Yarn เป็น javascript package manager ซึ่งแอพ Rails 6 ของเราจะใช้ในการติดตั้งไลบรารี่ javascript
  • ติดตั้ง PostgreSQL ใช้เป็นฐานข้อมูลแทน SQLite3

และตอนที่ 2 สำหรับขั้นตอนต่อไปนี้

  • เตรียม Rails 6 แอพลิเคชั่น ให้พร้อมสำหรับการ deploy
  • ติดตั้ง Phusion Passenger เป็น application server ที่ใช้ติดต่อระหว่างแอพ Rails ของเราและ web server
  • ติดตั้ง Nginx ใช้เป็น web server ทำหน้าที่รับส่ง HTTP request จาก application server ไปยังเว็บเบราเซอร์ และจัดการกับ domain name
  • ติดตั้ง Capistrano ใช้สำหรับทำ automatic deployment

สร้าง Digital Ocean account และสร้าง Droplet

Droplets เป็นชื่อที่ Digital Ocean ใช้เรียกแทน Virtual Machine ของตัวเอง มองง่ายๆ ว่า Droplets 1 ชุด จะเปรียบเสมือน VPS 1 ตัว เราสามารถกำหนดได้ว่า Droplets (VPS) ที่จะสร้างขึ้นมาใช้นั้น มี CPU ขนาดเท่าไหร่ RAM เท่าไหร่ และมีพื้นที่เก็บข้อมูลแบบไหนขนาดเท่าไหร่เป็นต้น โดย Digital Ocean จะคิดราคาค่าบริการเป็นรายเดือน จ่ายมากน้อยตามปริมาณขนาดของ Droplet ที่เราเลือกใช้ ซึ่งเราจะต้องระบุด้วยว่า Droplets ที่สร้างขึ้นมานั้นใช้ระบบปฏิบัติการตัวไหน

สมมติว่าคุณทำการ Sign up เรียบร้อยแล้ว ให้ไปที่หน้า Dashboard คลิ๊ก ที่เมนู Droplets ด้านซ้ายมือ แล้วกด “Create Droplet” หรือกดปุ่ม Create ด้านขวาบนแล้วเลือก Droplets เข้ามาที่หน้า Dashboard แล้วสร้าง Droplets

จากนั้นเลือกระบบปฏิบัติการ(Image) ในที่นี้ผมขอใช้ CentOS เพราะความคุ้นเคยส่วนตัว ต่อมาทำการเลือก plan หรือขนาดของ Virtual machine ที่เราต้องการ ซึ่งจะมีราคากำกับบอกอยู่ว่าแต่ละขนาดมีค่าใช้จ่ายเท่าไหร่ สำหรับแอพ Rails ตัวที่ผมจะทดลองทำในโพสนี้ ไม่ได้ต้องการทรัพยากรอะไรมาก ดังนั้นผมขอเลือกเป็น plan ขั้นต่ำสุด เพื่อความประหยัด คือ CPU 1GB, SSD disk 25GB, transfer 1000GB ตกอยู่ที่ 5$/mo เลือก OS platform และ plan ของ digital ocean

ส่วนถัดมาจะเป็นการเพิ่ม backup หรือ block storage ซึ่งเราไม่ได้มีความต้องการในตอนนี้ก็จะข้ามไป ต่อมาทำการเลือก region สำหรับ datacenter ผมขอเลือก region ที่ใกล้บ้านเราสุดซึ่งได้แก่สิงคโปร์ เลือก region ของ digital ocean data center

ต่อมาจะเป็นส่วนของการเพิ่ม SSH keys ซึ่งเราจะทำการเพิ่มทีหลัง ตอนนี้ข้ามไปก่อน ส่วนสุดท้ายจะถามว่าเราต้องการสร้าง Droplets ที่มีค่าตั้งต้นตามที่เรากำหมดเมื่อกี้กี่ชุด และให้เราตั้งชื่อ Hostname ของ image ในที่นี้เราใช้ droplet แค่ 1 ชุด ส่วน hostname คุณจะตั้วชื่อใหม่หรือใช้ชื่อสุ่มตามค่าตั้งต้นก็ได้ ในที่นี้ผมขอใส่ชื่อเป็น devwoot-rails-showcase ใส่จำนวนและชื่อของ droplet

จากนั้นกดปุ่ม Create สีเขียว ระบบจะทำการสร้าง Droplets ให้ พอสร้างเสร็จแล้วหน้า Dashboard เราจะโชว์สถานะของ droplets ขึ้นมาประมาณ พร้อมกับหมายเลข IP ของ droplets (VPS) ตัวนี้ ซึ่งเราจะใช้ IP นี้ในการ login ด้วย SSH จากเครื่อง local และทำการเซตค่าโดเมนเนมของเราในตอนต่อไป หน้า dashboard หลังจากสร้าง digital ocean droplet แล้ว

Initial server setup

Droplets ที่เราสร้างในขั้นตอนที่แล้วจะเปรียบเสมือนกับ VPS ที่มีเพียงแค่ระบบปฏิบัติการ Linux ที่เราเลือกไว้ (ในที่นี้คือ CentOS) ลงไว้ให้เรียบร้อยแค่นั้น เราจะต้องทำการลง Ruby และแพกเกจอื่นๆ ที่จำเป็นในการทำโปรเจคนี้เอง ซึ่งเราจะทำได้โดยการรีโมตเข้าไปที่ Droplets (VPS) ตาม IP ที่เราได้รับมาในขั้นตอนที่แล้วด้วยสิ่งที่เรียกว่า SSH

Note: Digital Ocean จะส่งพาสเวิร์ดของ root มาให้เราทางอีเมลที่เราใช้ตอนสมัคร account ซึ่งเราสามารถใช้ user root และ password เพื่อ login เข้าไปที่หน้าคอนโซลของ Droplet ได้ ผ่านทาง web console ของ Digital Ocean หรือทาง ssh ก็ได้

เพื่อความรวดเร็ว ผมขออนุญาตสมมุติว่าคุณมีและสามารถใช้ ssh ได้จากเครื่อง local แล้วนะครับ (สำหรับท่านที่ลง Ruby บน Windows ด้วย RubyInstaller บนเครื่อง local ของท่าน จะสามารถใช้คำสั่ง ssh ได้จาก command line อยู่แล้ว เนื่องจาก ssh จะติดมากับ MSYS2 และถูกลงเรียบร้อยไป พร้อมกับ Ruby แล้ว)

เปิด command windows ขึ้นมา แล้วพิมพ์คำสั่งด้านล่าง เพื่อลองติดต่อเข้าไปยัง droplet

$ ssh root@<ip-address-ของ-droplet-ของคุณ>

ให้เรา copy พาสเวิร์ดที่ได้รับมาจากอีเมลแล้ว ใส่ลงไป ก็จะสามารถ login เข้ามาที่คอนโซลของ Droplet ได้ ซึ่งเราจะถูกสั่งให้เปลี่ยนพาสเวิร์ดก็เปลี่ยนให้เรียบร้อย

อย่างไรก็ตามเราจะสงวน user root เก็บเอาไว้ และจะสร้าง user ขึ้นมาใช้งานแทนซึ่งได้แก่ user devwoot โดยกำหนดสิทธิให้เป็น super user (su) และทำหน้าที่เป็น admin ส่วนอีก user นึงคือ memberwoot ซึ่ง user นี้จะใช้สำหรับ deploy แอพและมีชื่อเดียวกับแอพที่เราจะสร้างต่อไป

setup admin user devwoot

สมมติว่าเรายังคง login ด้วย root อยู่ ให้พิมพ์คำสั่งด้านล่างเพื่อสร้าง user ชื่อ devwoot และกำหนดสิทธิ sudo (administrative privileges) ให้กับ devwoot

[root@devwoot-rails-showcase ~]# adduser devwoot
[root@devwoot-rails-showcase ~]# passwd devwoot
[root@devwoot-rails-showcase ~]# usermod -aG wheel devwoot
[root@devwoot-rails-showcase ~]# visudo

พอเปิดไฟล์ visudo ขึ้นมาแล้ว ให้หาบรรทัดที่มีข้อความ ## Same thing without a password แล้ว เพิ่มบรรทัดด้านล่างลงไป หน้าตาประมาณนี้

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
devwoot ALL=(ALL)       NOPASSWD: ALL

setup SSH ให้กับ devwoot

[root@devwoot-rails-showcase ~]# mkdir -p ~devwoot/.ssh
[root@devwoot-rails-showcase ~]# touch ~devwoot/.ssh/authorized_keys

จากนั้นให้ copy เนื้อหาในไฟล์ SSH public key จากเครื่อง local ซึ่งอยู่ที่ c:\users\username.ssh ของผมจะชื่อ id_digitalocean_devwoot.pub ส่วนของคุณอาจจะชื่อ id_rsa.pub แต่ถ้าคุณยังไม่มี SSH key ก็ให้สร้างมันขึ้นมาโดยใช้คำสั่ง

$ ssh-keygen

จากนั้นตั้งชื่อของ key file ในขั้นตอนนี้คุณสามารถกด enter ไปเฉยๆ ได้เลย โดยkey file จะถูกตั้งชื่อเป็นค่าตั้งต้นว่า id_rsa และถูกเซฟเก็บไว้ที่โฟลเดอร์ .ssh ของ user path โดยอัตโนมัติ แต่เนื่องจากผมมี key file ที่ชื่อ id_rsa ซึ่งถูกใช้กับโปรเจคอื่นอยู่แล้วดังนั้นผมขอตั้งชื่อเป็น key file ที่จะใช้ในที่นี้เป็น id_digitalocean_devwoot พอกด enter เราจะถูกถามให้ใส่ passphrase ตรงนี้ผมแนะนำให้เรากด enter ไปเลย นั้นคือไม่มี passphrase ซึ่งทำให้เราไม่ต้องกรอก passpharse ทุกครั้งตอนที่เราใช้ ssh จริงๆ แต่ถ้าใครอยากตั้ง passphrase อันนี้ก็ตามที่สะดวกได้เลยครับ จากนั้นกด enter อีกครั้งเพื่อคอนเฟิร์มว่าเราไม่ต้องการตั้ง passphrase ซึ่งเราจะได้ผลลัพธ์หน้าตาประมาณนี้ และจะได้ไฟล์ออกมาสองไฟล์คือ id_digitalocean_devwoot และ id_digitalocean_devwoot.pub (ถ้าคุณไม่ได้ระบุชื่อของไฟล์ตั้งแต่ตอนสร้าง ไฟล์ที่ได้ของคุณก็จะเป็น id_rsa และ id_rsa.pub) สร้าง SSH key โดยใช้คำสั่ง ssh-keygen

จากนั้นรันคำสั่ง

[root@devwoot-rails-showcase ~]# vi ~devwoot/.ssh/authorized_keys

แล้ว paste ข้อมูลที่ copy ลงไปในไฟล์นี้ (กด i เพื่อเข้าสู่ insert mode ของ vi ก่อน) พอวางเสร็จแล้วให้กด :wq เพื่อ save และออกจาก vi

กำหนด permission ให้กับโฟลเดอร์ .ssh และไฟล์ที่อยู่ข้างในด้วยการรันคำสั่งต่อไปนี้

[root@devwoot-rails-showcase ~]# chown -R devwoot: ~devwoot/.ssh
[root@devwoot-rails-showcase ~]# chmod 700 ~devwoot/.ssh
[root@devwoot-rails-showcase ~]# sh -c "chmod 600 ~devwoot/.ssh/*"

จากนั้นเพิ่มชื่อของ user ที่มีสิทธิในการรันและ access เข้ามาด้วย ssh ในไฟล์ sshd_config โดยรันคำสั่งต่อไปนี้

[root@devwoot-rails-showcase ~]# vi sshd_config

พอเปิดไฟล์ขึ้นมาแล้วให้ไปที่บรรทัดสุดท้ายของไฟล์ (กด G) แล้วเพิ่มบรรทัดด้านล่างลงไป (กด a เพื่อเข้าสู่ insert mode) เสร็จแล้วออกจาก insert mode โดยการกด esc แล้ว save และออกจากไฟล์ (กด :wq)

AllowUsers devwoot

เสร็จแล้วให้ logout ออกจาก root ของ SSH โดยใช้คำสั่ง exit แล้วทำการ ssh เข้ามาใหม่ด้วยคำสั่งด้านล่าง

$ ssh devwoot@devwoot-rails-showcase

เราจะเห็นว่าเราสามารถเข้ามาที่คอนโซล [devwoot@devwoot-rails-showcase ~] ได้เลยโดยที่ไม่ต้องป้อนพาสเวิร์ดอีก ซึ่ง devwoot จะมีสิทธิ sudo ตามที่เราได้กำหนดให้ไปก่อนหน้านี้ เพื่อทดสอบว่า devwoot มีสิทธิ sudo จริงๆ ให้ลองรันคำสั่ง sudo -v เราจะเห็นข้อความแจ้งจากการใช้ sudo ครั้งแรกและมีการถามพาสเวิร์ดของ devwoot ด้วยก็ให้ใส่พาสเวิร์ดลงไป (ถามแค่ตอนใช้ sudo ครั้งแรกครั้งเดียว)

Note สำหรับคนที่มี SSH key หลายไฟล์ ในการใช้ ssh แต่ละครั้งจึงต้องบอกให้ ssh รู้ด้วยว่าจะติดต่อด้วย key ไฟล์อันไหน โดยระบุด้วยอ็อบชั่น -i แล้วตามด้วยชื่อไฟล์เช่น $ ssh -i ~/.ssh/id_rsa username@server.com ซึ่งคำสั่งก็จะยาวและเราอาจจำไม่ได้ว่าเราใช้ key ไหนกับที่ไหน ปัญหานี้สามารถแก้ได้โดยใช้ไฟล์ config วิธีการคือ ไปที่ไดเรกทอรี่ c:\users\myusername.ssh ของเครื่อง local สร้างไฟล์ชื่อ config (พิมพ์ touch config ใน command windows) แล้วใส่ค่าคอนฟิกด้านล่างลงไป

Host devwoot-rails-showcase
 Hostname 128.199.199.49
 IdentityFile ~/.ssh/id_digitalocean_devwoot

เสร็จแล้วเวลาที่เราจะ ssh ก็เพียงแค่ระบุแค่ค่าของ Host เท่านั้น ssh จะรู้เองว่าถ้าจะติดต่อกับ Host จะต้องใช้ Hostname อะไร และหยิบ Key ไฟล์ (IdentifyKey) ไฟล์ไหนมาใช้อ้างอิง ดังนั้นผมจะ ssh เข้าไปที่ droplet โดยพิมพ์

$ ssh root@devwoot-rails-showcase

สร้าง user memberwoot และ setup SSH

ในโพสซีรี่นี้เราจะสร้างแอพ Rails เพื่อทดลอง deploy เป็นแอพชื่อ memberwoot (ลอง clone มาเล่นดูก่อนได้ที่ Github repository ของ memberwoot เราจะใช้โอกาสนี้สร้าง user ที่มีชื่อเดียวกับแอพคือ user memberwoot เพื่อเตรียมไว้ใช้ในการ deploy แอพในตอนต่อไป

หากคุณต้องการลอง deploy ด้วย Rails แอพที่คุณมีอยู่แล้วหรือแอพอื่นที่ไม่ใช้ memberwoot เหมือนในตัวอย่าง ให้คุณเปลี่ยนชื่อ user ที่จะสร้างไปเป็นชื่อเดียวกับแอพที่คุณใช่แทนเช่น myapp เป็นต้น

สมมติว่าเราล็อกเอ้าออกจาก server ไปแล้ว ให้ ssh เข้ามาที่ droplet ด้วย user devwoot โดยใช้คำสั่ง

$ ssh devoot@devwoot-rails-showcase

เราจะสร้าง user memberwoot และทำการ copy ssh key ไฟล์ และกำหนด permission ให้กับโฟลเดอร์ .ssh และไฟล์ authorized_keys ดังนี้

[devwoot@devwoot-rails-showcase ~]$ sudo adduser memberwoot
[devwoot@devwoot-rails-showcase ~]$ sudo passwd memberwoot
[devwoot@devwoot-rails-showcase ~]$ sudo mkdir -p ~memberwoot/.ssh
[devwoot@devwoot-rails-showcase ~]$ sudo sh -c "cat $HOME/.ssh/authorized_keys >> ~memberwoot/.ssh/authorized_keys"
[devwoot@devwoot-rails-showcase ~]$ sudo chown -R memberwoot: ~memberwoot/.ssh
[devwoot@devwoot-rails-showcase ~]$ sudo chmod 700 ~memberwoot/.ssh
[devwoot@devwoot-rails-showcase ~]$ sudo sh -c "chmod 600 ~memberwoot/.ssh/*"

เข้าไปเพิ่ม user memberwoot ให้สามารถ ssh เข้ามาที่ server (droplet) ได้ โดยพิมพ์คำสั่งด้านล่าง

[devwoot@devwoot-rails-showcase ~]$ sudo vi /etc/ssh/sshd_config

พอเปิดไฟล์ sshd_config ขึ้นมาแล้ว ให้กด G เพื่อไปยังบรรทัดสุดท้ายของไฟล์ และกด a เพื่อเพิ่มบรรทัดและเข้าสู่ insert mode จากนั้นให้พิมพ์โค้ดด้านล่าง แล้วกด ese แล้วตามด้วย :wq

AllowUsers devwoot
AllowUsers memberwoot

ทำการล็อกเอ้าออกจาก user devwoot โดยพิพม์ exit แล้วลอง ssh เข้ามาใหม่ด้วย user memberwoot ก็จะเห็นว่าเราาสามารถเข้า droplet ด้วย user memberwoot ได้สำเร็จ

เตรียมสภาพแวดล้อมของ Droplet ให้พร้อมสำหรับแอพ Rails

ขั้นตอนต่อไป เราจะเตรียมสภาพแวดล้อมของ server ให้พร้อมสำหรับรันแอพ Rails ซึ่งสิ่งที่เราจะลงได้แก่ RVM (ruby version manager), Ruby 2.5.5, PostgreSQL สำหรับฐานข้อมูล และ Nodejs สำหรับ javascript runtime

ลง RVM, Ruby และ Bundler

ก่อนอื่นให้ ssh เข้ามาที่ server ด้วย user ที่มีสิทธิ admin หรือ su ซึ่งในที่นี้คือ user devwoot จากนั้นทำการลง package พื้นฐานที่เราต้องใช้ด้วยคำสั่งด้านล่าง

$ sudo yum install -y curl gpg gcc gcc-c++ make

Note เพื่อให้อ่านง่ายผมขอใช้ prompt ของคอนโซลของ server เป็น $ สำหรับแสดงคำสั่งที่จะพิมพ์ลงไปต่อจากนี้นะครับ

รันคำสั่งด้านล่างเพื่อลง RVM และทำการเพิ่ม user devwoot เข้าไปอยู่ใน group rvm ด้วย

$ sudo gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
$ curl -sSL https://get.rvm.io | sudo bash -s stable
$ sudo usermod -a -G rvm `whoami`

จากนั้นรันสคริปเพื่อตรวจสอบและกำหนดค่าของตัวแปร rvmsudo_secure_path โดยใส่โค้ดด้านล่างลงไปที่ command line แล้ว enter ได้เลย

$ if sudo grep -q secure_path /etc/sudoers; then sudo sh -c "echo export rvmsudo_secure_path=1 >> /etc/profile.d/rvm_secure_path.sh" && echo Environment variable installed; fi

จากนั้นให้ล็อกเอ้าออกจาก server แล้ว ssh เข้ามาใหม่ด้วย user devwoot เหมือนเดิม เพื่อให้ rvm มีผลในการเรียกใช้ ซึ่งเราจะสั่งให้ rvm ทำการลง ruby ให้เราเลย โดยเวอร์ชั่นของ ruby ที่ผมจะลง ณ ตอนนี้คือ 2.5.5 ซึ่งเป็นเวอร์ชั่นเดียวกับที่เครื่อง local ผมมีอยู่ ตอนเราทำแอพและ deploy จะได้ไม่มีปัญหาเรื่องเวอร์ชั่นขัดแย้งกัน

$ rvm install ruby-2.5.5

จากนั้นบอก rvm ว่าเราจะใช้ ruby เวอร์ชั่น 2.5.5 เป็น default ruby

$ rvm --default use ruby-2.5.5

เสร็จแล้วลง Bundler ซึ่งเป็น package manager ของ ruby

$ gem install bundler --no-rdoc --no-ri

ลง Node.js

เนื่องจาก Rails มีขั้นตอนที่ทำการคอมไพล์ css และ javascript ไฟล์ หรือที่เรียกว่าขั้นตอนของการทำ asset pipeline ซึ่งขั้นตอนนี้จำเป็นต้องใช้ javascript runtime ดังนั้นเราจึ ต้องลง Node.js ด้วย โดยรันคำสั่งต่อไปนี้

$ sudo yum install -y epel-release
$ sudo yum install -y --enablerepo=epel nodejs npm

จากนั้นทำการอัพเกรด npm และ node ให้เป็นเวอร์ชั่น stable ล่าสุด

$ sudo npm cache clean -f
$ sudo npm install -g n
$ sudo n stable

ล็อกเอ้าออกจาก server แล้ว ssh ล็อกอินเข้าไปใหม่เพื่อให้เห็นผลการอัพเกรด เราสามารถเช็คเวอร์ชั่นของ node และ npm ได้จากการใช้คำสั่ง node -v และ npm -v ตามลำดับ

ลง yarn

yarn เป็น javascript package manager ที่ Rails 6 ใช้ในการติดตั้งและจัดการกับ javascript package เราจะต้องใช้มันตอนทำ automatic deploy ติดตั้ง yarn โดยการรันคำสั่งต่อไปนี้

$ sudo curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install yarn

Install PostgreSQL

เราจะ follow ตามขั้นตอนการติดตั้งจาก หน้า download ของ PostgreSQL บน Linux เลย โดยผมขอเลือกลง postgres เวอร์ชั่น 10

เริ่มจากลง repository สำหรับ download แพกเกจนี้ก่อนด้วยคำสั่ง

$ sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

จากนั้นลง client package, server package และ development package

$ sudo yum install postgresql10
$ sudo yum install postgresql10-server
$ sudo yum install postgresql10-devel

สุดท้ายให้ทำการ initialize database และ enable automatic start เป็นอันเสร็จสิ้นขั้นตอนสำหรับ postgreSQL

$ sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
$ sudo systemctl enable postgresql-10
$sudo systemctl start postgresql-10

เราจะต้องสร้าง user สำหรับเข้าใช้ postgreSQL ด้วย ซึ่งจะใช้เป็น user เดียวกับ user ที่เราใช้ login เข้ามาที่ droplet นั่นคือ user memberwoot รันคำสั่งด้านล่างเพื่อ login เข้าไปที่ postgresql console

$ sudo -u postgres psql postgres

เมื่อเข้ามาที่คอนโซลของ psql แล้วให้พิมพ์คำสั่งด้านล่างเพื่อสร้าง role (user) ชื่อ memberwoot จากนั้นออกจากคอนโซลโดยการพิมพ์คำสั่ง \q

psql (10.8)
Type "help" for help.

postgres=# CREATE ROLE memberwoot WITH CREATEDB CREATEROLE LOGIN;
postgres=# \q
$

ทำการ login เข้ามาที่ droplet VPS ด้วย user memberwoot แล้วรันคำสั่ง createdb เพื่อสร้าง database สำหรับ user memberwoot ก่อน จากนั้นรันคำสั่ง psql ทีนี้จะเห็นว่าเราสามารถเข้ามาที่คอนโซลของ postgresql ได้ แสดงว่าเราจะสามารถใช้ user memberwoot ในการสร้าง database สำหรับแอพของ Memberwoot ที่เราจะสร้างและ deploy ในตอนต่อไป

[memberwoot@devwoot-rails-showcase ~]$ createdb
[memberwoot@devwoot-rails-showcase ~]$ psql
psql (10.8)
Type "help" for help.

memberwoot=> \q

จากนั้นให้เราเพิ่ม path ของ pg_config เข้าไปในตัวแปล PATH โดยแก้ไขไฟล์ .bashrc โดยเพิ่มบรรทัดด้านล่างเข้าไปดังนี้

export PATH=${PATH}:/usr/pgsql-10/bin

สุดท้ายทำการสร้าง production database สำหรับแอพที่เราจะ deploy เตรียมเอาไว้ ในที่นี้แอพของผมคือ memberwoot ดังนั้นผมจะใช้ชื่อ production database เป็น memberwoot_production ซึ่งเราจะต้องระบุชื่อ production database อันนี้ลงในไฟล์ database.yml ของแอพ Rails เช่นกัน ทำการสร้าง production database โดยรันคำสั่ง

$ createdb memberwoot_production

สรุป

เอาล่ะครับ ถึงตรงนี้เราได้ทำการ สร้าง Droplet บน Digital Ocean ขึ้นมาและทำการสร้าง user devwoot สำหรับใช้ทำงานที่เกี่ยวกับ admin และเตรียม user memberwoot เอาไว้สำหรับ deploy แอพ พร้อมทั้งเซตค่าให้ user สามารถ SSH เข้ามาที่ server ได้เรียบร้อยแล้ว เรายังได้ทำการติดตั้ง RVM ลง Ruby 2.5.5 ลง Node.js และติดตั้ง PostgreSQL database เรียบร้อยแล้วเช่นกัน

ดังนั้นผมขอจบโพสสำหรับการ Deploy แอพ Rails บน Digital Ocean ภาค 1 เอาไว้ตรงนี้ก่อน เราจะทำการ setup Phusion Passsenger ซึ่งเป็น application server, Nginx สำหรับ web server และ ทำการ deploy โดยใช้ Capistrano กันต่อในครั้งต่อไป รอติดตามภาค 2 ได้เร็วๆ นี้่ครับ

แชร์โพสได้จากลิ้งด้านล่าง ขอบคุณครับ