Cài đặt Reactive Resume trên Ubuntu Server

Giới thiệu

Reactive Resume là ứng dụng giúp bạn tạo sơ yếu lý lịch online để đi xin việc.

Yêu cầu hệ thống

  • Ubuntu Server.
  • Nginx để làm Reverse Proxy.
  • NodeJS.
  • Tên miền với chứng chỉ SSL đã được lấy miễn phí từ Let's Encrypt. Cần 2 tên miền, 1 tên miền để truy cập và 1 tên miền để chạy API. Giả sử mình có reactiveresume.com và reactiveresume-api.com
  • Cơ sở dữ liệu PostgreSQL.
  • pnpm - là package manager cho javascript tương tự như npm, yarn.
npm install -g pnpm

Cài đặt

Tạo cơ sở dữ liệu

Đăng nhập vào tài khoản root

sudo -u postgres psql

Tạo cơ sở dữ liệu reactiveresume và tài khoản reactiveresumedb, tên cơ sở dữ liệu và tài khoản cũng như mật khẩu tùy bạn

create database reactiveresumedb;
create user reactiveresume with encrypted password 'password';
grant all privileges on database reactiveresumedb to reactiveresume;
exit;

Tạo tài khoản mới

Tiến hành tạo tài khoản mới, tránh sử dụng tài khoản hay ssh vào hệ thống.

sudo adduser reactiveresume
sudo usermod -aG sudo reactiveresume

Đăng nhập vào tài khoản đó

su - reactiveresume

Tiến hành cài đặt

Tải về phiên bản mới nhất

git clone https://github.com/AmruthPillai/Reactive-Resume

Đổi tên thư mục vừa tải về, dài quá (Reactive-Resume) mình đổi về rr cho dễ nhớ. Di chuyển vào thư mục đó

mv Reactive-Resume rr
cd rr

Tiến hành tải và cài các gói cần thiết

pnpm install
pnpm build

Copy tệp .env.example thành tệp .env, mở tệp .env và tiến hành điền các thông tin cần thiết.

cp .env.example .env
nano .env

Nội dung tệp .env

# Server + Client
TZ=UTC
PUBLIC_URL=http://localhost:3000
PUBLIC_SERVER_URL=http://localhost:3100
PUBLIC_GOOGLE_CLIENT_ID=

# Server + Database
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

# Server
SECRET_KEY=
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_SSL_CERT=
JWT_SECRET=
JWT_EXPIRY_TIME=604800
GOOGLE_CLIENT_SECRET=
GOOGLE_API_KEY=
MAIL_FROM_NAME=
MAIL_FROM_EMAIL=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
STORAGE_BUCKET=
STORAGE_REGION=
STORAGE_ENDPOINT=
STORAGE_URL_PREFIX=
STORAGE_ACCESS_KEY=
STORAGE_SECRET_KEY=
PDF_DELETION_TIME=345600000

# Client
PUBLIC_FLAG_DISABLE_SIGNUPS=false

Trong đó các phần SECRET_KEY, PUBLIC_URL, PUBLIC_SERVER_URL, POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD, JWT_SECRET là bắt buộc. (xem ở đây để biết rõ hơn).
Sửa phần POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD với thông tin Cơ sở dữ liệu đã tạo ở trên.
Phần PUBLIC_URL chúng ta điền tên miền để truy cập (reactiveresume.com).
Phần PUBLIC_SERVER_URL chúng ta điền tên miền làm API (reactiveresume-api.my.to).

Cài đặt Reactive Resume khởi động bằng systemd

Tạo file reactiveresume.service ở thư mục /etc/systemd/system/

sudo nano /etc/systemd/system/reactiveresume.service

và nhập vào nội dung như sau

[Unit]
Description=reactiveresume
After=network.target

[Service]
Environment=NODE_ENV=production
Type=simple
ExecStart=pnpm start
User=reactiveresume
Group=reactiveresume
WorkingDirectory=/home/reactiveresume/rr
Restart=on-failure

[Install]
WantedBy=multi-user.target

Làm cho systemd nhận cấu hình mới, tải lại và khởi động Reactive Resume.

sudo systemctl daemon-reload
sudo systemctl enable --now reactiveresume.service
sudo systemctl start reactiveresume.service

Kiểm tra hoạt động chưa

systemctl status reactiveresume.service


Chú này chạy khá là ngốn ram 🤣🤣🤣.

Cấu hình Nginx

Tạo file cấu hình cho Nginx với tên miền làm API (reactiveresume-api.com):

sudo nano /etc/nginx/sites-available/reactiveresume-api.com

Và nhập vào nội dung sau

server {
    listen 80;
    server_name reactiveresume-api.com;
    return 301 https://$server_name$request_uri;
}
server {
	server_name reactiveresume-api.com;
	listen 443 ssl http2;
	access_log  /var/log/nginx/reactiveresume-api.access.log;
	error_log   /var/log/nginx/reactiveresume-api.error.log;
	client_max_body_size 20M;
	location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff|)$ {
		access_log off;
		expires 30d;
		add_header Pragma public;
		add_header Cache-Control "public, mustrevalidate, proxy-revalidate";
		proxy_set_header HOST $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_pass http://localhost:3100;
		proxy_redirect off;
		proxy_buffering off;
	}
	location / {
		proxy_set_header HOST $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_pass http://localhost:3100;
		proxy_redirect off;
		proxy_buffering off;
	}
    ssl_certificate /etc/letsencrypt/live/reactiveresume-api.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/reactiveresume-api.com/privkey.pem;
}

Tạo file cấu hình cho Nginx với tên miền để truy cập (reactiveresume.com)

sudo nano /etc/nginx/sites-available/reactiveresume.com

Và nhập vào nội dung sau

server {
    listen 80;
    server_name reactiveresume.com;
    return 301 https://$server_name$request_uri;
}
server {
	server_name reactiveresume.com;
	listen 443 ssl http2;
	access_log  /var/log/nginx/reactiveresume.access.log;
	error_log   /var/log/nginx/reactiveresume.error.log;
	client_max_body_size 20M;
	location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff|)$ {
		access_log off;
		expires 30d;
		add_header Pragma public;
		add_header Cache-Control "public, mustrevalidate, proxy-revalidate";
		proxy_set_header HOST $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_pass http://localhost:3000;
		proxy_redirect off;
		proxy_buffering off;
	}
	location / {
		proxy_set_header HOST $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_pass http://localhost:3000;
		proxy_redirect off;
		proxy_buffering off;
	}
    ssl_certificate /etc/letsencrypt/live/reactiveresume.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/reactiveresume.com/privkey.pem;
}

Ánh xạ, kiểm tra cấu hình không lỗi thì khởi động lại Nginx

sudo ln -s /etc/nginx/sites-available/reactiveresume.com /etc/nginx/sites-enabled/reactiveresume.com
sudo ln -s /etc/nginx/sites-available/reactiveresume-api.com /etc/nginx/sites-enabled/reactiveresume-api.com
sudo nginx -t
sudo systemctl restart nginx

OK, giờ thì truy cập vào trang web và tạo CV của mình thôi. Chúc các bạn sớm tìm được công việc ưng ý 😁😁😁.

Mở rộng

Do mình sử dụng Reactive Resume cho mục đích cá nhân, nên sau khi tạo tài khoản của mình, thì mình khóa chức năng đăng ký đi. Để khóa thì sửa file .env phần PUBLIC_FLAG_DISABLE_SIGNUPS đổi false thành true. Lưu và khởi động lại Reactive Resume.