
Tự host kế hoạch du lịch của bạn với TREK và Docker
Tìm hiểu cách triển khai TREK với Docker, bảo mật qua Cloudflare R2 và Caddy, đồng thời sử dụng các tác nhân AI qua MCP để lập kế hoạch du lịch liền mạch.
Mục lục
Phần tẻ nhạt nhất của việc lập kế hoạch du lịch là các tệp PDF đặt vé máy bay, xác nhận khách sạn, các cuộc trò chuyện với bạn đồng hành và danh sách các địa điểm muốn ghé thăm thường bị rải rác ở nhiều nơi khác nhau. Khi đến lúc tính toán tổng chi tiêu và chia hóa đơn, bạn sẽ phải tốn rất nhiều công sức để lục lọi lại toàn bộ đống dữ liệu du lịch đó.
TREK là một công cụ lập kế hoạch du lịch mã nguồn mở có thể tự lưu trữ (self-host), giúp gom toàn bộ lịch trình, thông tin đặt chỗ, ngân sách và danh sách đồ dùng cần mang theo vào một nơi duy nhất. Server MCP tích hợp sẵn cho phép các tác nhân AI (chẳng hạn như Claude Desktop) thao tác trực tiếp với dữ liệu du lịch của bạn.
Hướng dẫn này sẽ đi cùng bạn qua mọi bước, từ triển khai cài đặt đến việc quản lý hoàn chỉnh một chuyến đi thực tế từ đầu đến cuối.
1. Cách triển khai công cụ lập kế hoạch du lịch TREK bằng Docker
Cài đặt Docker trên VPS Ubuntu
# Add Docker's official GPG key and set up the Docker repository
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add the official Docker repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update package list
sudo apt update
# Install Docker Engine, Docker Community Edition, and containerd runtime
sudo apt install docker-ce docker-ce-cli containerd.io -y
# Verify docker is installed
docker --version
# Starts automatically when your system boots
sudo systemctl enable docker
Tạo khóa mã hóa
TREK sử dụng một khóa để mã hóa dữ liệu nhạy cảm. Hãy sử dụng lệnh sau hoặc công cụ trực tuyến này để tạo khóa mã hóa:
openssl rand -hex 32
Hãy lưu khóa này ở nơi an toàn; việc mất khóa đồng nghĩa với việc bạn sẽ mất quyền truy cập vào dữ liệu đã được mã hóa.
Khởi chạy container
docker run -d \
--name trek \
-p 3000:3000 \
-e ENCRYPTION_KEY="<generated_key>" \
-e APP_URL="https://trek.pafor.me" \
-v ./data:/app/data \
-v ./uploads:/app/uploads \
--restart unless-stopped \
mauriceboe/trek:latest
APP_URLphải được định cấu hình chính xác — luồng khám phá OAuth của server MCP phụ thuộc vào biến này. Hãy thiết lập nó thành địa chỉ HTTPS công khai cuối cùng của bạn ngay từ đầu.
Lần chạy đầu tiên sẽ mất một khoảng thời gian để tải image về:

Xác nhận container đang hoạt động:
docker ps

2. Thiết lập định tuyến tên miền & SSL với Caddy Reverse Proxy
Giao thức HTTPS là bắt buộc đối với passkey, và OAuth đối với MCP. Tên miền được lưu trữ trên Cloudflare, đi kèm với chứng chỉ SSL miễn phí và tính năng bảo vệ DDoS.
Caddy được thiết lập như một máy chủ reverse proxy bảo mật để trỏ về cổng 3000. Ví dụ về file cấu hình Caddyfile như sau:
{$TREK_DOMAIN} {
encode zstd gzip
reverse_proxy host.docker.internal:3000
}
3. Cấu hình ban đầu & Thiết lập quản trị viên bảo mật
Có hai cách để tạo tài khoản quản trị viên (admin):
ADMIN_EMAILvàADMIN_PASSWORDđược thiết lập làm biến môi trường; các giá trị này sẽ được sử dụng trực tiếp.- TREK tự động tạo email
admin@trek.local, tên đăng nhậpadmin, và một mật khẩu được tạo ngẫu nhiên in trong container log. Chạy lệnhdocker logs trekđể lấy mật khẩu này.
Nếu không tìm thấy mật khẩu từ log, bạn có thể đặt lại bằng lệnh:
docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server/reset-admin.js
Bạn sẽ được nhắc đổi mật khẩu trong lần đăng nhập đầu tiên.

