1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
28 KiB
OmniRoute — Deployment Guide on VM with Cloudflare (ไทย)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
🌐 ภาษา: 🇺🇸 English | 🇪🇹 አማርኛ | 🇸🇦 العربية | 🇦🇿 Azərbaycan dili | 🇧🇬 Български | 🇧🇩 বাংলা | 🇨🇿 Čeština | 🇩🇰 Dansk | 🇩🇪 Deutsch | 🇬🇷 Ελληνικά | 🇪🇸 Español | 🇪🇪 Eesti | 🇮🇷 فارسی | 🇫🇮 Suomi | 🇫🇷 Français | 🇮🇪 Gaeilge | 🇮🇳 ગુજરાતી | 🇳🇬 Hausa | 🇮🇱 עברית | 🇮🇳 हिन्दी | 🇭🇷 Hrvatski | 🇭🇺 Magyar | 🇦🇲 Հայերեն | 🇮🇩 Bahasa Indonesia | 🇳🇬 Igbo | 🇮🇹 Italiano | 🇯🇵 日本語 | 🇬🇪 ქართული | 🇰🇭 ខ្មែរ | 🇮🇳 ಕನ್ನಡ | 🇰🇷 한국어 | 🇱🇹 Lietuvių | 🇱🇻 Latviešu | 🇮🇳 മലയാളം | 🇮🇳 मराठी | 🇲🇾 Bahasa Melayu | 🇲🇹 Malti | 🇲🇲 မြန်မာ | 🇳🇵 नेपाली | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇮🇳 ଓଡ଼ିଆ | 🇮🇳 ਪੰਜਾਬੀ | 🇵🇭 Filipino | 🇵🇱 Polski | 🇵🇹 Português (Portugal) | 🇧🇷 Português (Brasil) | 🇷🇴 Română | 🇷🇺 Русский | 🇱🇰 සිංහල | 🇸🇰 Slovenčina | 🇸🇮 Slovenščina | 🇷🇸 Српски | 🇸🇪 Svenska | 🇰🇪 Kiswahili | 🇮🇳 தமிழ் | 🇮🇳 తెలుగు | 🇹🇭 ไทย | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇵🇰 اردو | 🇺🇿 Oʻzbekcha | 🇻🇳 Tiếng Việt | 🇳🇬 Yorùbá | 🇨🇳 中文 (简体) | 🇹🇼 中文 (繁體)
คู่มือฉบับสมบูรณ์สำหรับติดตั้งและกำหนดค่า OmniRoute บน VM (VPS) โดยใช้โดเมนที่จัดการผ่าน Cloudflare
ข้อกำหนดเบื้องต้น
| รายการ | ขั้นต่ำ | แนะนำ |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| ดิสก์ | 10 GB SSD | 25 GB SSD |
| ระบบปฏิบัติการ | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
| โดเมน | จดทะเบียนบน Cloudflare | — |
| Docker | Docker Engine 24+ | Docker 27+ |
ผู้ให้บริการที่ผ่านการทดสอบแล้ว: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail
1. กำหนดค่า VM
1.1 สร้างอินสแตนซ์
บนผู้ให้บริการ VPS ที่คุณเลือก:
- เลือก Ubuntu 24.04 LTS
- เลือกแผนขั้นต่ำ (1 vCPU / 1 GB RAM)
- ตั้งรหัสผ่าน root ที่รัดกุมหรือกำหนดค่าคีย์ SSH
- จดบันทึก IP สาธารณะ (เช่น
203.0.113.10)
1.2 เชื่อมต่อผ่าน SSH
ssh root@203.0.113.10
1.3 อัปเดตระบบ
apt update && apt upgrade -y
1.4 ติดตั้ง Docker
# ติดตั้งแพ็กเกจที่จำเป็น
apt install -y ca-certificates curl gnupg
# เพิ่มคลังแพ็กเกจอย่างเป็นทางการของ Docker
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 ติดตั้ง nginx
apt install -y nginx
1.6 กำหนดค่าไฟร์วอลล์ (UFW)
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP (เปลี่ยนเส้นทาง)
ufw allow 443/tcp # HTTPS
ufw enable
เคล็ดลับ: เพื่อความปลอดภัยสูงสุด ให้จำกัดพอร์ต 80 และ 443 เฉพาะ IP ของ Cloudflare เท่านั้น ดูส่วนความปลอดภัยขั้นสูง
2. ติดตั้ง OmniRoute
2.1 สร้างไดเรกทอรีการกำหนดค่า
mkdir -p /opt/omniroute
2.2 สร้างไฟล์ตัวแปรสภาพแวดล้อม
cat > /opt/omniroute/.env << 'EOF'
# === ความปลอดภัย ===
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 # จำเป็นในระบบใช้งานจริง: ใช้โดย Codex Responses WS bridge
# === แอป ===
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 (เปลี่ยนเป็นโดเมนของคุณ) ===
# URL พื้นฐานภายในสำหรับการสื่อสารระหว่างเซิร์ฟเวอร์ ซึ่งใช้กับงานตามกำหนดเวลา / การดึงข้อมูลจากตัวเอง
BASE_URL=http://127.0.0.1:20128
# URL สำหรับเบราว์เซอร์ ซึ่งใช้กับ OAuth callback, ลิงก์แดชบอร์ด และ URL สาธารณะที่สร้างขึ้น
NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com
# ตัวเลือกสำหรับกำหนด public origin อย่างชัดเจน เพื่อใช้แทนค่าปริยายสำหรับ URL ของแอสเซตสาธารณะที่สร้างขึ้น
# OMNIROUTE_PUBLIC_BASE_URL=https://llms.seudominio.com
# === การซิงค์กับคลาวด์ (ไม่บังคับ) ===
# CLOUD_URL=https://cloud.omniroute.online
# NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online
EOF
⚠️ สำคัญ: สร้างคีย์ลับที่ไม่ซ้ำกัน! ใช้
openssl rand -hex 32สำหรับแต่ละคีย์
2.3 เริ่มต้นคอนเทนเนอร์
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 ตรวจสอบว่าระบบกำลังทำงาน
docker ps | grep omniroute
docker logs omniroute --tail 20
ระบบควรแสดง: [DB] SQLite database ready และ listening on port 20128
3. กำหนดค่า nginx (Reverse Proxy)
3.1 สร้างใบรับรอง SSL (Cloudflare Origin)
ในแดชบอร์ด Cloudflare:
- ไปที่ SSL/TLS → Origin Server
- คลิก Create Certificate
- ใช้ค่าเริ่มต้นต่อไป (15 ปี, *.yourdomain.com)
- คัดลอก Origin Certificate และ Private Key
mkdir -p /etc/nginx/ssl
# วางใบรับรอง
nano /etc/nginx/ssl/origin.crt
# วางคีย์ส่วนตัว
nano /etc/nginx/ssl/origin.key
chmod 600 /etc/nginx/ssl/origin.key
3.2 การกำหนดค่า Nginx
cat > /etc/nginx/sites-available/omniroute << 'NGINX'
# เซิร์ฟเวอร์เริ่มต้น — ปิดกั้นการเข้าถึงโดยตรงผ่าน 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; # เปลี่ยนเป็นโดเมนของคุณ
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;
# รองรับ WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# SSE (Server-Sent Events) — การสตรีมการตอบกลับจาก AI
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
# เปลี่ยนเส้นทาง HTTP → HTTPS
server {
listen 80;
listen [::]:80;
server_name llms.yourdomain.com;
return 301 https://$server_name$request_uri;
}
NGINX
กำหนดระยะหมดเวลาของสตรีม reverse-proxy ให้สอดคล้องกับตัวแปรสภาพแวดล้อมสำหรับระยะหมดเวลาของ OmniRoute หากคุณเพิ่ม
FETCH_TIMEOUT_MS / STREAM_IDLE_TIMEOUT_MS ให้เพิ่ม proxy_read_timeout / proxy_send_timeout
ให้สูงกว่าเกณฑ์เดียวกัน
OmniRoute ใช้ NEXT_PUBLIC_BASE_URL เป็น origin หลักที่เบราว์เซอร์เข้าถึงสำหรับ callback ของ OAuth
และลิงก์สาธารณะที่สร้างขึ้น การเขียนข้อมูลผ่านแดชบอร์ดที่ผ่านการตรวจสอบสิทธิ์จะใช้คำขอแบบ same-origin
ร่วมกับการป้องกัน CSRF ที่ผูกกับเซสชัน จึงไม่จำเป็นต้องใช้ URL ฐานสาธารณะแบบคงที่ ส่วนเฮดเดอร์
X-Forwarded-* ข้างต้นยังคงมีประโยชน์ในฐานะข้อมูลเมตาสำหรับการกำหนดเส้นทาง แต่ไม่สามารถใช้แทน
การตั้งค่า URL สาธารณะอย่างชัดเจนเมื่อ OAuth หรือลิงก์สำหรับเบราว์เซอร์ที่สร้างขึ้นจำเป็นต้องใช้ URL ดังกล่าว เปิดใช้
OMNIROUTE_TRUST_PROXY เฉพาะเมื่อไคลเอนต์ไม่สามารถเข้าถึง OmniRoute ได้โดยตรง และพร็อกซีของคุณ
ลบ/สร้างเฮดเดอร์ forwarded ที่รับเข้ามาใหม่
3.3 เปิดใช้งานและทดสอบ
# ลบการกำหนดค่าเริ่มต้น
rm -f /etc/nginx/sites-enabled/default
# เปิดใช้งาน OmniRoute
ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
# ทดสอบและโหลดใหม่
nginx -t && systemctl reload nginx
4. กำหนดค่า Cloudflare DNS
4.1 เพิ่มระเบียน DNS
ในแดชบอร์ด Cloudflare → DNS:
| ประเภท | ชื่อ | เนื้อหา | พร็อกซี |
|---|---|---|---|
| A | llms |
203.0.113.10 (IP ของ VM) |
✅ เปิดใช้พร็อกซี |
4.2 กำหนดค่า SSL
ภายใต้ SSL/TLS → Overview:
- โหมด: Full (Strict)
ภายใต้ SSL/TLS → Edge Certificates:
- ใช้ HTTPS เสมอ: ✅ เปิด
- เวอร์ชัน TLS ขั้นต่ำ: TLS 1.2
- เขียน URL ใหม่เป็น HTTPS โดยอัตโนมัติ: ✅ เปิด
4.3 การทดสอบ
curl -sI https://llms.seudominio.com/health
# ควรส่งคืน HTTP/2 200
5. การดำเนินงานและการบำรุงรักษา
อัปเกรดเป็นเวอร์ชันใหม่
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
ดูบันทึก
docker logs -f omniroute # สตรีมแบบเรียลไทม์
docker logs omniroute --tail 50 # 50 บรรทัดล่าสุด
สำรองฐานข้อมูลด้วยตนเอง
# คัดลอกข้อมูลจากวอลุ่มไปยังโฮสต์
docker cp omniroute:/app/data ./backup-$(date +%F)
# หรือบีบอัดวอลุ่มทั้งหมด
docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data
กู้คืนจากข้อมูลสำรอง
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. การรักษาความปลอดภัยขั้นสูง
จำกัด nginx ให้เข้าถึงได้จาก IP ของ Cloudflare เท่านั้น
cat > /etc/nginx/cloudflare-ips.conf << 'CF'
# ช่วง IPv4 ของ Cloudflare — อัปเดตเป็นระยะ
# 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
เพิ่มข้อความต่อไปนี้ลงใน nginx.conf ภายในบล็อก http {}:
include /etc/nginx/cloudflare-ips.conf;
ติดตั้ง fail2ban
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# ตรวจสอบสถานะ
fail2ban-client status sshd
บล็อกการเข้าถึงพอร์ต Docker โดยตรง
# ป้องกันการเข้าถึงพอร์ต 20128 โดยตรงจากภายนอก
iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP
iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
# ทำให้กฎคงอยู่ถาวร
apt install -y iptables-persistent
netfilter-persistent save
7. ปรับใช้กับ Cloudflare Workers (ไม่บังคับ)
สำหรับการเข้าถึงจากระยะไกลผ่าน Cloudflare Workers (โดยไม่เปิดเผย VM โดยตรง):
# ในที่เก็บโค้ดภายในเครื่อง
cd omnirouteCloud
npm install
npx wrangler login
npx wrangler deploy
ดูคำแนะนำทีละขั้นตอนเกี่ยวกับ Cloudflare Tunnel ภายในที่เก็บโค้ดเพิ่มเติมได้ที่ TUNNELS_GUIDE.md โดย Worker แบบสแตนด์อโลนใน omnirouteCloud/ อยู่ในที่เก็บโค้ดประกอบแยกต่างหาก
สรุปพอร์ต
| พอร์ต | บริการ | การเข้าถึง |
|---|---|---|
| 22 | SSH | สาธารณะ (พร้อม fail2ban) |
| 80 | nginx HTTP | เปลี่ยนเส้นทาง → HTTPS |
| 443 | nginx HTTPS | ผ่าน Cloudflare Proxy |
| 20128 | OmniRoute | เฉพาะ localhost (ผ่าน nginx) |
การเพิ่มประสิทธิภาพสำหรับหน่วยความจำน้อย / VPS ขนาดเล็ก
สำหรับการติดตั้งใช้งานบนอินสแตนซ์ VPS ขนาดเล็ก (RAM 1 GB หรือน้อยกว่า):
- ปิดใช้งานบริการเบื้องหลัง — ตั้งค่า
OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1เพื่อข้ามตัวกำหนดเวลา, เซิร์ฟเวอร์ MCP และงานบำรุงรักษาตามรอบ โปรดดูdocs/reference/ENVIRONMENT.md - ใช้โหมด SQLite WAL — เปิดใช้งานเป็นค่าเริ่มต้น ช่วยลดการใช้หน่วยความจำสูงสุดระหว่างการอ่านพร้อมกัน
- จำกัดฮีป V8 — ตั้งค่า
OMNIROUTE_MEMORY_MB(เช่น512) เพื่อไม่ให้รันไทม์ปรับเพดานสูงกว่าขนาดของ VM โปรดดูdocs/reference/ENVIRONMENT.md - การควบคุมคำขอที่ใช้ทรัพยากรสูงจะปรับขนาดอัตโนมัติตามขีดจำกัดฮีป -- เมื่อตั้งค่า
OMNIROUTE_MEMORY_MBข้างต้นแล้ว งบประมาณจำนวนไบต์สำหรับการรับข้อมูลเข้า (OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES) จะคำนวณจากเพดานเดียวกันโดยอัตโนมัติ ดังนั้น VM ที่มีหน่วยความจำจำกัดจะได้รับงบประมาณสำหรับคำขอพร้อมกันที่น้อยลงอยู่แล้วโดยไม่ต้องปรับแต่งเพิ่มเติม ส่วนคำขอที่เกินขีดจำกัดจะได้รับ503ที่สามารถลองใหม่ได้พร้อมRetry-Afterแทนที่จะต้องแย่งใช้หน่วยความจำ ตั้งค่าขีดจำกัดจำนวนคำขอแบบเดิมOMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHTเฉพาะเมื่อคุณต้องการกำหนดเพดานตายตัวเพิ่มเติมเท่านั้น - หลีกเลี่ยงการใช้
next buildบน VPS — บิลด์ภายในเครื่องแล้วปรับใช้งานเอาต์พุตแบบสแตนด์อโลน (.next/standalone/) - ตรวจสอบด้วย
top/free -m— โดยทั่วไป OmniRoute ใช้ RSS 200-400 MB ขณะไม่ได้ทำงานบน VM ขนาด 1 GB