- Published on
Deploy series - Phần 1 - Deploy NodeJS lên EC2
- Authors
- Name
- Coderkiemcom
- @coderkiemcom
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.json và package-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