Nhấp vào mục Admin và cập nhật địa chỉ email:
3.1 Sao lưu (Backups)
Định cấu hình sao lưu tự động với chính sách lưu trữ (retention policy) trong bảng quản trị:

3.2 Lưu trữ các tệp đã tải lên vào Cloudflare R2
Lưu trữ các tệp đã tải lên, ảnh và bản sao lưu trong Cloudflare R2 giúp dung lượng đĩa của VPS luôn sạch sẽ và nhẹ nhàng. TREK hỗ trợ các backend tương thích S3, và Cloudflare R2 hoàn toàn phù hợp với điều này.
- Tạo một bucket R2 tên là
trek. - Trong phần Account Details, tìm ID tài khoản của bạn:

- Nhấp vào Manage API Tokens:

- Nhấp vào Create Account API token với quyền đọc/ghi (read/write) cho bucket:

- Nhấp vào mục Storage trên bảng ADMINISTRATION:

- Nhấp vào nút Add Backend và điền đầy đủ endpoint, bucket cùng thông tin đăng nhập:

- Nhấp vào Apply, sau đó nhấp vào liên kết nút Test. Bạn sẽ thấy dòng chữ "Connection OK":

- Chuyển tất cả các danh mục lưu trữ sang Cloudflare R2 và nhấp vào Save changes:

3.3 Đăng nhập bằng Passkey
TREK hỗ trợ đăng nhập bằng passkey, xác thực hai yếu tố (2FA) và đăng nhập một lần OIDC (SSO). Đối với passkey, hãy nhập tên miền của bạn và các origin được phép (allowed origins) trong phần cài đặt, sau đó nhấp vào Save:

Nếu không định cấu hình mục allowed origins, việc đăng ký passkey sẽ không thành công.
3.4 Google Maps API Key
Khóa Google Maps API giúp bổ sung thêm thông tin phong phú cho việc tìm kiếm địa điểm như xếp hạng, giờ mở cửa và hình ảnh. TREK sẽ tự động chuyển sang sử dụng OpenStreetMap nếu không có khóa, chỉ là không hiển thị xếp hạng và hình ảnh.
Truy cập liên kết này và nhấp vào Get demo key để yêu cầu cấp khóa: 
Dán khóa vào cài đặt và nhấp vào Test để xác nhận kết nối:

3.5 Tích hợp AI
Mô hình AI được sử dụng để phân tích và chuyển đổi các email xác nhận đặt chỗ cũng như tệp PDF thành các dữ liệu đặt chỗ có cấu trúc.
Nhấp vào mục Addons ở menu bên trái và bật AI Parsing. Chọn "OpenAI" (or nhà cung cấp tương thích khác) và điền thông tin chi tiết:

3.6 Truy cập qua MCP
Trong mục Addons, bật tính năng MCP:

3.7 Các Plugin
Các plugin sau đây được khuyến nghị cài đặt và rất đáng để kích hoạt:

3.8 Tạo tài khoản người dùng hàng ngày
Hãy lập kế hoạch các chuyến đi với tư cách là một người dùng bình thường, thay vì dùng tài khoản quản trị viên. Tạo một người dùng thông thường và đăng nhập bằng tài khoản đó:

Sau khi đăng nhập, hãy thêm một passkey hoặc thiết lập xác thực 2FA để tăng cường bảo mật cho tài khoản:

Nhấp vào + Add a passkey, nhập mật khẩu hiện tại và xác nhận:

