n8n là gì? Hướng dẫn Xây dựng Workflow tự động hoá đơn giản với n8n
03 Mar, 2025
Hướng nội
Authorn8n là một nền tảng automation mã nguồn mở, giúp developer dễ dàng tạo workflow kết nối ứng dụng, dịch vụ mà không cần phải viết quá nhiều code

Mục Lục
Bạn có thường xuyên phải đối mặt với việc tự động hóa các tác vụ lặp đi lặp lại như đồng bộ dữ liệu, tạo webhook handlers hay xử lý sự kiện giữa các API và dịch vụ khác nhau?
Là developers, chúng ta thường phải viết hàng trăm dòng code để giải quyết các vấn đề tích hợp phức tạp. Đây chính là lúc n8n, một nền tảng workflow automation mã nguồn mở, trở nên cực kỳ hữu ích. Với n8n, bạn có thể tự động hóa quy trình làm việc một cách nhanh chóng mà không cần tốn quá nhiều effort vào việc viết code tùy chỉnh.
Điểm đặc biệt của n8n là nó được thiết kế dành cho developers, với triết lý "developer-first": hỗ trợ JavaScript/TypeScript native, khả năng mở rộng thông qua custom nodes, và triển khai self-hosted để kiểm soát tối đa dữ liệu.
Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai n8n với Docker, tạo một workflow giám sát GitHub commits và gửi thông báo qua Slack, cũng như xây dựng custom nodes giúp tối ưu hóa các quy trình tích hợp. n8n sẽ giúp bạn tiết kiệm thời gian và công sức, để tập trung hơn vào việc phát triển các tính năng quan trọng.
1. n8n là gì?
n8n là một nền tảng automation mã nguồn mở, giúp developers dễ dàng tạo workflow để kết nối các ứng dụng, dịch vụ và API mà không cần phải viết quá nhiều code. Được thiết kế để giải quyết bài toán tích hợp và tự động hóa workflows, n8n nổi bật với tính linh hoạt và khả năng tùy chỉnh cao.

