Strapi là một hệ thống quản lý nội dung không giao diện (headless CMS) mã nguồn mở, được xây dựng bằng ngôn ngữ lập trình JavaScript. Giống như các CMS headless khác, Strapi không có sẵn frontend mà thay vào đó là dựa vào một API để bạn thiết kế cấu trúc nội dung.

Ngoài ra, Strapi cung cấp nhiều cách để xây dựng website, có thể tích hợp với các framework phổ biến như React và Next.js. Hơn nữa, bạn cũng có thể lựa chọn cách tiêu thụ API thông qua REST API hoặc GraphQL.
Trong hướng dẫn này, bạn sẽ khởi tạo Strapi trên Ubuntu 22.04 chỉ với vài bước đơn giản:
- Cài đặt Strapi và thiết lập môi trường production để bắt đầu tạo nội dung.
- Cấu hình Strapi sử dụng PostgreSQL thay vì SQLite mặc định trong chế độ development.
- Triển khai ứng dụng Strapi phía sau reverse proxy Nginx.
- Sử dụng trình quản lý tiến trình PM2 để đảm bảo ứng dụng luôn ổn định.
- Bảo mật kết nối Nginx bằng Let’s Encrypt.
Điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn cần:
- Một máy chủ Ubuntu 22.04 đã được thiết lập.
- Nên dùng máy chủ có ít nhất 2 nhân CPU và 4GB RAM để sử dụng Strapi hiệu quả.
- Node.js phiên bản 16.xx đã được cài trên máy chủ.
- Thay thế phiên bản 18.xx bằng 16.xx qua tùy chọn PPA vì trong hướng dẫn này sử dụng Node v16.18.1.
- PostgreSQL đã được cài đặt.
- Nginx đã được cài đặt và cấu hình làm reverse proxy với
http://localhost:1337làmapp_server_address. - Một tên miền trỏ về địa chỉ IP công cộng của máy chủ. Tên miền này sẽ được cấu hình trong Nginx để proxy ứng dụng.
Khi đã có Node.js 16, Nginx và PostgreSQL, bạn có thể bắt đầu thực hành theo hướng dẫn.
Bước 1: Thiết lập cơ sở dữ liệu Postgres
Mỗi dự án Strapi đều cần một cơ sở dữ liệu. Hiện tại, Strapi hỗ trợ MySQL, MariaDB, SQLite và PostgreSQL, với yêu cầu phiên bản tối thiểu được nêu rõ trong tài liệu chính thức. Lưu ý, Strapi cần một cơ sở dữ liệu mới, do đó bạn không thể sử dụng cơ sở dữ liệu đã có sẵn để liên kết với instance Strapi.
Trước tiên, tạo một cơ sở dữ liệu:
sudo -i -u postgres createdb strapi-db
Sau đó tạo một người dùng cho cơ sở dữ liệu:
sudo -i -u postgres createuser --interactive
Kết quả đầu ra:
Enter name of role to add: sammy
Shall the new role be a superuser? (y/n) y
Mặc định, PostgreSQL xác thực người dùng cơ sở dữ liệu bằng Identification Protocol, hay còn gọi là phương thức xác thực ident.
Cơ chế này lấy tên người dùng Ubuntu của client và dùng nó làm tên người dùng trong cơ sở dữ liệu. Đây là cách an toàn trong nhiều trường hợp, nhưng có thể gây khó khăn khi bạn muốn một ứng dụng bên ngoài như Strapi kết nối tới cơ sở dữ liệu.
Để khắc phục, bạn chỉ cần đặt mật khẩu cho role PostgreSQL này.
Từ terminal, mở prompt PostgreSQL:
sudo -u postgres psql
Trong prompt PostgreSQL, cập nhật user profile bằng một mật khẩu mạnh:
ALTER USER sammy PASSWORD 'postgres_password';
Thoát khỏi PostgreSQL bằng cách gõ \\q trong terminal:
\\q
Khi đã tạo xong cơ sở dữ liệu và thông tin đăng nhập, bước kế tiếp là cài đặt Strapi.
Bước 2: Cài đặt Strapi trên máy chủ
Để cài đặt Strapi trên máy chủ, chạy lệnh sau:
npx create-strapi-app@latest my-project
Xác nhận bằng cách nhập y để tiếp tục cài đặt.
Sau khi xác nhận, bạn sẽ vào phần cài đặt tương tác. Chọn các tùy chọn sau, đồng thời thay đổi Database name, Username và Password phù hợp:
Kết quả đầu ra:
? Choose your installation type Custom (manual settings)
? Choose your preferred language JavaScript
? Choose your default database client postgres
? Database name: strapi-db
? Host: 127.0.0.1
? Port: 5432
? Username: sammy
? Password: postgres_password
? Enable SSL connection: No
Hiện vẫn chưa bật kết nối SSL vì bạn sẽ cấu hình và lấy chứng chỉ từ Let’s Encrypt trong các bước tiếp theo. Strapi sẽ bắt đầu cài đặt sau khi bạn chọn xong.
Khi cài đặt hoàn tất, bạn đã có thể xây dựng dự án Strapi.
Trước tiên, vào thư mục my-project:
cd my-project
Rồi chạy lệnh sau:
NODE_ENV=production npm run build
Kết quả đầu ra:
> my-project@0.1.0 build
> strapi build
Building your admin UI with production configuration...
✔ Webpack
Compiled successfully in 35.44s
Admin UI built successfully
Lệnh này sẽ thiết kế dự án Strapi, bao gồm cả giao diện quản trị (admin UI).
Giờ bạn có thể kiểm tra Strapi server. Chạy lệnh sau để khởi động server trực tiếp:
node /home/sammy/my-project/node_modules/.bin/strapi start
Kết quả đầu ra:
[2022-11-21 13:54:24.671] info: The Users & Permissions plugin automatically generated a jwt secret and stored it in .env under the name JWT_SECRET.
Project information
┌────────────────────┬──────────────────────────────────────────────────┐
│ Time │ Mon Nov 21 2022 13:54:24 GMT+0000 (Coordinated … │
│ Launched in │ 1603 ms │
│ Environment │ development │
│ Process PID │ 4743 │
│ Version │ 4.5.4 (node v16.18.1) │
│ Edition │ Community │
└────────────────────┴──────────────────────────────────────────────────┘
Actions available
One more thing...
Create your first administrator 💻 by going to the administration panel at:
┌─────────────────────────────┐
│ <http://localhost:1337/admin> │
└─────────────────────────────┘
Nếu bạn đã làm theo phần điều kiện tiên quyết, Nginx sẽ được cấu hình như reverse proxy cho địa chỉ mặc định của Strapi là http://localhost:1337.
Mở trình duyệt và truy cập http://your_domain để xem trang chào mừng mặc định của Strapi:

Trang chào mừng Strapi sau khi chạy lệnh build và start.
Lúc này, với cấu hình mặc định, Strapi vẫn đang chạy ở chế độ development. Nó phụ thuộc vào tiến trình gắn với lệnh trong terminal nên chưa phù hợp cho production. Ở bước tiếp theo, bạn sẽ thêm cấu hình production bằng cách sử dụng trình quản lý tiến trình PM2.
Thoát khỏi server bằng cách nhấn CTRL+C.
Vậy là chúng ta đã cài đặt xong Strapi, kế tiếp là thiết lập PM2 để chạy server ở chế độ nền.
Bước 3: Cài đặt và cấu hình PM2
Thay vì khởi động server thủ công, bạn có thể sử dụng PM2 để quản lý tiến trình. Để hiểu rõ hơn về PM2 và cách cấu hình ứng dụng Node.js trong môi trường production, hãy tham khảo hướng dẫn chi tiết. PM2 giúp server luôn duy trì hoạt động ổn định mà không cần khởi động lại thủ công.
Trước tiên, vào thư mục gốc:
cd ~
Rồi cài đặt PM2 bằng lệnh sau:
sudo npm install pm2@latest -g
Sau đó, tạo một tập tin cấu hình cho PM2 trong trình soạn thảo. Ví dụ này sử dụng nano:
sudo nano ecosystem.config.js
Thêm nội dung sau vào tập tin này, đồng thời thay đổi tên thư mục dự án, đường dẫn, cùng với tên cơ sở dữ liệu, user và mật khẩu:
ecosystem.config.js
module.exports = {
apps: [
{
name: 'strapi',
cwd: '/home/sammy/my-project',
script: 'npm',
args: 'start',
env: {
NODE_ENV: 'production',
DATABASE_HOST: 'localhost',
DATABASE_PORT: '5432',
DATABASE_NAME: 'strapi-db',
DATABASE_USERNAME: 'sammy',
DATABASE_PASSWORD: 'postgres_password',
},
},
],
};
Sau khi chỉnh sửa, lưu và thoát khỏi tập tin. Nếu dùng nano, nhấn CTRL+x, sau đó y, rồi ENTER.
Chạy Strapi trong nền với lệnh sau:
pm2 start ecosystem.config.js
Kết quả đầu ra:
[PM2][WARN] Applications strapi not running, starting...
[PM2] App [strapi] launched (1 instances)
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ strapi │ default │ N/A │ fork │ 22608 │ 0s │ 0 │ online │ 0% │ 30.3mb │ sammy │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Các ứng dụng chạy dưới PM2 sẽ tự khởi động lại nếu gặp sự cố hoặc bị dừng. Bạn có thể cấu hình để Strapi tự động chạy khi khởi động máy chủ bằng lệnh:
pm2 startup
Kết quả đầu ra:
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Lệnh trên tạo và cấu hình script khởi động để bật PM2 cùng các tiến trình được quản lý khi server khởi động.
Tiếp theo, sao chép và chạy lệnh được cung cấp trong output (thay sammy bằng username của bạn):
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Sau đó, lưu danh sách tiến trình PM2:
pm2 save
Giờ bạn đã có dịch vụ PM2 chạy trên server. Khi truy cập lại http://your_domain, bạn sẽ thấy Strapi đang chạy ở chế độ production:

Giao diện Strapi hiển thị trạng thái production.
Sau khi đã có PM2 quản lý server trong nền, bạn có thể tiếp tục bước bảo mật cho instance Strapi.
Bước 4: Bảo mật Strapi với Let’s Encrypt
Khi truy cập vào tên miền để xem trang chào mừng của Strapi, bạn có thể thấy URL hiển thị là http:// thay vì https://, tức là kết nối chưa được bảo mật.
Bắt đầu bảo mật Strapi bằng Let’s Encrypt với lệnh sau:
sudo snap install --classic certbot
Liên kết lệnh certbot từ thư mục cài đặt snap vào đường dẫn hệ thống để có thể chạy trực tiếp bằng certbot:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Tiếp theo, cho phép lưu lượng HTTPS và bật profile Nginx Full:
sudo ufw allow 'Nginx Full'
Xóa luật dư thừa của Nginx HTTP:
sudo ufw delete allow 'Nginx HTTP'
Sau đó, sử dụng plugin Nginx để lấy chứng chỉ bằng cách nhập tên miền của bạn:
sudo certbot --nginx -d your_domain -d www.your_domain
Khi chạy lệnh, bạn sẽ được yêu cầu nhập địa chỉ email và đồng ý với điều khoản dịch vụ. Bạn cũng có thể chọn tham gia hoặc không vào danh sách email. Sau đó, bạn sẽ thấy thông báo quá trình thành công và vị trí lưu chứng chỉ:
Kết quả đầu ra:
. . .
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2023-02-05.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/your_domain
Successfully deployed certificate for www.your_domain /etc/nginx/sites-enabled/your_domain
Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain
. . .
Truy cập http://your_domain, bạn sẽ được tự động chuyển hướng sang phiên bản HTTPS. Lúc này Strapi đang chạy ở chế độ production:

Giao diện Strapi hiển thị chế độ production sau khi bật HTTPS.
Giờ bạn có thể vào https://your_domain/admin để tạo tài khoản quản trị Strapi:

Trang đăng ký tài khoản quản trị Strapi.
Sau khi nhập thông tin tài khoản, bạn sẽ truy cập được vào bảng điều khiển quản trị:

Bảng điều khiển quản trị Strapi.
Từ bảng điều khiển này, bạn có thể bắt đầu tạo nội dung với Strapi.
Kết luận
Trong hướng dẫn này, chúng ta đã thiết lập môi trường production cho Strapi với cơ sở dữ liệu PostgreSQL. Ứng dụng Strapi cũng đã được triển khai phía sau reverse proxy Nginx và quản lý bằng tiến trình PM2 để duy trì hoạt động ổn định cho server.
Sau khi cài đặt Strapi, bạn có thể bắt đầu tạo nội dung thông qua bảng điều khiển quản trị. Để tìm hiểu thêm về cách thiết lập và cấu hình Strapi, hãy tham khảo tài liệu chính thức của Strapi.