4. Kiểm tra cài đặt: Nhập dữ liệu du lịch trong quá khứ
Cách tuyệt vời nhất để làm quen với TREK là bắt đầu ghi lại lịch sử du lịch trước đây của bạn.
4.1 Tạo chuyến đi mới
Nhấp vào + New Trip và thiết lập Start Date cũng như End Date tương ứng với các ngày diễn ra chuyến đi trong quá khứ:

Thêm ảnh bìa (bằng cách kéo thả hoặc dán từ khay nhớ tạm) rồi nhấp vào Create New Trip:

4.2 Nhập thông tin đặt chỗ
Kéo thả tất cả các tệp thông tin chuyến bay, tàu hỏa và phương tiện di chuyển khác vào:


Khi bật tính năng AI, các tệp PDF xác nhận đặt chỗ sẽ được phân tích tự động và trích xuất thành các bản đặt chỗ có cấu trúc rõ ràng.
Xem lại kết quả đã trích xuất và nhấp vào Add để lưu thông tin chi tiết đặt chỗ:

Nếu thông tin đặt chỗ chỉ nằm trong email, hãy xuất email đó thành tệp PDF rồi kéo thả vào — quy trình trích xuất tự động tương tự sẽ được áp dụng.
Các ảnh chụp màn hình sau đây hiển thị cách hiển thị của các thông tin đặt chỗ:


Trên trang Plan, tất cả các thông tin lưu trú sẽ được hiển thị trực quan trên bản đồ:

Nhấp vào mục Atlas trên thanh menu trên cùng để xem danh sách (và bản đồ) hiển thị mọi quốc gia mà bạn đã từng ghé thăm:

4.3 Thêm bạn đồng hành
Nhấp vào nút Share:

Ở cuối hộp thoại, bạn có thể thêm các khách mời đồng hành (guests):

4.4 Ghi nhận chi phí
Nhấp vào Add expense để thêm các khoản chi phí khác ngoài đặt chỗ, chẳng hạn như bảo hiểm du lịch, phương tiện công cộng địa phương, thẻ SIM:


4.5 Phân đoạn chuyến đi
Tính năng này yêu cầu plugin Trip Segment phải được kích hoạt trước.
Các chuyến đi dài ngày sẽ được chia nhỏ thành các chặng một cách đẹp mắt, trong đó mỗi chặng hiển thị rõ các thông tin đặt chỗ, địa điểm và chi phí tương ứng:



4.6 Tạo hành trình (Journey) và kiểm tra atlas của bạn
Gom các chuyến đi thành một Journey và viết các câu chuyện trải nghiệm để chia sẻ chuyến phiêu lưu với bạn bè:




5. Thiết kế lịch trình du lịch và danh sách đồ dùng cá nhân
Nhấp vào + New Trip, nhập tên chuyến đi và thiết lập ngày tháng:

Nếu bạn chưa chốt ngày đi cụ thể, hãy để trống cả hai mục. Một trường "số ngày" sẽ xuất hiện (cho phép lên đến 365 ngày). Lập kế hoạch trước, xếp lịch sau.
5.1 Thêm địa điểm
Đây là bước tốn nhiều thời gian nhất của bất kỳ kế hoạch du lịch nào, và TREK cung cấp một số cách để thực hiện điều đó:

1. Nhấp chuột phải trên bản đồ để tạo một địa điểm tại vị trí chính xác đó — địa chỉ sẽ được xác định tự động bằng tính năng reverse-geocoding:


2. Nhấp vào + Add Place/Activity và tìm kiếm theo tên



3. Dán một đường link Google Maps (maps.app.goo.gl/... hoặc maps.google.com/...) vào trường tìm kiếm. TREK sẽ tự động phân tích tên, địa chỉ và tọa độ của địa điểm đó:


4. Nhập hàng loạt (Bulk import) — cách dễ dàng nhất trong số tất cả. Nếu bạn đã lưu trữ sẵn một danh sách các địa điểm "muốn đi" trên Google Maps, hãy xuất danh sách đó dưới dạng .gpx (các định dạng .kml và .kmz cũng được hỗ trợ) rồi nhấp vào Import file ở bảng bên phải để nạp tất cả cùng lúc:

