Mình có 1 trang web được viết bằng SailsJS, MongoDB và mình muốn deploy lên server một cách đơn giản nhất, chỉ cần gõ lệnh deploy thì sẽ có 1 tool nào đó giúp mình những việc như lên server pull code mới nhất về, cài đặt những package mới, restart server, v.v. Mình có tìm hiểu một vài cách deploy NodeJS trước đó thì mình thích dùng PM2 vì tính đơn giản và dễ dùng của nó. Ở bài viết này mình xin chia sẽ cách mình đã deploy lên EC2
- Setup EC2 instance
- Setup NodeJS environment
- Setup MongoDB
- Setup Nginx
- Setup PM2
1. Setup EC2 instance
Hiện tại mình đang dùng gói tier của AWS, setup Ubuntu 20.4 LTS
Chọn instance t2 micro
Ở bước tiếp theo: Config instance, Add Storage, Add Tags mình không có nhu cầu config nên Next luôn.
Tiếp theo là Step 6: Configure Security Group, ở bước này mình cần mở một vài port để trang web có thể truy cập được từ internet.
Những port đó là: 22 (SSH), 80(HTTP), 443(HTTPS)
Sau khi hoàn tất những bước trên, bước cuối cùng là Launch, trong bước này bạn sẽ tạo mới hoặc chọn key-pair(key này dùng để SSH lên server và không thể thay đổi được nên cần có những phương pháp lưu trữ phù hợp với nó.)
Bước cuối cùng là Launch. Chờ khoảng 5p thì server sẽ setup xong.
Một số step NÊN LÀM sau khi setup xong instance:
- Đặt tên instance (đơn giản nhưng quan trọng lắm nha)
2. Chỉ định elastic IP (Allocate Elastic IP address)
Lấy xong nhớ đặt tên nhé
Chọn IP cần chỉ định
Chọn instance và click Associate
Note: Để bắt đầu những bước tiếp theo cần phải SSH vào instance vừa tạo, lệnh như sau:
Cấp quyền 400 cho file .pem
chmod 400 <path/to/pem/file.pem>
ssh ubuntu@<ip> -i <path/to/pem/file.pem>
2. Setup NodeJS environment
2.1. Cài đặt NodeJS 14.x:
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -;
sudo apt-get install -y nodejs;
Sau khi cài Nodejs xong, kiểm tra version xem có đúng chưa:
node -v
=> v14.17.0
npm -v
=> 7.16.0
2.2. Cài đặt Yarn và developent tool: (You may also need development tools to build native addons)
## You may also need development tools to build native addons:
sudo apt-get install gcc g++ make;
## To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null;
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list;
sudo apt-get update && sudo apt-get install yarn;
3. Setup MongoDB
bạn có thể tham khảo ở đây
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -;
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list;
sudo apt-get update;
sudo apt-get install -y mongodb-org;
Sau khi cài đặt xong MongoDB
Start Mongo:
sudo systemctl start mongod
Start mongodb sau khi reboot:
sudo systemctl enable mongod
Một số lệnh cơ bản, bạn có thể xem thêm tại đây
4. Setup Nginx
Bạn có thể tham khảo tại đây
Để bắt đầu cài đặt Nginx, gõ lệnh sau
sudo apt update
sudo apt install nginx
Để kiểm tra Nginx đã được cài đặt thành công hay chưa
nginx -v
=> nginx version: nginx/1.18.0 (Ubuntu)
Config Nginx
Sử dụng lệnh sau để tạo file config cho website:
sudo nano /etc/nginx/sites-available/<website>.conf // thay thế website bằng tên website của bạn, ví dụ my-pet.conf
Do SailsJS chạy ở port 1337 nên config của mình sẽ như sau(copy dán vào thôi):
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=7d use_temp_path=off;
server {
server_name 18.223.173.52;
server_tokens off;
gzip on;
gzip_proxied any;
gzip_comp_level 4;
gzip_types text/css application/javascript image/svg+xml;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
location / {
proxy_pass http://localhost:1337;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_buffers 8 16k;
proxy_buffer_size 32k;
}
}
Lưu ý:
Cần thay đổi server_name là địa chỉ IP hoặc domain_name của bạn.
Bước tiếp theo cần làm là symlink file config vừa tạo vào thư mục /etc/nginx/sites-enabled/
cd /etc/nginx/sites-enabled/;
sudo ln -s <website>.conf /etc/nginx/sites-available/<website>.conf
Test lại kết quả Nginx thế nào:
sudo nginx -t
=> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
=> nginx: configuration file /etc/nginx/nginx.conf test is successful
Nếu kếu quả ra như trên là ổn rồi, restart Nginx để apply config mới.
sudo systemctl restart nginx
Xong phần config Nginx.
5. Setup PM2
PM2 là .. PM2 is a daemon process manager that will help you manage and keep your application online 24/7
Bạn hãy xem thêm tại đây
Để setup deploy bằng PM2 ta cần:
- Setup PM2 ở server bằng câu lệnh:
npm install -g pm2
- Setup PM2 ở local bằng câu lệnh:
npm install -g pm2
5.1 Ở máy local
Tạo file ecosystem.config.js như hình.
Nội dung file ecosystem.config.js:
module.exports = {
apps: [
{
name: 'my-pet-web',
script: 'app.js',
env_production: {
NODE_ENV: 'production',
},
},
],
deploy: {
// "production" is the environment name
production: {
// SSH key path, default to $HOME/.ssh
key: '<path-to-pem-file>',
// key: '.cert/ec2-my-pet-web.pem',
// SSH user
user: 'ubuntu',
// SSH host
host: [<your host ip>],
// host: ['18.223.173.52'],
// SSH options with no command-line flag, see 'man ssh'
// can be either a single string or an array of strings
ssh_options: 'StrictHostKeyChecking=no',
// GIT remote/branch
ref: 'origin/deploy',
// GIT remote
repo: 'https://<github_user_name>:<github_personal_key>@github.com/<github_url>',
// repo: 'https://kokorolx:[email protected]/kokorolx/my-pet-web.git',
// path in the server
path: '/var/www/my-pet-web',
// Pre-setup command or path to a script on your local machine
// Post-setup commands or path to a script on the host machine
// eg: placing configurations in the shared dir etc
'post-setup':
'echo \'post setup.........\'; cp /var/www/my-pet-web/shared/.env /var/www/my-pet-web/current/.env; yarn install; pm2 start yarn --name my-pet-web --interpreter bash -- start; pm2 l;',
// post-deploy action
'post-deploy':
'echo \'post deploy.........\';cp /var/www/my-pet-web/shared/.env /var/www/my-pet-web/current/.env; yarn install; pm2 restart my-pet-web; pm2 l;',
},
},
};
Lưu ý:
repo: chỗ này là repo URL của bạn, có thể generate personal key để deploy, cách generate tại đây, tùy theo dự án mà có cách thay đổi URL chỗ này, nếu bất kỳ ai cũng có quyền deploy thì nên gắn personal key vào URL để tiện, không cần phải config SSH ở server.
post-setup: Dành cho lần deploy đầu tiên, PM2 sẽ tạo folder theo path trong file config. Copy file .env (file này phải tự tạo, chứa những enviroment variable của dự án), chạn yarn và start dự án bằng lệnh pm2 start yarn --name my-pet-web --interpreter bash -- start
;
Script deploy lần đầu:
pm2 deploy production setup // lưu ý tên stage nhé, của mình là production
post-deploy: Dành cho những lần chạy tiếp theo, PM2 sẽ copy file .env, chạy yarn, và restart lại app.
Script deploy những lần tiếp theo:
pm2 deploy production update // lưu ý tên stage nhé, của mình là production
Sau khi chạy thành công thì mở browser test thôi (cool)
Câu lệnh cuối cùng và rất quan trọng ở máy server, nó sẽ giúp PM2 tự khởi động lại những app đang chạy sau khi bạn reboot máy server.
pm2 save
Bài viết đến đây là hết.
Chúc mọi người config server thành công nhé.