- Server chạy bằng node.js kết hợp typescript vì thế mọi người cần cài node.js nhé
- Cơ sở dữ liệu là MongoDB
- Để xem thông tin các table cũng như quan hệ các table database thì mở thư mục
database/models
- Role sẽ có 2 role là
Admin
vàUser
. Để tạo được tài khoảnAdmin
thì bạn chỉ cần đăng ký tài khoản bình thường. Sau đó vào trong database thêm roleAdmin
vào cho nó.
Ở đây mình khuyên mọ người dùng Cloud MongoDB nhé, vừa free vừa đỡ setup lằng nhằng. Mọi người lên google gõ Cloud MongoDB atlas
hoặc vào trang này https://www.mongodb.com/cloud/atlas đăng ký 1 tài khoản.
Nếu nó hiển thị cái này thì bạn điền gì tên tổ chức và tên project, điền cái gì cũng được, không quan trọng lắm đâu. Xong rồi nhấn continue nhé
Tiếp theo chọn Create bên phần Basic nhé
Tạo một Basic Cluster. Cluster như là một database của bạn vậy, nó sẽ chứa các table trong đó.
- Chọn Free Basic
- Chọn nhà cung cấp Cloud, ở đây mình chọn AWS
- Chọn Vùng đặt server, mình chọn Singapore vì gần Việt Nam thì tốc độ nhanh hơn.
- Chọn loại Cluster, mình chọn M0 Sandbox vì nó miễn phí
- Đặt tên cho Cluster (tức là tên database bạn sau này), có bạn có thể để tên mặc định hoặc sửa lại tùy ý.
- Nhấn Create Cluster
Sau khi create thì nó sẽ như thế này, mọi người đợi 1 tí nhé. Khoảng 1-3 phú bạn sẽ có cluster.
Sau khi hoàn tất sẽ như thế này.
- Các bạn nhấn vào Connect.
- Chọn Alow Access from Anywhere và nhấn Add Ip Address
Tiếp theo Nhập Username và Password cho database và nhấn Create Database User
Sau khi Create thành công sẽ có giao diện như bên dưới. Tiếp theo mọi người nhấn vào Connect your application.
Ta sẽ có được URL như thế này
Các bạn nhớ thay <password>
thành mật khẩu bạn vừa tạo lúc nãy lúc Create Database User nhé.
mongodb+srv://admin:<password>@cluster0.sucej.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
Mọi ngưới nhớ URL này, vì đây là URL bạn sẽ điền vào trong cấu hình server của chúng ta.
Vậy là chúng ta đã tạo xong database. Bây giờ hãy cấu hình Server nhé.
Đầu tiên các bạn cần tạo file .env
trong folder api. Nội dung trong file .env này tương tự trong file .env
.example nên mọi người có thể tham khảo file này
- HOST: mặc định là
localhost
- PORT: mặc định là
4000
- PRODUCTION_HOST: URL khi deploy, phục vụ cho convert link image product trên production khi build
- SECRET_KEY_JWT: Mã bí mật dùng để mã hóa JWT, mọi người có thể nhập tùy ý
- DB_URL: URL dẫn đến database (URL vừa tạo lúc trên)
Dưới đây là mẫu nội dung trong file .env
của mình
HOST=localhost
PORT=4000
PRODUCTION_HOST=https://api-ecom.duthanhduoc.com
SECRET_KEY_JWT=dtdgruop
DB_URL=mongodb+srv://admin:admin@cluster0.sucej.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
Đầu tiên cần cd api
để vào thư mục api. Cài hết package bằng yarn
hoặc npm i
.
Để run server thì chỉ cần chạy yarn start
. Ngoài ra còn có các lệnh phía dưới đây.`
yarn start
: Chạy server ở chế độ typescriptyarn build
: Build server từ ts -> jsyarn prod
: Build server từ ts -> js và run ở chế độ production
Server sẽ chạy tại localhost:4000
Hiển thị như thế này nghĩa là server đã chạy và kết nối database thành công.
Vì theo logic trong middleware của mình thì chỉ có role Admin
mới có quyền thêm sản phẩm, tạo category... Vì thế chúng ta cần tạo một tài khoản Admin
cũng như test thử server có tương tác với database chính xác hay không.
Đầu tiên các bạn mở postman lên đăng ký một tài khoản với url là localhost:4000/register
. À, về thông tin tất cả URL thì các bạn vào trong folder api/routes
để khám phá nhé.
Nếu như hiển thị đăng ký thành công là ok, các bạn để ý role hiện tại chỉ là một mảng ['User']
Bây giờ chúng ta vào database xem thử đã có record nào được tạo hay chưa. Mọi người quay trở lại trang cloud mongodb và nhấn Browse Collections
Nếu có các collection như dưới thì chúc mừng bạn, bạn đã add dữ liệu thành công. Bây giờ chúng ta chọn collection là users
và click vào biểu tượng edit document để thêm role Admin
Nhấn update sau khi thêm xong nhé.
Vậy chúng ta đã nâng quyền tài khoản vừa tạo lên Admin, cho phép nó có thể tạo sản phẩm, category, edit, update...
Bây giờ hãy đẩy tất cả source lên github của mọi người rồi, đừng dùng repo của mình nữa, để thuận tiện cho việc deploy
- Việc tạo sản phẩm phải qua các bước dưới đây:
- Up ảnh lên server -> server trả về name string của ảnh
- Bỏ name string vào thuộc tính image trong body để add sản phẩm
- Server sẽ tự tính và trả về đường link ảnh đầy đủ dựa vào môi trường development hay production
Các bạn nên thuê một VPS (hoặc EC2 AWS) để deploy nhé. Ở đây mình chọn VPS của AZDigi. Chọn hệ điều hành cho VPS thì chúng ta dùng ubuntu nhé, phiên bản mới cũng được.
Cũng nên mua một domain để test cho biết luôn nha. Mua domain xong rồi thì search google Cách trỏ domain vào host
ra rất nhiều kết quả, anh em nghiên cứu dần nhé.
Sau khi login vào VPS rồi thì sẽ có giao diện terminal, chúng ta sẽ thực hiện cài đặt thông qua terminal nhé.
Cài nvm để quản lý version node.
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
Tắt terminal và login lại VPS. Chúng ta sẽ cài node
nvm install node
Cài Git
sudo apt update
sudo apt install git
Lấy SSH key của VPS và add vào github của bạn thông qua câu lệnh
ssh-keygen
cat ~/.ssh/id_rsa.pub
Tiếp theo clone repo chứa source nodejs của bạn
git clone repoGitCuaban
Sau khi clone thành công thì cd
vào thư mục api
Cài đặt Yarn
và pm2
. Cho bạn nào chưa biết thì PM2 giúp chúng ta quản lý các tiến trình node trên server
npm install --global yarn
npm install pm2 -g
Tiếp theo cài đặt tất cả các package
yarn
Build source (chuyển từ TS sang JS)
yarn build
Chạy PM2
pm2 start ecosystem.config.js --env production
pm2 save
pm2 startup
Tiếp theo chúng ta cài web server là Apache
sudo apt install apache2
Xóa các cấu hình Apache mặc định
sudo a2dissite 000-default
Enable Apache module
sudo a2enmod proxy proxy_http rewrite headers expires
Reload lại apache
service apache2 reload
Cài đặt nano
để edit file
sudo apt-get install nano
Tạo một file cấu hình apache cho nodejs
sudo nano /etc/apache2/sites-available/domain.conf
Thêm nội dung phía dưới vào file vừa tạo.
Lưu ý:
domain.com
chính là domain anh em đã mua và liên kết với VPS, nếu chưa mua domain hoặc chưa liên kết thì có thể dùng IP của VPS.- Khi thuê 1 VPS thì anh em sẽ có IP của VPS đó, anh em có thể dùng IP này để truy cập vào VPS cũng đc nếu chưa có domain
<VirtualHost *:80>
ServerName domain.com
ServerAlias www.domain.com
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://localhost:4000/
ProxyPassReverse / http://localhost:4000/
</VirtualHost>
Nhấn Ctrl + X
và Nhấn Y
và Enter
để lưu và đóng file.
Enable file cấu hình vừa tạo
sudo a2ensite domain.conf
Bây giờ chúng ta có thể restart lại Apache
sudo service apache2 restart
Bây giờ anh em có thể test bằng cách dùng postman để thực hiện các request đến server thông qua domain của anh em hoặc IP VPS của anh em.
Bây giờ chúng ta sẽ cài đặt chứng chỉ SSL miễn phí để cho server của chúng ta có HTTPS
, ban đầu nó chỉ là HTTP
thôi.
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install python-certbot-apache
Bây giờ chúng ta đã cài Certbot cho Apache. Tiếp theo chúng ta sẽ cài đặt chứng chỉ Let’sEncrypt. Nhớ thay thế email và domain của anh em vào nhé. Mình chưa test việc nếu không có domain và thay thế bằng IP của VPS có được hay không, ae có thể test nhé.
sudo certbot --apache -m your-email -d domain.com -d www.domain.com
Để kiểm tra file config apache có lỗi hay không anh em có thể kiểm tra qua lệnh dưới đây
cd /etc/apache2
apache2ctl configtest