Trước tiên hãy thêm tất cả những nơi thú vị mà bạn muốn ghé thăm, bất kể chúng có phù hợp với thời gian hay không. Bạn sẽ phân bổ địa điểm vào các ngày cụ thể sau đó.
5.2 Kế hoạch hàng ngày và ghi chú
Kế hoạch Ngày (Day Plan) sắp xếp các địa điểm theo ngày một cách có thứ tự. Đó là một danh sách có thể thu gọn cho từng ngày, hỗ trợ thao tác kéo thả vô cùng thuận tiện:

Những chi tiết làm nên sự hữu ích của tính năng này:
- Di chuyển giữa các điểm dừng: biểu tượng xe buýt ở góc trên bên trái của một ngày dùng để thêm thông tin phương tiện công cộng (tàu hỏa, xe buýt hoặc các chặng bay trong ngày):

- Ghi chú ngày: biểu tượng ghi chú ở góc dưới bên trái giúp đính kèm các dòng ghi chú có gắn emoji — "hôm nay xuất phát sớm", "bảo tàng này yêu cầu phải đặt vé trước":

- Khung thời gian: kéo một địa điểm từ bảng bên phải vào một ngày, sau đó thiết lập thời gian cụ thể. Các địa điểm có mốc thời gian cố định sẽ được kết nối lộ trình tự động trên bản đồ:

- Vui lòng tham khảo trang wiki Day Plans and Notes để biết thêm thông tin về Tối ưu hóa lộ trình và Thời tiết.
5.3 Collections: Danh sách địa điểm có thể tái sử dụng
Tính năng Bộ sưu tập (Collections) cho phép người dùng lưu trữ một danh sách các địa điểm độc lập với bất kỳ chuyến đi cụ thể nào. Nó có thể được chia sẻ với bạn bè và luôn sẵn sàng cho các chuyến đi kế tiếp. Các địa điểm sẽ được sao chép vào từng chuyến đi, do đó việc chỉnh sửa một địa điểm trong chuyến đi cụ thể sẽ không bao giờ làm thay đổi bộ sưu tập gốc của bạn và ngược lại.
Nhấp vào mục Collections trên thanh menu trên cùng:

Nhấp vào + New list để tạo một danh sách mới:

Nhấp vào + Add a place và điền thông tin chi tiết:

Lưu ý: thanh tìm kiếm bên trong hộp thoại "Add a place" dường như chưa hoạt động tốt, vì vậy bạn cần phải nhập các thông tin chi tiết theo cách thủ công.
Nếu các địa điểm có sẵn tọa độ địa lý, chúng sẽ được hiển thị trực tiếp trên bản đồ:

Để sắp xếp các địa điểm bằng nhãn dán (labels), hãy nhấp vào biểu tượng hộp kiểm (tick-box):

Chọn các địa điểm muốn nhóm lại, sau đó nhấp vào Assign label:

Nhấp vào Manage labels để tiến hành tạo nhãn trước:

Chọn một nhãn và nhấp vào Assign label:

5.4 Chi phí và ngân sách
Chúng ta có thể thêm các khoản chi tiêu khác cho chuyến đi trên trang 'Costs'.

Các khoản thanh toán do các bạn đồng hành chi trả có thể được thêm vào và phân chia ngay trên cùng một trang này.
Bảng quyết toán (settlement panel) áp dụng thuật toán so khớp tham lam (greedy-matching algorithm) để tính toán số lượng giao dịch chuyển tiền tối thiểu cần thực hiện để phân chia công bằng ai nợ ai, và nợ bao nhiêu.
6. Khai thác Model Context Protocol (MCP) để lập kế hoạch du lịch bằng AI
TREK tích hợp sẵn một server MCP (Model Context Protocol), cho phép các tác nhân AI đọc và ghi trực tiếp dữ liệu du lịch của bạn — bao gồm hơn 150 công cụ và 30 tài nguyên quản lý các chuyến đi, địa điểm, ngân sách, danh sách đồ dùng, đặt chỗ và cộng tác.
6.1 Cloudflare Zero Trust
Vì TREK hoạt động phía sau mạng lưới bảo mật Cloudflare Zero Trust, bạn cần thêm tên miền của mình vào danh sách split tunnels inclusion. Nếu không, bạn sẽ gặp lỗi khi tiến hành xác thực OAuth. Vui lòng tham khảo vấn đề lỗi này trên GitHub: github issue.

