Published on

Deploy series - Phần 1 - Deploy NodeJS lên EC2

Authors
Deploy NodeJS lên EC2

Hôm nay coder kiếm cơm sẽ hướng dẫn anh em các bước deploy NodeJS lên EC2. Mình mặc định các bạn đã có một con EC2 rồi nhé.


Bước 1: Hãy dùng filezilla để upload source lên ec2, hoặc sử dụng git để clone dự án lên ec2

Bước 2: Cài docker

sudo yum install docker -y
sudo service docker start

# Để docker tự động khởi động
sudo chkconfig docker on

sudo reboot # khởi động lại máy

Bước 3: Cài docker compose

# docker-compose (latest version)
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# Sửa permissions sau khi download
sudo chmod +x /usr/local/bin/docker-compose
# Xem thử cài được chưa
docker-compose version

Bước 4: Reg SSL

  • Đầu tiên, bạn cần trỏ IP của tên miền về IP của máy chủ EC2
  • Sau đó bạn hãy tạo một file docker-compose.yml để reg ssl:
version: "3"
services:
  your_app-letsencrypt:
    image: linuxserver/swag
    container_name: your_app-letsencrypt
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./config:/config
    environment:
      - EMAIL=you-remail@gmail.com #Thay thành email của bạn hoặc công ty
      - URL=your-domain.com #Thay bằng tên miền của bạn
      - SUBDOMAINS=api #Thay bằng sub domain của bạn nếu bạn muốn reg ssl cho subdomain, xóa đi nếu bạn không cần
      - ONLY_SUBDOMAINS=true #Dòng này nghĩa là bạn chỉ reg ssl cho subdomain, nếu bạn muốn reg cả domain chính, hãy xóa dòng này
      - VALIDATION=http
      - TZ=Europe/Stockholm
      - PUID=1000
      - PGID=1000
  • Chạy lệnh sau
sudo docker-compose up
  • Sau đó bạn truy cập tên miền của bạn với https, sẽ có thông báo thành công, nếu không, hãy kiểm tra lại
  • SSL key sau khi tạo thành công, bạn ls cùng cấp thư mục chứa file docker-compose.yml trên, sẽ thấy thư mục config.
  • SSL key được lưu trong thư mục config này, chính xác là: config/etc/letsencrypt/live/your-domain/
  • Chúng ta cần 2 file pem: privkey.pem và fullchain.pem
  • Hãy copy 2 file trên vào thư mục của project
sudo cp privkey.pem thư-mục-project
sudo cp fullchain.pem thư-mục-project

Bước 5: Tạo dockerfile để build nodejs, ở thư mục của dự án hãy tạo file dockerfile

FROM node:19 #Sửa lại nếu bạn sử dụng phiên bản node khác

# Tạo thư mục cho project trong container của docker
WORKDIR /usr/src/app

# Copy file package.jsonpackage-lock.json vào container docker
COPY package*.json ./

RUN npm install
# Nếu bạn chạy production, hãy mở comment này
# RUN npm ci --only=production

# Copy toàn bộ mã nguồn vào source
COPY . .

# Chạy port 443, port này là port HTTPS
EXPOSE 443

# Tùy thuộc vào cách run project nodejs của bạn như thế nào, mình để sẵn 2 kiểu như bên dưới
ENTRYPOINT ["node", "/server.js"] 
#CMD ["npm", "run", "production"]

Bước 6: Tạo app.yml để run dự án, ở thư mục của dự án hãy tạo file app.yml

name: your-app-name #Thay tên mà bạn muốn đặt cho container này
services:
  app:
    build: ./ #Build thư mục project, cùng cấp với dockerfile
    ports:
      - 443:443
    #Dòng volumes là cách bind một thư mục từ trong container ra bên ngoài docker, để tránh không bị mất thư mục quan trọng khi docker bị lỗi
    #volumes: 
      #- /thư mục dự án/uploads:/thư mục WORKDIR trong dockerfile/uploads:rw

Bước 7: Sửa file index.js hoặc file server.js

  • cài thêm https:
npm i https
  • Thêm SSH key index.js hoặc file server.js vào như sau:
...
const privateKey = fs.readFileSync('privkey.pem')
const certificate = fs.readFileSync('fullchain.pem')
const credentials = { key: privateKey, cert: certificate }

// Create HTTPS server
const server = https.createServer(credentials, app)
...
  • Nhớ sửa lại port backend là chạy trên 443 nhé

Bước 8: Chạy dự án

sudo docker-compose -f app.yml up -d

Một vài lệnh để xử lý các case:

  • Mỗi lần bạn sửa code và build mới, hãy chạy lần lượt các lệnh sau:
sudo docker-compose -f app.yml up -d --force-recreate --build
sudo docker system prune -a

Nếu gặp lỗi nào, hãy để lại comment bên dưới Take care, Coder kiếm cơm