Blogging cùng Keystone.js (3) - Deployment

Bạc xỉu

Việc đầu tiên để bạn có thể deploy được là cần một server và một tên miền được trỏ đến địa chỉ IP của server đó. Ngoài ra cũng có một lựa chọn khá hay (vì nó miễn phí) là deploy app lên heroku. Mình sẽ nói qua về 2 cách deploy này.

VPS

Mua domain, server và config DNS

Bạn có thể mua domain từ GoDaddy và server từ các nhà cung cấp như vultr,digitalocean hay linode, với một VPS tầm trung thì giá sẽ rơi vào khoảng 5$/tháng. Một lựa chọn tiết kiệm hơn là sử dụng gói 300$ free trial của Google cloud service, 200$ miễn phí của Aruze hoặc 1 năm free tier của Amazon khi bạn submit visa card. Sẽ có rất nhiều thứ hay ho bạn có thể học được khi tự mình config một VPS riêng và sở hữu một tên miền cá nhân. Với server này, bạn không chỉ host được trang blog này mà còn có thể host được nhiều trang web và service khác nhau chỉ với khoảng 200k 1 tháng (good investment).

Sau khi có được server và domain, bạn có thể config DNS để trỏ domain tới server theo hướng dẫn sau

Cài đặt môi trường

Recommended OS: Ubuntu 16.04

Sau khi config xong domain trỏ đến địa chỉ IP của VPS, chúng ta lại bắt đầu cài đặt lại môi trường như từ bước 1

Source code

Có rất nhiều cách để bạn có thể lấy được source code của project từ local. Bạn có thể dùng ftp, ssh nhưng nếu có thể, bạn hãy sử dụng github. Việc này sẽ mất công hơn một chút nhưng việc có thể quản lý version và source sẽ giúp việc quản lý task dễ hơn, hoặc những lợi ích khác như travisCI,...

Bạn có thể sử dụng git pushgit pull để lấy được source code từ repository trên github, nếu muốn code được lấy 1 cách tự động sau khi có push từ local hãy sử dụng git hook theo hướng dẫn sau

Nginx config

Cài đặt nginx cho VPS để có một web server ở port 80 của VPS

sudo apt-get update
sudo apt-get install nginx
sudo ufw allow 'Nginx Full'

Forever.js hoặc pm2

Cài đặt forerver.js để giữ tiến trình của keystone luôn chạy trên port 3000 của server

sudo npm install forever -g
cd ~/my-blog
forever start keystone.js

EDITED Các ứng dụng node.js là one-thread-per-process nên nếu có một VPS 16 core mà chạy node.js thì sẽ gây lãng phí tài nguyên. Để khắc phục điều này chúng ta có thể chuyển qua dùng package pm2 với load-balancer (x10 lần tốc độ của ứng dụng với CPU 16 cores). Dù với blog cá nhân đơn giản thì mình nghĩ cũng không khác biệt lắm. Dù sao thì nếu nhà có điều kiện dùng nhiều core hoặc chuẩn bị cho tương lai trở thành hot blogger thì bạn nên sử dụng pm2 thay vì forever.js.

npm install pm2 -g
// để dùng load balancer với tất cả các cores
pm2 start api.js -i -1
// reload lại tất cả các process mà không có downtime
pm2 reload all

Proxy pass

Web server đang ở port 80 còn ứng dụng keystone đang chạy tại port 3000, khi có request đến port 80 hãy pass request này qua cổng 3000 cho ứng dụng node.js xử lý.

/etc/nginx/conf.d/myblog.conf

server {
server_name domain.com default_server;
listen 80;

access_log /var/log/nginx/domain-access.log;
error_log /var/log/nginx/domain-error.log;

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

}

SSL

Về bản chất thì SSL được dùng để encrypt dữ liệu giữa người dùng và server, với blog cá nhân thì việc này là không cần thiết (lắm), thậm chí việc sử dụng ssl sẽ làm chậm tốc độ load trang và tốn tài nguyên của server (tuy không nhiều), trong trường hợp bạn vẫn muốn có dấu xanh trên thanh địa chỉ bạn có thể sử dụng Let's encrypt để tạo ssl certificate (miễn phí)

Trước khi request certificate cho site của bạn, hãy chắc chắn site đang hoạt động trên domain.

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 --authenticator webroot --installer nginx

Hướng dẫn cài đặt cụ thể tại đây.

Ngoài ra còn một cách khác đơn giản hơn rất nhiều đó là sử dụng cloudflare, bạn chỉ cần trỏ domain đến dns của cloudflare và tuỳ chọn sử dụng ssl là đã có ngay 1 wildcard ssl certificate (cho tất cả các subdomain). Tuy nhiên thì chứng chỉ này được sử dụng chung (shared) cho 30-40 domain =)). Nếu bạn không muốn mọi thứ phức tạp, có thểktham khảo bài viết tại blog của ông bạn kaito yuuki.

Heroku

Việc deploy lên heroku khá đơn giản nên mình sẽ không hướng dẫn tại đây. Bạn có thể tham khảo cách để deploy một ứng dụng node.js tại document của heroku.

Như vậy là sau 3 phần của Blogging cùng Keystone.js mình đã trình bày lại toàn bộ quá trình xây dựng một blog cá nhân (của chính mình). Source code của project có tại đây, có thể clone, customize giao diện và sử dụng ngay. Cách trình bày của mình có lẽ sẽ hơi khó hiểu với các bạn chưa tiếp xúc nhiều với IT, nếu có vấn đề hay khó khăn gì, đừng ngại ngùng, hãy pm đội technical support của qmau.me để có câu trả lời với giá rẻ nhất =))

Mình sẽ rất vui và vô cùng cảm kích nếu bạn để lại comment góp ý để mình có thể hoàn thiện hơn trong những bài viết sau. Peace!

Ps: Hôm nay nhìn cờ đỏ rợp trời mà muốn bay về check-in với 500 anh em quá T_T

Tags: #blogwithkeystones #javascript #mongodb #nodejs #blog