Hướng dẫn liên quan
Cách hiển thị riêng tư Hermes Agent với Cloudflare WARP
Tìm hiểu cách hiển thị và truy cập an toàn Hermes Agent trên toàn cầu bằng nền tảng Cloudflare WARP và Zero Trust mà không cần mở bất kỳ cổng tường lửa nào.
10 PHÚT ĐỌC
6.2 Claude Desktop
Nhấp vào + New Client để bắt đầu tạo một AI agent client mới:

Chọn tab Claude Desktop và nhấp vào Register Client:

Một cặp thông tin bao gồm Client ID và Client Secret sẽ được hiển thị. Hãy sao chép và cất chúng ở nơi an toàn. Sau đó, nhấp vào mục Client Configuration để hiển thị cấu hình cấu hình MCP:

Trong ứng dụng Claude Desktop, nhấp vào Edit Config để mở tệp cấu hình máy chủ MCP cục bộ:

Dán cấu hình của TREK vào, thay thế các phần giữ chỗ bằng thông tin xác thực của bạn:
"mcpServers": {
"trek": {
"command": "npx",
"args": [
"mcp-remote",
"https://trek.pafor.me/mcp",
"--static-oauth-client-info",
"{\"client_id\": \"<your_client_id>\", \"client_secret\": \"<your_client_secret>\"}"
]
}
},
Khởi động lại Claude Desktop, khi đó máy chủ TREK sẽ hiển thị trạng thái đã kết nối trong mục Local MCP servers:

Bây giờ, hãy thử chạy một câu lệnh (prompt):

Hãy thử thêm một khoản chi phí bằng ngôn ngữ tự nhiên:
For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26/4/2025. Please add it as an expense without split to the trip.

Kiểm tra trang Costs, bạn sẽ thấy chi phí đã được tạo với trạng thái "No one paid yet" (Chưa có ai thanh toán) do không có thông tin người chi trả được nhắc đến trong câu lệnh:

Việc thêm đồ dùng vào danh sách hành lý cũng hoạt động tương tự:

Tải lại trang Packing List và bạn sẽ thấy cả ba vật dụng đã xuất hiện ở đó:

6.3 Gemini CLI (Đăng ký động)
Gemini CLI hỗ trợ tính năng đăng ký động (dynamic registration), nghĩa là bạn không cần tạo trước client. Chỉ cần thêm đoạn sau vào .gemini/settings.json:
"trek": {
"httpUrl": "https://trek.pafor.me/mcp",
"oauth": {
"enabled": true
}
}
Chạy lệnh gemini trong terminal và nhấp vào Approve khi hộp thoại yêu cầu xác thực xuất hiện:

Sau đó bắt đầu bằng một câu lệnh đơn giản:


6.4 Kimi CLI (Đăng ký động)
Cách tiếp cận tương tự — thêm đoạn cấu hình vào file mcp.json nằm trong thư mục /Users/<user>/.kimi/:
"trek": {
"type": "http",
"url": "https://trek.pafor.me/mcp",
"auth": "oauth"
}
Chạy lệnh kimi mcp auth trek trong terminal và nhấp vào Approve:

Sau khi hoàn tất xác thực, danh sách các công cụ có sẵn sẽ được liệt kê:

