# OmniRoute — Deployment Guide on VM with Cloudflare (Tiếng Việt) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇹 [am](../../../am/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇬🇷 [el](../../../el/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇪 [et](../../../et/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇭 [km](../../../km/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇲 [my](../../../my/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [or](../../../or/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇰 [si](../../../si/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md) --- 🌐 **Languages:** 🇺🇸 [English](../../../../ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇹 [am](../../../am/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇬🇷 [el](../../../el/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇪🇪 [et](../../../et/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇭 [km](../../../km/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇲🇲 [my](../../../my/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [or](../../../or/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇱🇰 [si](../../../si/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/VM_DEPLOYMENT_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/VM_DEPLOYMENT_GUIDE.md) Hướng dẫn đầy đủ để cài đặt và cấu hình OmniRoute trên máy ảo (VPS) với tên miền được quản lý thông qua Cloudflare. --- ## Điều kiện tiên quyết | Hạng mục | Tối thiểu | Khuyến nghị | | ------------ | -------------------------- | ---------------- | | **CPU** | 1 vCPU | 2 vCPU | | **RAM** | 1 GB | 2 GB | | **Ổ đĩa** | SSD 10 GB | SSD 25 GB | | **HĐH** | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS | | **Tên miền** | Đã đăng ký trên Cloudflare | — | | **Docker** | Docker Engine 24+ | Docker 27+ | **Các nhà cung cấp đã được kiểm thử**: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail. --- ## 1. Cấu hình máy ảo ### 1.1 Tạo máy chủ Trên nhà cung cấp VPS mà bạn ưu tiên: - Chọn Ubuntu 24.04 LTS - Chọn gói tối thiểu (1 vCPU / 1 GB RAM) - Đặt mật khẩu root mạnh hoặc cấu hình khóa SSH - Ghi lại **IP công khai** (ví dụ: `203.0.113.10`) ### 1.2 Kết nối qua SSH ```bash ssh root@203.0.113.10 ``` ### 1.3 Cập nhật hệ thống ```bash apt update && apt upgrade -y ``` ### 1.4 Cài đặt Docker ```bash # Cài đặt các phần phụ thuộc apt install -y ca-certificates curl gnupg # Thêm kho lưu trữ Docker chính thức install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $ (. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin ``` ### 1.5 Cài đặt nginx ```bash apt install -y nginx ``` ### 1.6 Cấu hình tường lửa (UFW) ```bash ufw default deny incoming ufw default allow outgoing ufw allow 22/tcp # SSH ufw allow 80/tcp # HTTP (chuyển hướng) ufw allow 443/tcp # HTTPS ufw enable ``` > **Mẹo**: Để đạt mức bảo mật tối đa, chỉ cho phép các IP của Cloudflare truy cập cổng 80 và 443. Xem phần [Bảo mật nâng cao](#advanced-security). --- ## 2. Cài đặt OmniRoute ### 2.1 Tạo thư mục cấu hình ```bash mkdir -p /opt/omniroute ``` ### 2.2 Tạo tệp biến môi trường ```bash cat > /opt/omniroute/.env << 'EOF' # === Bảo mật === JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEY INITIAL_PASSWORD=YourSecurePassword123! API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEY STORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEY STORAGE_ENCRYPTION_KEY_VERSION=v1 MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALT OMNIROUTE_WS_BRIDGE_SECRET=REPLACE-WITH-WS-BRIDGE-SECRET # BẮT BUỘC trong môi trường production: được cầu nối Codex Responses WS sử dụng # === Ứng dụng === PORT=20128 NODE_ENV=production HOSTNAME=0.0.0.0 DATA_DIR=/app/data APP_LOG_TO_FILE=true AUTH_COOKIE_SECURE=true REQUIRE_API_KEY=false # === URL (thay đổi thành tên miền của bạn) === # URL cơ sở nội bộ giữa các máy chủ dành cho tác vụ được lên lịch / yêu cầu tự truy xuất. BASE_URL=http://127.0.0.1:20128 # URL dành cho trình duyệt, được sử dụng cho lệnh gọi lại OAuth, liên kết bảng điều khiển và URL công khai được tạo. NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com # Tùy chọn ghi đè rõ ràng nguồn công khai cho các URL tài nguyên công khai được tạo. # OMNIROUTE_PUBLIC_BASE_URL=https://llms.seudominio.com # === Đồng bộ hóa đám mây (tùy chọn) === # CLOUD_URL=https://cloud.omniroute.online # NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online EOF ``` > ⚠️ **QUAN TRỌNG**: Hãy tạo các khóa bí mật riêng biệt! Sử dụng `openssl rand -hex 32` cho mỗi khóa. ### 2.3 Khởi động container ```bash docker pull diegosouzapw/omniroute:latest docker run -d \ --name omniroute \ --restart unless-stopped \ --env-file /opt/omniroute/.env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ### 2.4 Xác minh rằng container đang chạy ```bash docker ps | grep omniroute docker logs omniroute --tail 20 ``` Kết quả sẽ hiển thị: `[DB] SQLite database ready` và `listening on port 20128`. --- ## 3. Cấu hình nginx (Reverse Proxy) ### 3.1 Tạo chứng chỉ SSL (Cloudflare Origin) Trong bảng điều khiển Cloudflare: 1. Đi tới **SSL/TLS → Origin Server** 2. Nhấp vào **Create Certificate** 3. Giữ nguyên các giá trị mặc định (15 năm, \*.yourdomain.com) 4. Sao chép **Origin Certificate** và **Private Key** ```bash mkdir -p /etc/nginx/ssl # Dán chứng chỉ nano /etc/nginx/ssl/origin.crt # Dán khóa riêng tư nano /etc/nginx/ssl/origin.key chmod 600 /etc/nginx/ssl/origin.key ``` ### 3.2 Cấu hình Nginx ```bash cat > /etc/nginx/sites-available/omniroute << 'NGINX' # Máy chủ mặc định — chặn truy cập trực tiếp qua IP server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/nginx/ssl/origin.crt; ssl_certificate_key /etc/nginx/ssl/origin.key; server_name _; return 444; } # OmniRoute — HTTPS server { listen 443 ssl; listen [::]:443 ssl; server_name llms.yourdomain.com; # Thay bằng tên miền của bạn ssl_certificate /etc/nginx/ssl/origin.crt; ssl_certificate_key /etc/nginx/ssl/origin.key; ssl_protocols TLSv1.2 TLSv1.3; client_max_body_size 100M; location / { proxy_pass http://127.0.0.1:20128; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Hỗ trợ WebSocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # SSE (Server-Sent Events) — truyền phát phản hồi AI proxy_buffering off; proxy_cache off; proxy_read_timeout 600s; proxy_send_timeout 600s; } } # Chuyển hướng HTTP → HTTPS server { listen 80; listen [::]:80; server_name llms.yourdomain.com; return 301 https://$server_name$request_uri; } NGINX ``` Duy trì thời gian chờ luồng của reverse proxy đồng bộ với các biến môi trường thời gian chờ của OmniRoute. Nếu bạn tăng `FETCH_TIMEOUT_MS` / `STREAM_IDLE_TIMEOUT_MS`, hãy tăng `proxy_read_timeout` / `proxy_send_timeout` cao hơn cùng ngưỡng đó. OmniRoute sử dụng `NEXT_PUBLIC_BASE_URL` làm origin chuẩn mà trình duyệt truy cập cho các callback OAuth và các liên kết công khai được tạo. Các thao tác ghi đã xác thực trên bảng điều khiển sử dụng các yêu cầu cùng origin kết hợp với cơ chế bảo vệ CSRF gắn với phiên, vì vậy chúng không yêu cầu URL cơ sở công khai tĩnh. Các header `X-Forwarded-*` ở trên vẫn là metadata định tuyến hữu ích, nhưng chúng không thể thay thế việc thiết lập URL công khai rõ ràng khi OAuth hoặc các liên kết trình duyệt được tạo cần đến URL đó. Chỉ bật `OMNIROUTE_TRUST_PROXY` nếu máy khách không thể truy cập trực tiếp OmniRoute và proxy của bạn loại bỏ/tạo lại các header được chuyển tiếp đến. ### 3.3 Kích hoạt và kiểm tra ```bash # Xóa cấu hình mặc định rm -f /etc/nginx/sites-enabled/default # Kích hoạt OmniRoute ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute # Kiểm tra và tải lại nginx -t && systemctl reload nginx ``` --- ## 4. Cấu hình DNS Cloudflare ### 4.1 Thêm bản ghi DNS Trong bảng điều khiển Cloudflare → DNS: | Loại | Tên | Nội dung | Proxy | | ---- | ------ | ---------------------- | --------------- | | A | `llms` | `203.0.113.10` (IP VM) | ✅ Đã bật proxy | ### 4.2 Cấu hình SSL Trong **SSL/TLS → Overview**: - Chế độ: **Full (Strict)** Trong **SSL/TLS → Edge Certificates**: - Luôn sử dụng HTTPS: ✅ Bật - Phiên bản TLS tối thiểu: TLS 1.2 - Tự động viết lại HTTPS: ✅ Bật ### 4.3 Kiểm tra ```bash curl -sI https://llms.seudominio.com/health # Phải trả về HTTP/2 200 ``` --- ## 5. Vận hành và bảo trì ### Nâng cấp lên phiên bản mới ```bash docker pull diegosouzapw/omniroute:latest docker stop omniroute && docker rm omniroute docker run -d --name omniroute --restart unless-stopped \ --env-file /opt/omniroute/.env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ### Xem nhật ký ```bash docker logs -f omniroute # Luồng thời gian thực docker logs omniroute --tail 50 # 50 dòng cuối ``` ### Sao lưu cơ sở dữ liệu thủ công ```bash # Sao chép dữ liệu từ volume sang máy chủ docker cp omniroute:/app/data ./backup-$(date +%F) # Hoặc nén toàn bộ volume docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data ``` ### Khôi phục từ bản sao lưu ```bash docker stop omniroute docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /" docker start omniroute ``` --- ## 6. Bảo mật nâng cao ### Giới hạn nginx chỉ cho phép các IP của Cloudflare ```bash cat > /etc/nginx/cloudflare-ips.conf << 'CF' # Các dải IPv4 của Cloudflare — cập nhật định kỳ # https://www.cloudflare.com/ips-v4/ set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; real_ip_header CF-Connecting-IP; CF ``` Thêm nội dung sau vào `nginx.conf` bên trong khối `http {}`: ```nginx include /etc/nginx/cloudflare-ips.conf; ``` ### Cài đặt fail2ban ```bash apt install -y fail2ban systemctl enable fail2ban systemctl start fail2ban # Kiểm tra trạng thái fail2ban-client status sshd ``` ### Chặn truy cập trực tiếp vào cổng Docker ```bash # Ngăn truy cập trực tiếp từ bên ngoài vào cổng 20128 iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT # Lưu các quy tắc để duy trì sau khi khởi động lại apt install -y iptables-persistent netfilter-persistent save ``` --- ## 7. Triển khai lên Cloudflare Workers (Tùy chọn) Để truy cập từ xa thông qua Cloudflare Workers (mà không cần để lộ VM trực tiếp): ```bash # Trong kho lưu trữ cục bộ cd omnirouteCloud npm install npx wrangler login npx wrangler deploy ``` Xem thêm [TUNNELS_GUIDE.md](./TUNNELS_GUIDE.md) để biết hướng dẫn từng bước về Cloudflare Tunnel trong kho lưu trữ. Worker `omnirouteCloud/` độc lập nằm trong một kho lưu trữ đi kèm riêng biệt. --- ## Tóm tắt cổng | Cổng | Dịch vụ | Truy cập | | ----- | ----------- | ------------------------- | | 22 | SSH | Công khai (với fail2ban) | | 80 | nginx HTTP | Chuyển hướng → HTTPS | | 443 | nginx HTTPS | Qua Cloudflare Proxy | | 20128 | OmniRoute | Chỉ localhost (qua nginx) | ## Tối ưu hóa cho VPS nhỏ / ít bộ nhớ Đối với các bản triển khai trên VPS nhỏ (RAM 1 GB trở xuống): - **Tắt các dịch vụ nền** — đặt `OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1` để bỏ qua bộ lập lịch, máy chủ MCP và các tác vụ bảo trì định kỳ. Xem `docs/reference/ENVIRONMENT.md`. - **Sử dụng chế độ WAL của SQLite** — được bật theo mặc định, giúp giảm mức sử dụng bộ nhớ cao nhất khi có các thao tác đọc đồng thời. - **Giới hạn heap V8** — đặt `OMNIROUTE_MEMORY_MB` (ví dụ: `512`) để môi trường thực thi không hiệu chỉnh mức trần lớn hơn máy ảo. Xem `docs/reference/ENVIRONMENT.md`. - **Cơ chế tiếp nhận tác vụ nặng tự động điều chỉnh theo giới hạn heap** -- sau khi đặt `OMNIROUTE_MEMORY_MB` như trên, ngân sách byte tiếp nhận (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`) sẽ được suy ra từ chính mức trần đó, vì vậy máy ảo bị giới hạn bộ nhớ sẽ tự động có ngân sách yêu cầu đồng thời nhỏ hơn mà không cần tinh chỉnh thêm; các yêu cầu vượt quá giới hạn sẽ nhận phản hồi `503` có thể thử lại cùng với `Retry-After`, thay vì cạnh tranh bộ nhớ. Chỉ đặt giới hạn số lượng yêu cầu kiểu cũ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` nếu bạn cần thêm một mức trần cứng. - **Tránh chạy `next build` trên VPS** — hãy build cục bộ và triển khai đầu ra độc lập (`.next/standalone/`). - **Giám sát bằng `top` / `free -m`** — OmniRoute thường sử dụng 200-400 MB RSS khi nhàn rỗi trên máy ảo 1 GB.