Những đặc điểm nổi bật của n8n:
- Mã nguồn mở: Mọi thứ đều công khai trên GitHub, cho phép bạn dễ dàng kiểm tra, tùy chỉnh, và đóng góp vào codebase.
- Self-hosted: Bạn có thể deploy n8n trên infrastructure của riêng mình để đảm bảo toàn quyền kiểm soát dữ liệu.
- Khả năng mở rộng: Hỗ trợ tạo custom nodes, giúp tích hợp các dịch vụ mà n8n chưa có sẵn.
- JavaScript/TypeScript native: Các node functions được viết bằng JavaScript hoặc TypeScript – một lợi thế lớn cho developers đã quen thuộc với những ngôn ngữ này.
- Expression support: Cho phép xử lý trực tiếp dữ liệu trong workflow với JavaScript expressions, giúp tăng sự linh hoạt khi xây dựng workflows.
- Tích hợp AI: Hỗ trợ tích hợp các chức năng AI như chatbot và phân tích dữ liệu để nâng cao khả năng tương tác và ra quyết định tự động.
Với những điểm mạnh này, n8n không chỉ giúp tối ưu hóa thời gian code mà còn cung cấp môi trường cực kỳ linh hoạt để developers xây dựng workflows theo nhu cầu cụ thể. Đây chắc chắn là một công cụ đáng chú ý trong lĩnh vực automation và integration.
2. Hướng dẫn cài đặt n8n với Docker
Docker là cách nhanh chóng và hiệu quả nhất để chạy n8n trong môi trường development. Dưới đây là hướng dẫn chi tiết để thiết lập và chạy n8n bằng Docker.
2.1 Tạo file Docker Compose
Đầu tiên, bạn tạo một file có tên docker-compose.yml
ở thư mục hiện tại với nội dung như sau:
version: '3'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=http://localhost:5678/
# Database configuration (optional - mặc định sử dụng SQLite)
# - DB_TYPE=postgresdb
# - DB_POSTGRESDB_HOST=postgres
# - DB_POSTGRESDB_PORT=5432
# - DB_POSTGRESDB_DATABASE=n8n
# - DB_POSTGRESDB_USER=postgres
# - DB_POSTGRESDB_PASSWORD=postgres
volumes:
- ~/.n8n:/home/node/.n8n
2.2 Khởi động n8n
Chạy lệnh sau trong thư mục chứa file docker-compose.yml
:
docker-compose up -d
Lệnh này sẽ tải image của n8n, khởi động container và để nó chạy ở chế độ background. Sau khi hoàn tất, bạn có thể truy cập n8n qua trình duyệt tại URL: http://localhost:5678
2.3 Cấu hình cho môi trường Production
Nếu bạn triển khai n8n trong môi trường production, hãy lưu ý một số thiết lập quan trọng để đảm bảo bảo mật và hiệu quả:
- Thay đổi
WEBHOOK_URL
thành domain thực tế của bạn - Cấu hình database PostgreSQL thay vì SQLite mặc định
- Thêm các biến môi trường bảo mật như
N8N_ENCRYPTION_KEY
# Thêm vào docker-compose.yml cho môi trường production
environment:
- N8N_ENCRYPTION_KEY=your-secure-encryption-key
- WEBHOOK_URL=https://your-domain.com/
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=smtp.example.com
- N8N_SMTP_PORT=587
- N8N_SMTP_USER=your-smtp-user
- N8N_SMTP_PASS=your-smtp-password
3. Hướng dẫn xây dựng Workflow đơn giản
Chúng ta hãy bắt đầu xây dựng một workflow đơn giản nhưng hữu ích: Tự động kiểm tra GitHub repository và gửi thông báo qua Slack khi có commit mới.
3.1. Tổng quan về workflow
Workflow này sẽ:
- Polling GitHub repository định kỳ để kiểm tra commits mới
- Lọc các commits từ khi chạy lần cuối
- Định dạng thông tin commit
- Gửi thông báo đến Slack channel
3.2. Thiết lập workflow
3.2.1. Tạo workflow mới
- Truy cập n8n UI qua
http://localhost:5678
- Click vào "Workflows" ở menu bên trái
- Click "New" để tạo workflow mới
- Đặt tên workflow: "GitHub Commit Monitor"
3.2.2. Thiết lập trigger node - GitHub
- Thêm node đầu tiên: Tìm và chọn "GitHub" từ danh sách nodes
- Cấu hình GitHub credentials (bạn sẽ cần tạo GitHub Personal Access Token)
- Chọn Operation: "Watch Repository"
- Nhập Repository Owner và Repository Name (ví dụ:
n8n-io/n8n
) - Thiết lập Properties: Chọn "Commits"
- Thiết lập Polling Interval (ví dụ: 15 phút)
3.2.3. Thêm Filter node
- Thêm node "Filter" sau GitHub node
- Thiết lập Mode: "Filter by Formula"
- Thêm biểu thức so sánh thời gian commit với thời gian hiện tại:
{{$json["commit"]["author"]["date"] > $now.minus({days: 1}).toISOString()}}
3.2.4. Thêm Function node để định dạng dữ liệu
- Thêm "Function" node sau Filter node
- Thêm đoạn code sau:
// Định dạng thông tin commit để hiển thị trong Slack
return items.map(item => {
const commit = item.commit;
const repo = item.repository;
return {
json: {
commitInfo: {
message: commit.message,
author: commit.author.name,
date: commit.author.date,
url: item.html_url,
repo: `${repo.owner.login}/${repo.name}`,
branch: item.parents[0] ? item.parents[0].sha.substring(0, 7) : 'unknown'
}
}
};
});
3.2.5. Thêm Slack node
- Thêm "Slack" node cuối cùng
- Cấu hình Slack credentials (OAuth hoặc Access Token)
- Operation: "Send Message"
- Channel: Nhập tên channel (ví dụ: "#dev-updates")
- Text: Sử dụng Expression để định dạng tin nhắn:
New commit in {{$json["commitInfo"]["repo"]}} by {{$json["commitInfo"]["author"]}}:
*{{$json["commitInfo"]["message"]}}*
🔗 <{{$json["commitInfo"]["url"]}}|View on GitHub>
- Lưu và Activate workflow bằng cách click "Active" ở góc trên bên phải
3.3. Mở rộng workflow với JavaScript Expressions
Để minh họa khả năng xử lý dữ liệu phức tạp, hãy thêm node "Code" để phân tích nội dung commit:
- Thêm "Code" node giữa Function node và Slack node
- Thêm đoạn code sau:
// Phân tích commit message để tìm từ khóa và phân loại commit
return items.map(item => {
const commitInfo = item.json.commitInfo;
const message = commitInfo.message.toLowerCase();
// Phân loại commit dựa trên nội dung message
let type = "other";
let priority = "normal";
let emoji = "🔄";
if (message.includes("fix") || message.includes("bug") || message.includes("issue")) {
type = "bugfix";
emoji = "🐛";
} else if (message.includes("feat") || message.includes("feature") || message.includes("add")) {
type = "feature";
emoji = "✨";
} else if (message.includes("docs") || message.includes("documentation")) {
type = "docs";
emoji = "📚";
} else if (message.includes("refactor")) {
type = "refactor";
emoji = "♻️";
} else if (message.includes("test")) {
type = "test";
emoji = "🧪";
}
// Xác định priority
if (message.includes("urgent") || message.includes("critical") || message.includes("important")) {
priority = "high";
emoji = "🚨 " + emoji;
}
// Cập nhật commitInfo với phân loại
commitInfo.type = type;
commitInfo.priority = priority;
commitInfo.emoji = emoji;
return { json: { commitInfo } };
});
Cập nhật Slack message trong Slack node:
{{$json["commitInfo"]["emoji"]}} *[{{$json["commitInfo"]["type"]}}]* New commit in {{$json["commitInfo"]["repo"]}} by {{$json["commitInfo"]["author"]}}:
*{{$json["commitInfo"]["message"]}}*
Priority: {{$json["commitInfo"]["priority"]}}
🔗 <{{$json["commitInfo"]["url"]}}|View on GitHub>
4. Mở rộng với Custom Node dành cho Developer
Một trong những điểm mạnh nhất của n8n là khả năng tạo custom nodes, giúp bạn xây dựng những node riêng theo ý tưởng và yêu cầu cụ thể. Dưới đây là cách tạo một custom node đơn giản.
4.1 Cài đặt môi trường
# Clone n8n repository
git clone https://github.com/n8n-io/n8n.git
cd n8n
# Cài đặt dependencies
npm install
# Bootstrap project
npm run bootstrap
# Build package
npm run build
4.2 Tạo custom node
- Tạo thư mục cho node mới trong
packages/nodes-base/nodes/YourNodeName
- Tạo file description và execution:
// YourNodeName.node.ts
import { IExecuteFunctions } from 'n8n-core';
import {
INodeExecutionData,
INodeType,
INodeTypeDescription,
} from 'n8n-workflow';
export class YourNodeName implements INodeType {
description: INodeTypeDescription = {
displayName: 'Your Node Name',
name: 'yourNodeName',
group: ['transform'],
version: 1,
description: 'Basic description of your node',
defaults: {
name: 'Your Node Name',
},
inputs: ['main'],
outputs: ['main'],
properties: [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
options: [
{
name: 'Example Operation',
value: 'example',
},
],
default: 'example',
description: 'Operation to perform',
},
],
};
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
const items = this.getInputData();
const returnData: INodeExecutionData[] = [];
const operation = this.getNodeParameter('operation', 0) as string;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (operation === 'example') {
// Thực hiện logic của bạn ở đây
const newItem = {
...item.json,
processedByCustomNode: true,
timestamp: new Date().toISOString(),
};
returnData.push({ json: newItem });
}
}
return [returnData];
}
}
- Build và test custom node:
# Build package
npm run build
# Start n8n với custom node
npm run start
5. Best Practices khi làm việc với n8n
5.1. Xử lý lỗi trong workflow
Sử dụng "Error Trigger" nodes để xử lý lỗi trong workflow:
- Thêm "Error Trigger" node vào workflow
- Kết nối với Slack hoặc Email node để thông báo khi có lỗi
- Sử dụng Try/Catch trong Function nodes để xử lý lỗi trong code
5.2. Quản lý biến môi trường
Sử dụng biến môi trường thay vì hardcode credentials:
environment:
- MY_CUSTOM_API_KEY=${MY_API_KEY}
Truy cập trong workflow thông qua expressions:
{{$env.MY_CUSTOM_API_KEY}}
5.3. Tối ưu hóa hiệu suất
- Sử dụng "Split In Batches" node để xử lý dữ liệu lớn
- Giới hạn số lượng items được xử lý trong mỗi lần chạy
- Cấu hình database PostgreSQL cho production thay vì SQLite
5.4. Quản lý phiên bản và backup
- Sử dụng tính năng Export/Import để sao lưu workflows
- Lưu trữ workflows dưới dạng JSON trong hệ thống quản lý phiên bản (Git)
- Thiết lập backup định kỳ cho database n8n
6. Kết luận
n8n là một công cụ mạnh mẽ cho các bạn developer muốn tự động hóa các tác vụ và quy trình làm việc thay vì phải tốn nhiều thời gian viết code từ đầu. Với khả năng tùy biến cao, tích hợp dễ dàng với Docker, và hỗ trợ JavaScript/TypeScript, n8n giúp developers tiết kiệm thời gian phát triển các giải pháp tích hợp.
Điểm mạnh nhất của n8n là tính mở và khả năng mở rộng - bạn có thể tùy chỉnh hầu như mọi khía cạnh của nền tảng này.