7. Trải nghiệm trên thiết bị di động
TREK là một Ứng dụng Web Lũy tiến (PWA) trên các thiết bị di động. Một service worker sẽ lưu bộ nhớ đệm (cache) cho các phần bản đồ và dữ liệu API, giúp lịch trình của bạn luôn có thể đọc được ngay cả khi ngoại tuyến (offline). Tuy nhiên, tính năng thông báo đẩy có thể gặp một chút độ trễ so với ứng dụng gốc (native app)."
Lời kết
Kết nối các tác nhân AI thông qua giao thức MCP giúp giảm thiểu phần lớn công việc tẻ nhạt khi nhập dữ liệu đặt chỗ chuyến bay và chỗ ở. Ngoài ra, các tác nhân cũng có thể đề xuất các địa điểm tham quan thú vị dựa trên ngày du lịch và mùa cụ thể trong năm của bạn. Chỉ với một cuộc hội thoại duy nhất với một AI agent, bạn có thể xử lý toàn bộ quy trình, từ tìm kiếm nghiên cứu, xây dựng lịch trình cho đến theo dõi ngân sách và sắp xếp hành lý.
Tuy nhiên, ứng dụng vẫn tồn tại một số lỗi kỹ thuật nhỏ. Ví dụ: khi nhập dữ liệu đặt chỗ từ tệp PDF, đơn vị tiền tệ sẽ tự động đặt mặc định theo đồng tiền gốc của chuyến đi thay vì đơn vị tiền tệ thực tế đã thanh toán. Ngoài ra, khi tạo một danh sách mới trong Collections, bất kỳ ảnh bìa nào được thêm vào trong quá trình tạo đều sẽ biến mất sau khi lưu, mặc dù bạn hoàn toàn có thể tự đính kèm lại một cách thủ công khi chỉnh sửa.
Bên cạnh đó, việc tự lưu trữ cũng tạo ra một rào cản kỹ thuật nhỏ khi bạn cần phải vận hành nó trên máy chủ của riêng mình. TREK được thiết kế chủ yếu dành cho những người đi du lịch thường xuyên và có kỳ vọng rất cao về cách họ quản lý và tổ chức dữ liệu du lịch của mình. Chúng tôi khuyên bạn nên thử nghiệm bản demo chính thức tại demo.liketrek.com trước khi quyết định tự host.
Tài liệu tham khảo:
Bài viết liên quan

Cộng tác
Tự host Buzz của Block: Không gian cộng tác giữa người và AI
Tìm hiểu cách tự host Block's Buzz trên VPS Linux phía sau Cloudflare. Vận hành không gian làm việc Nostr bảo mật giúp con người và AI cộng tác hiệu quả.
21 PHÚT ĐỌC
Cloudflare
Xây dựng hệ thống bộ nhớ AI vĩnh viễn trên Cloudflare
Tìm hiểu cách xây dựng hệ thống bộ nhớ AI vĩnh viễn và tự host trên Cloudflare với Second Brain và MCP. Chia sẻ ngữ cảnh giữa Claude và Obsidian hiệu quả.
11 PHÚT ĐỌC
AI & Tác tử
Cách kỹ năng Agent AI thay thế script khởi tạo ứng dụng Nuxt
Khởi tạo Nuxt trên Cloudflare Workers dễ dàng. Tìm hiểu lý do tại sao chúng tôi thay thế shell script bằng kỹ năng Agent AI và cách cài đặt qua npx skills.
6 PHÚT ĐỌC
Bài trước
Cách kỹ năng Agent AI thay thế script khởi tạo ứng dụng Nuxt
Khởi tạo Nuxt trên Cloudflare Workers dễ dàng. Tìm hiểu lý do tại sao chúng tôi thay thế shell script bằng kỹ năng Agent AI và cách cài đặt qua npx skills.

Bài sau
Tự host Buzz của Block: Không gian cộng tác giữa người và AI
Tìm hiểu cách tự host Block's Buzz trên VPS Linux phía sau Cloudflare. Vận hành không gian làm việc Nostr bảo mật giúp con người và AI cộng tác hiệu quả.