SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor

วิธีติดตั้ง Rakazo บน VPS ด้วยตัวเองแบบครบวงจร

เรียนรู้วิธีติดตั้ง Rakazo บน VPS ด้วย Docker Compose พร้อมตั้งค่า Node 22, pnpm, Postgres และ Graphile Worker รวมถึงคำแนะนำการเลือก Sandbox และการจัดการคีย์สำหรับบอท AI ของคุณ

สิ่งที่ Rakazo ทำงานอยู่จริงในการ self-host

การ self-host Rakazo หมายถึงการรัน 5 ส่วนประกอบบนเซิร์ฟเวอร์ Linux เครื่องเดียว ได้แก่ PostgreSQL, กระบวนการ Graphile Worker, API, เว็บแอปพลิเคชัน และ sandbox container หนึ่งรายการสำหรับบอทแต่ละตัวที่กำลังทำงานอยู่ Rakazo เป็นทางเลือกโอเพนซอร์สแทน Grok Bot ซึ่งเผยแพร่โดย elie222 ภายใต้สัญญาอนุญาต Apache 2.0 บอทแต่ละตัวจะมี thread, พื้นที่ประมวลผล, หน่วยความจำ และประวัติการทำงานเป็นของตัวเอง อีกทั้งยังสามารถสร้าง peer หรือ subagent ที่มีอายุการใช้งานสั้นได้

เหตุผลข้างต้นคือสาเหตุที่ระบบนี้ควรติดตั้งบน VPS (virtual private server) ไม่ใช่บนคอมพิวเตอร์ส่วนบุคคล บอทที่ต้องเก็บข้อมูลในหน่วยความจำและรันงานตามกำหนดการจำเป็นต้องเข้าถึงได้ตลอดเวลาแม้ในขณะที่คุณหลับ หากใช้แล็ปท็อปที่เข้าสู่โหมดพักเครื่อง (suspend) คิวงานจะถูกตัดขาด

Rakazo ยังอยู่ในช่วง early beta ณ เดือนสิงหาคม 2026 ดังนั้นให้ถือว่านี่เป็นระบบที่กำลังพัฒนามากกว่าจะเป็นผลิตภัณฑ์สำเร็จรูป stack ทั้งหมดใช้ TypeScript: React 19 และ Vite สำหรับเว็บแอปพลิเคชัน, Hono สำหรับ API, Postgres ร่วมกับ Prisma, Better Auth สำหรับระบบบัญชี และ Graphile Worker สำหรับงานเบื้องหลัง Graphile Worker จะจัดเก็บคิวงานไว้ภายใน Postgres ดังนั้นจึงไม่จำเป็นต้องใช้ Redis หรือระบบจัดเก็บข้อมูลที่สอง .env.example กำหนดค่า WAKEUP_DRIVER=graphile ซึ่งหมายความว่าการตื่นขึ้นของบอทคือการทำงานที่อ้างอิงจาก Postgres หากหยุดการทำงานของ Postgres การดำเนินการตามกำหนดการของบอททั้งหมดจะหยุดลงตามไปด้วย หากคุณต้องการประกอบเอเจนต์ขึ้นเองจากชิ้นส่วนต่างๆ แทนที่จะรันผลิตภัณฑ์ของผู้อื่น การสร้างเอเจนต์ของคุณเองจากส่วนประกอบต่างๆ คืออีกทางเลือกหนึ่ง

เหตุผลที่แผน 1 GB ไม่เพียงพอต่อการใช้งานนี้

ลองนับจำนวนโพรเซสดู Postgres คือหนึ่งโพรเซส API คือโพรเซส Node หนึ่งตัว Worker คือตัวที่สอง เว็บแอปคือตัวที่สาม และ Sandbox supervisor คือตัวที่สี่ จากนั้นบอททุกตัวที่ทำงานอยู่จะได้รับคอนเทนเนอร์ที่บรรจุเดสก์ท็อป Linux แบบกราฟิกและเบราว์เซอร์ไว้

เอกสารการติดตั้งด้วยตนเองของโปรเจกต์ระบุตัวเลขที่ตรงไปตรงมาไว้หนึ่งค่า คือเครื่องขนาด 2 vCPU และ 4 GB นั้นเพียงพอสำหรับ API, Worker และ Postgres ในกรณีที่ E2B เป็นผู้ดูแลเดสก์ท็อปของบอท นั่นคือตัวเลขสำหรับส่วนควบคุม (control plane) เพียงอย่างเดียว โดยส่วนที่ใช้ทรัพยากรสูงจะถูกโฮสต์ไว้ที่อื่น หากคุณตั้งค่า SANDBOX_PROVIDER=docker เดสก์ท็อปเหล่านั้นจะย้ายมาอยู่บน VPS ของคุณ ดังนั้น 4 GB จึงกลายเป็นค่าเริ่มต้นขั้นต่ำแทนที่จะเป็นเป้าหมายสูงสุด ควรเริ่มต้นที่ 8 GB หากคุณวางแผนจะให้บอททำงานมากกว่าหนึ่งตัวพร้อมกัน และวัดค่าการใช้งานจริงด้วย docker stats ในขณะที่บอทกำลังทำงาน เบราว์เซอร์ที่อยู่ภายใน Sandbox คือตัวการที่ทำให้การใช้หน่วยความจำพุ่งสูงขึ้น ดังนั้นข้อมูลในสเปกชีตจึงบอกคุณไม่ได้ทั้งหมด สำหรับวิธีการทั่วไปในการประเมินขนาดเครื่องสำหรับงาน Agent คุณสามารถดูรายละเอียดการวัดค่าได้ที่ RAM และ CPU ที่ VPS สำหรับ Agent ต้องการจริงๆ มีเท่าใด

มีการตั้งค่าหนึ่งอย่างที่ช่วยป้องกันไม่ให้สถานการณ์เลวร้ายลง .env.example มาพร้อมกับ SANDBOX_IDLE_MS=600000 โดยมีคำอธิบายว่ามันจะหยุดการทำงานของคอมพิวเตอร์ E2B หรือหยุดคอนเทนเนอร์ Docker หลังจากผ่านไปกี่มิลลิวินาทีที่ไม่มีการใช้งาน หากไม่มีการใช้งานเป็นเวลา 10 นาที คอมพิวเตอร์นั้นจะถูกลบออก ค่าต่ำสุดที่ยอมรับได้คือ 30000 หากไม่มีการตั้งค่านี้ บอททุกตัวที่คุณเคยเปิดใช้งานจะค้างอยู่ในหน่วยความจำตลอดไป

พื้นที่ดิสก์ก็มีความสำคัญเช่นกัน อิมเมจของ Sandbox, Node modules และโวลุ่มของ Postgres ใช้ดิสก์ร่วมกัน ดังนั้น 40 GB จึงเป็นจุดเริ่มต้นที่เหมาะสม

ตรึงเวอร์ชันก่อนทำการ clone

Rakazo มีการพัฒนาอย่างรวดเร็วและ main ไม่ใช่เวอร์ชันที่ปล่อยออกมาอย่างเป็นทางการ ณ วันที่ 16 สิงหาคม 2026 repository นี้มี tag เพียงรายการเดียวคือ v0.1.0-beta ซึ่งเผยแพร่เมื่อวันที่ 13 สิงหาคม 2026 และถูกระบุว่าเป็นรุ่นทดสอบ (prerelease)

git clone https://github.com/elie222/rakazo.git
cd rakazo
git checkout 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb
git log -1 --format='%H %ci'

commit ดังกล่าวคือจุดที่ v0.1.0-beta อ้างถึง ให้ทำการตรึงที่ commit แทนที่จะเป็น branch หรือ tag เนื่องจาก branch สามารถเปลี่ยนแปลงได้เมื่อมีการ git pull ครั้งถัดไป และ tag เป็นเพียงป้ายกำกับที่ผู้ดูแลสามารถย้ายไปชี้ที่อื่นได้ ดังนั้นทั้งสองอย่างจึงไม่สามารถระบุสถานะของโค้ดที่คุณจะกลับมาใช้งานซ้ำได้ ในขณะที่ตัวระบุ commit นั้นไม่สามารถเปลี่ยนแปลงได้ ให้จดบันทึกค่านี้ไว้พร้อมกับข้อมูลเซิร์ฟเวอร์อื่นๆ ของคุณ เพราะเมื่อการอัปเกรดทำให้ระบบเสียหาย วิธีแก้ไขที่รวดเร็วคือการใช้ git checkout <old commit> และสร้างระบบใหม่ ซึ่งจะทำได้ก็ต่อเมื่อคุณทราบว่า commit ใดที่ทำงานได้อย่างถูกต้องก่อนหน้านี้เท่านั้น

ข้อกำหนด: Node 22, pnpm 9 และ Docker

node -v
pnpm -v
docker --version

package.json ประกาศใช้ "engines": { "node": ">=22" } และ "packageManager": "pnpm@9.15.0" ดังนั้น node -v จะต้องแสดงผล v22 หรือเวอร์ชันที่สูงกว่า แพ็กเกจ Node ในคลังซอฟต์แวร์ของ Ubuntu มักจะมีเวอร์ชันเก่ากว่านั้น ให้ติดตั้งผ่าน NodeSource หรือ nvm แทน ส่วน pnpm จะมาพร้อมกับ Node ผ่านทาง corepack:

corepack enable
corepack prepare pnpm@9.15.0 --activate

Docker Engine และปลั๊กอิน compose จะจัดการส่วนที่เหลือทั้งหมด โดยผู้ใช้ของคุณจะต้องสามารถเข้าถึง daemon ได้ หาก docker ps ตอบกลับมาว่า permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock ให้เพิ่มผู้ใช้ของคุณเข้าในกลุ่ม docker แล้วเปิด login shell ใหม่ โปรดทราบถึงสิทธิ์ที่ได้รับก่อนดำเนินการ: การเป็นสมาชิกในกลุ่ม docker มีค่าเท่ากับการเป็น root บนเครื่องนั้น เนื่องจากทุกคนในกลุ่มนี้สามารถสั่งเริ่ม container ที่ mount ระบบไฟล์ของโฮสต์ได้

กำหนดค่า .env แล้วเริ่มการทำงานของ Postgres

cp .env.example .env
chmod 600 .env

ต้องเปลี่ยนค่า 2 รายการก่อนที่จะเปิดให้เข้าถึงผ่านเครือข่าย .env.example มาพร้อมกับ BETTER_AUTH_SECRET=replace-with-32-plus-character-secret และ ENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase ตัว Rakazo จะปฏิเสธค่าตัวอย่างเหล่านี้หากไม่ใช่สภาพแวดล้อมสำหรับการพัฒนา ดังนั้นการปรับใช้ที่ตั้งค่าไม่สมบูรณ์จะล้มเหลวทันทีแทนที่จะทำงานด้วยรหัสลับที่ถูกเผยแพร่ไว้ใน repository

openssl rand -base64 48
openssl rand -hex 32

จากนั้นให้เริ่มการทำงานของฐานข้อมูลแยกต่างหากและรันการทำ migrations

docker compose --env-file .env -f infra/compose/docker-compose.yml up postgres -d
pnpm install
pnpm db:generate
pnpm db:migrate
pnpm sandbox:build

pnpm sandbox:build จะสร้าง image ของ bot ตามที่กำหนดไว้ใน package.json ว่าเป็น docker build -t rakazo/computer:local infra/sandboxes/computer เนื่องจากเป็น image แบบกราฟิก การ build ครั้งแรกจึงต้องดึงข้อมูลจำนวนมากและใช้เวลานาน ยืนยันว่า image ถูกสร้างสำเร็จด้วย docker image ls rakazo/computer ซึ่งควรแสดงผลลัพธ์ออกมาหนึ่งแถว

ไฟล์ compose จะเผยแพร่ Postgres ไว้ที่ 127.0.0.1:5433:5432 ซึ่งจำกัดเฉพาะ loopback เท่านั้น ให้คงค่านี้ไว้ตามเดิม ข้อมูลประจำตัวสำหรับการพัฒนาคือ rakazo:rakazo ซึ่งอยู่ใน repository และพอร์ต Postgres ที่เข้าถึงได้จากอินเทอร์เน็ตพร้อมรหัสผ่านที่เปิดเผยจะถูกสแกนพบภายในเวลาไม่กี่ชั่วโมง ไฟล์ compose สำหรับการใช้งานจริงจะอ่านค่าจาก POSTGRES_PASSWORD แทน ดังนั้นให้ตั้งค่าเป็นสตริงสุ่มเมื่อคุณดำเนินการถึงขั้นตอนนี้

การเรียกใช้งานครั้งแรก

pnpm dev

คำสั่งนี้จะเริ่มการทำงาน 4 ส่วน ได้แก่ API บนพอร์ต 3100, Graphile Worker, เว็บแอป Vite บนพอร์ต 5173 และ sandbox supervisor บนพอร์ต 7091 แอปพลิเคชันจะอยู่ที่ http://127.0.0.1:5173 ซึ่งคุณควรจะเห็นหน้าสำหรับลงชื่อเข้าใช้

หากคุณใช้งานบน VPS ซึ่งคุณไม่ได้นั่งอยู่หน้าเครื่องโดยตรง คุณไม่ควรเปิดพอร์ต 5173 สู่สาธารณะเพื่อให้เข้าถึงได้ แต่ควรใช้วิธี forward พอร์ตผ่าน SSH (secure shell) จากเครื่องของคุณแทน

ssh -L 5173:127.0.0.1:5173 -L 3100:127.0.0.1:3100 you@your-server

โปรดระมัดระวังความแตกต่างระหว่างวิธีการเรียกใช้งานทั้งสองแบบ pnpm dev จะรัน Vite บนโฮสต์โดยผูกไว้กับ localhost เท่านั้น ในขณะที่บริการ web ในไฟล์ compose จะเปิดพอร์ต 5173:5173 ไว้บนทุกอินเทอร์เฟซ หากคุณสั่งรัน stack สำหรับการพัฒนาเต็มรูปแบบบน VPS ที่เปิดสู่สาธารณะ แอปพลิเคชันของคุณจะถูกเปิดเผย ดังนั้นสำหรับบริการใดก็ตามที่คุณต้องการเปิดทิ้งไว้ ให้ใช้ไฟล์สำหรับ production และ reverse proxy แทน

ผู้ให้บริการ sandbox รายใดที่ปลอดภัยบนเซิร์ฟเวอร์?

นี่คือการตั้งค่าหนึ่งเดียวที่ต้องทำให้ถูกต้อง SANDBOX_PROVIDER ใน .env รับค่าได้สี่แบบ

  • docker เป็นค่าเริ่มต้น บอทแต่ละตัวจะได้ container ของตัวเองบนเครื่องของคุณ ซึ่งสร้างจากอิมเมจที่ pnpm sandbox:build ผลิตขึ้น นี่เป็นวิธีติดตั้งแบบ self-hosted ที่เร็วที่สุด
  • e2b จะรันคอมพิวเตอร์ของบอทบน E2B และต้องใช้ E2B_API_KEY โครงการแนะนำให้ใช้สำหรับระบบที่เปิดให้สาธารณะหรือมีผู้ใช้หลายคน เพราะจะแยกคอมพิวเตอร์ของบอทออกจากโฮสต์ที่รัน API และฐานข้อมูลของคุณ
  • desktop จะรันคำสั่งของบอทโดยตรงบนโฮสต์ของ API และ worker คำแนะนำใน repository ระบุไว้อย่างชัดเจนว่า: ห้ามใช้บนเซิร์ฟเวอร์สาธารณะหรือเซิร์ฟเวอร์ที่ใช้งานร่วมกับผู้อื่น
  • fake เป็น emulator แบบ in-process สำหรับการทดสอบ ไม่ใช่ runtime สำหรับใช้งานจริง

โปรดปฏิบัติตามคำเตือนเรื่อง desktop mode อย่างเคร่งครัด ในโหมด desktop จะไม่มีขอบเขตการแยกส่วน (isolation boundary) ใดๆ ทั้งสิ้น ดังนั้นบอทจะรัน shell command ในฐานะผู้ใช้ที่รันกระบวนการ API โดยใช้ home directory, SSH keys, cloud credentials และ .env ของผู้ใช้คนนั้น ข้อความในหน้าเว็บที่บอทอ่านจะกลายเป็นคำสั่งบนเซิร์ฟเวอร์ของคุณ การใช้ desktop mode บนเซิร์ฟเวอร์เป็นสาเหตุที่ทำให้บอทเข้าถึงข้อมูลรับรองของคุณได้ ให้ใช้โหมดนี้เฉพาะบนเครื่องที่คุณใช้งานอยู่ตรงหน้าเท่านั้น หรือไม่ก็ไม่ต้องใช้เลย

docker เป็นขอบเขตการป้องกันที่ใช้งานได้จริงแต่ยังไม่สมบูรณ์แบบ บอทตัวหนึ่งไม่สามารถอ่านไฟล์ของบอทอีกตัวได้เพราะแต่ละตัวมี container แยกกัน อย่างไรก็ตาม supervisor ที่สร้าง container เหล่านั้นจะทำการ mount /var/run/docker.sock ไว้ และการควบคุม Docker socket ของโฮสต์ก็เท่ากับการควบคุมตัวโฮสต์เอง ดังนั้นควรเก็บ supervisor ไว้เป็นส่วนตัว .env.example ระบุว่า SANDBOX_SUPERVISOR_TOKEN เป็นข้อมูลรับรองบริการแยกต่างหากที่เป็นทางเลือก โดยมีค่าเริ่มต้นเป็น BETTER_AUTH_SECRET หากปล่อยว่างไว้ ซึ่งหมายความว่าการทิ้ง secret นั้นไว้ที่ค่า placeholder จะเป็นการปกป้องบริการที่สร้าง container ด้วยสตริงที่ใครๆ ก็อ่านได้บน GitHub ให้ตั้งค่าทั้งสองค่านี้ สำหรับการแยกส่วนที่แข็งแกร่งที่สุดที่มีให้ในที่นี้ ให้ใช้ e2b หรือจัดหาเครื่องที่ไม่มีข้อมูลอื่นใดนอกจาก Rakazo ให้กับมัน นี่เป็นเหตุผลเดียวกับ การรัน coding agent ใน VM ที่ทิ้งได้: วิธีที่ประหยัดที่สุดในการรับมือหาก agent ทำงานผิดพลาด คือการทำให้เครื่องที่มันรันอยู่ไม่มีมูลค่าใดๆ ให้สูญเสีย

API key ของโมเดลควรเก็บไว้ที่ไหน

Rakazo ไม่มีการจัดการเรื่องการเรียกเก็บเงินสำหรับโมเดล คุณต้องนำ key มาเอง .env.example จะตั้งค่า PI_DEFAULT_PROVIDER=openrouter ดังนั้น OPENROUTER_API_KEY จึงเป็นตำแหน่งปกติที่ใช้ และ key ของผู้ให้บริการรายอื่นก็ทำงานผ่านการตั้งค่าเดียวกันนี้

เก็บ key ไว้ใน .env และอย่าใส่ไว้ในไฟล์ใดๆ ที่คุณ commit คำสั่ง compose ทั้งหมดใน repository จะส่งผ่าน --env-file .env ดังนั้นค่าต่างๆ จะถูกส่งไปยัง container โดยไม่ต้องเขียนลงในไฟล์ YAML ที่ git ติดตาม นอกจากนี้ คุณสามารถเว้น OPENROUTER_API_KEY ให้ว่างไว้แล้ววาง key ในแอปพลิเคชันระหว่างขั้นตอน onboarding ซึ่งเป็นอีกเหตุผลหนึ่งที่ ENCRYPTION_KEY จำเป็นต้องใช้ค่าสุ่มที่แท้จริงแทนที่จะใช้ค่าเริ่มต้นที่มากับซอฟต์แวร์

กำหนดวงเงินการใช้งานสำหรับ key ที่หน้าเว็บไซต์ของผู้ให้บริการก่อนที่จะให้บอทเริ่มใช้งาน บอทที่ทำงานวนลูปคือบอทที่ใช้จ่ายเงิน และการจำกัดวงเงินต่อ key เป็นวิธีหยุดการใช้งานเพียงวิธีเดียวที่ไม่ขึ้นอยู่กับการที่คุณต้องคอยเฝ้าดู ตั้งชื่อเฉพาะให้กับ key นี้เพื่อให้คุณสามารถเพิกถอนสิทธิ์เฉพาะ key นั้นได้โดยไม่กระทบส่วนอื่น

การเปลี่ยนจากโหมดพัฒนาไปสู่การใช้งานจริง

repository นี้มีไฟล์ compose สำหรับการใช้งานจริง (production) ซึ่งจะรัน Postgres, API, worker, web app และ Caddy สำหรับจัดการใบรับรอง TLS (transport layer security) ที่ได้รับมาโดยอัตโนมัติ โดยระบบต้องการ E2B สำหรับคอมพิวเตอร์ของบอท

sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

harden-host.sh จะปิดการล็อกอิน SSH ด้วยรหัสผ่าน, ตั้งค่ากฎ UFW (uncomplicated firewall) สำหรับ SSH, HTTP และ HTTPS, เปิดใช้งาน fail2ban และใช้โปรไฟล์ AppArmor โปรดอ่านรายละเอียดก่อนเรียกใช้งาน เนื่องจากสคริปต์นี้จะเปลี่ยนวิธีการล็อกอินของคุณ ควรเปิดหน้าต่าง SSH ทิ้งไว้อีกหนึ่งเซสชันในขณะที่สคริปต์ทำงาน

.env สำหรับการใช้งานจริงต้องการทรัพยากรมากกว่าโหมดพัฒนา เอกสารการ self-host ได้ระบุค่าขั้นต่ำไว้แล้ว

NODE_ENV=production
RAKAZO_HOST=app.example.com
BETTER_AUTH_URL=https://app.example.com
WEB_ORIGIN=https://app.example.com
API_URL=https://app.example.com
POSTGRES_PASSWORD=<random>
BETTER_AUTH_SECRET=<random>
ENCRYPTION_KEY=<random>
E2B_API_KEY=<your key>
OPENROUTER_API_KEY=<your key>
SANDBOX_PROVIDER=e2b
AGENT_RUNTIME=pi
DATA_DIR=/data

ให้ชี้ A record มาที่เซิร์ฟเวอร์ก่อนที่จะรัน up ครั้งแรก Caddy จะร้องขอใบรับรองสำหรับชื่อที่ระบุใน RAKAZO_HOST ซึ่งคำขอจะล้มเหลวหากชื่อนั้นไม่ชี้มาที่เครื่องนี้ หรือหากพอร์ต 80 ถูกปิดไม่ให้เข้าถึงจากภายนอก

นอกจากนี้ให้ตั้งค่า SIGNUP_ALLOWLIST=you@example.com เนื่องจาก SIGNUPS_ENABLED=true เป็นค่าเริ่มต้น อินสแตนซ์ที่ใช้ชื่อสาธารณะจะยอมรับการลงทะเบียนจากใครก็ตามที่พบ และบัญชีใหม่ทุกบัญชีจะได้รับคอมพิวเตอร์หนึ่งเครื่อง ดังนั้นควรตั้งค่า allowlist ไว้ก่อน แล้วค่อยผ่อนปรนในภายหลังหากต้องการ

ให้ยึดถือ docs/self-host.md ใน repository เป็นหลักสำหรับค่าคอนฟิกในการใช้งานจริง เนื่องจากค่าเหล่านี้จะเปลี่ยนแปลงไปตามโค้ดซึ่งคู่มือนี้อาจไม่ได้อัปเดตตาม ในเมื่อ Compose เป็นตัวจัดการงานหลัก กฎทั่วไปจึงยังคงมีผล และ พื้นฐาน Docker Compose สำหรับ VPS ได้อธิบายไว้ว่าเหตุใด --env-file และ named volumes จึงมีความสำคัญมากขึ้นเมื่อ stack นั้นเป็นสิ่งที่คุณต้องปล่อยให้รันต่อเนื่องเป็นเวลาหลายเดือน

การสำรองข้อมูล

Postgres และไดเรกทอรี data/ คือส่วนประกอบทั้งหมดของอินสแตนซ์

./scripts/backup.sh
./scripts/restore.sh backups/BACKUP_TIMESTAMP

backup.sh จะทำการ dump ข้อมูล Postgres และจัดเก็บไฟล์ใน data/ สำหรับเครื่องที่คุณต้องใช้งานอยู่ตลอดเวลา ให้ติดตั้ง infra/compose/backup-prod.sh ในฐานะ /usr/local/sbin/rakazo-backup โดยใช้ timer ที่มาพร้อมกับ repository เพื่อให้ระบบหมุนเวียนไฟล์สำรองข้อมูลโดยอัตโนมัติ การสำรองข้อมูลที่เก็บไว้ในดิสก์ลูกเดียวกับฐานข้อมูลไม่ใช่การสำรองข้อมูลที่แท้จริง ดังนั้นควรคัดลอกข้อมูลออกไปไว้ที่อื่น จากนั้นให้ทดสอบการกู้คืนข้อมูลบนเซิร์ฟเวอร์สำรองอย่างน้อยหนึ่งครั้งก่อนที่จะมีความจำเป็นต้องใช้งานจริง

สาเหตุที่ทำให้ล้มเหลวและสิ่งที่คุณจะพบ

pnpm db:migrate ไม่สามารถเชื่อมต่อกับฐานข้อมูลได้ การทำ migration รายงานว่าไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลที่ 127.0.0.1:5433 ได้ สาเหตุอาจเกิดจากคอนเทนเนอร์ Postgres ยังไม่ทำงาน หรือทำงานอยู่แต่ยังไม่พร้อมใช้งาน ให้รันคำสั่ง docker compose --env-file .env -f infra/compose/docker-compose.yml ps แล้วตรวจสอบว่าบริการ postgres รายงานสถานะเป็น healthy หรือไม่ เนื่องจากไฟล์ compose มีการกำหนด health check ที่ทำงานทุกๆ 3 วินาที หากคอนเทนเนอร์มีการรีสตาร์ทวนซ้ำ มักหมายความว่า volume pgdata ถูกสร้างขึ้นด้วยข้อมูลประจำตัวที่แตกต่างกัน การใช้ docker compose ... down -v จะเป็นการล้างค่าดังกล่าว ซึ่งจะทำให้ข้อมูลที่อยู่ในนั้นถูกลบไปด้วย

พอร์ตถูกใช้งานอยู่แล้ว การเริ่มทำงานของ Postgres จะล้มเหลวด้วยข้อความ bind: address already in use หากมีกระบวนการอื่นใช้งานพอร์ต 5433 อยู่ ซึ่งส่วนใหญ่มักเกิดจาก stack ของ Rakazo ตัวเก่าที่คุณลืมหยุดการทำงาน ให้ใช้ sudo ss -lntp | grep 5433 เพื่อระบุชื่อกระบวนการนั้น

บอทไม่ได้รับคอมพิวเตอร์ หากไม่มีอิมเมจ rakazo/computer:local ใน SANDBOX_PROVIDER=docker ก็จะไม่มีสิ่งใดให้เริ่มทำงาน docker image ls rakazo/computer จะแสดงคำตอบในบรรทัดเดียว และ pnpm sandbox:build จะช่วยแก้ไขปัญหานี้ หาก supervisor ไม่สามารถเข้าถึง Docker socket ได้ ก็จะไม่สามารถสร้างคอนเทนเนอร์ได้เช่นกัน โดยข้อความแจ้งเตือนจะระบุเส้นทางไว้ที่ permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

คำสั่งที่ใช้เวลานานหยุดทำงานกลางคัน .env.example ได้กำหนดค่า SANDBOX_COMMAND_TIMEOUT_MS=300000 ไว้ ทำให้คำสั่งเดียวภายในคอมพิวเตอร์ของบอทถูกตัดการทำงานหลังจากผ่านไป 5 นาที ให้เพิ่มค่านี้สำหรับการ build ที่ใช้เวลานาน แทนที่จะสันนิษฐานว่า sandbox เกิดการ crash

pnpm install ทำงานผิดพลาดในรูปแบบที่น่าสับสน ให้ตรวจสอบ node -v ก่อนเป็นอันดับแรก เนื่องจาก workspace มีการประกาศ >=22 ไว้ และ Node เวอร์ชันเก่ามักจะล้มเหลวในส่วนของโค้ด dependency แทนที่จะแสดงข้อความแจ้งเตือนเกี่ยวกับเวอร์ชัน

การลงชื่อเข้าใช้ทำงานได้ในเครื่อง แต่ใช้งานผ่านโดเมนไม่ได้ ค่า BETTER_AUTH_URL, WEB_ORIGIN และ API_URL ทั้งหมดจะต้องระบุ public origin ให้ตรงกับที่ปรากฏในแถบที่อยู่ของเบราว์เซอร์ รวมถึง scheme ด้วย สาเหตุที่พบบ่อยที่สุดที่ทำให้ session ไม่คงอยู่คือการมีค่า http://127.0.0.1:5173 เก่าค้างอยู่ในค่าใดค่าหนึ่งเหล่านี้

การอัปเดต checkout ที่ระบุเวอร์ชันไว้

ขั้นตอนการอัปเกรดในเอกสารสำหรับ self-host นั้นสั้น: ดึงซอร์สโค้ดใหม่, รันการย้ายฐานข้อมูล (database migration), และรีสตาร์ท API กับ worker

./scripts/backup.sh
git fetch --all
git checkout NEW_COMMIT_SHA
pnpm install
pnpm --filter @rakazo/db migrate
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

สำรองข้อมูลก่อนเสมอ การย้ายฐานข้อมูลจะเดินหน้าไปข้างหน้าเท่านั้น และเวอร์ชัน beta ไม่มีเส้นทางย้อนกลับที่คุณจะวางใจได้ ให้อ่านรายการ commit ระหว่าง SHA ที่คุณระบุไว้กับ SHA ใหม่ก่อนที่จะดำเนินการ เพราะโปรเจกต์ที่ยังอยู่ในช่วงเริ่มต้นเช่นนี้มักเปลี่ยนชื่อ environment variable โดยไม่มีการประกาศล่วงหน้า และการขาดหายไปของตัวแปรจะส่งผลให้ service เริ่มทำงานแล้วหยุดไปทันที หากคุณยังตัดสินใจไม่ได้ว่า Rakazo เป็นสิ่งที่เหมาะสมที่จะใช้งานหรือไม่ บทสรุปของ AI agent แบบ self-hosted จะครอบคลุมถึงตัวเลือกอื่นในหมวดหมู่นี้และค่าใช้จ่ายในการดูแลรักษาของแต่ละตัว

FAQ

ฉันสามารถรัน Rakazo บน VPS ขนาด 1 GB ได้หรือไม่

ไม่ได้ เนื่องจาก Postgres, API, worker, sandbox supervisor และเว็บแอปต้องทำงานพร้อมกันทั้งหมด และด้วย SANDBOX_PROVIDER=docker บอทที่ตื่นอยู่ทุกตัวจะเพิ่มคอนเทนเนอร์ที่บรรจุเดสก์ท็อปแบบกราฟิกและเบราว์เซอร์เข้าไป เอกสารของโครงการระบุว่า 2 vCPU และ 4 GB เพียงพอสำหรับ API, worker และ Postgres เฉพาะในกรณีที่ E2B เป็นผู้โฮสต์เดสก์ท็อปของบอทเท่านั้น ให้ถือว่า 4 GB เป็นค่าต่ำสุดสำหรับ control plane และควรใช้สเปกที่สูงกว่าหากรันเดสก์ท็อปบนเครื่องของคุณเอง

ผู้ให้บริการ sandbox เดสก์ท็อปมีความปลอดภัยบนเซิร์ฟเวอร์หรือไม่

ไม่ปลอดภัย desktop รันคำสั่งของบอทโดยตรงบนโฮสต์ของ API และ worker ในฐานะผู้ใช้ที่รันกระบวนการนั้น ซึ่งทำให้ไฟล์และข้อมูลรับรองของผู้ใช้รายนั้นตกอยู่ในความเสี่ยง คลังซอร์สโค้ดระบุว่าไม่ควรใช้งานบนเซิร์ฟเวอร์สาธารณะหรือเซิร์ฟเวอร์ที่ใช้ร่วมกับผู้อื่น ให้ใช้ docker สำหรับการแยกคอนเทนเนอร์ต่อหนึ่งบอท หรือ e2b เมื่อมีผู้ใช้งานมากกว่าหนึ่งคนเข้าสู่ระบบ

ฉันควรติดตั้ง Rakazo เวอร์ชันใด

ณ วันที่ 16 สิงหาคม 2026 มีแท็กเดียวคือ v0.1.0-beta ซึ่งเผยแพร่เมื่อวันที่ 13 สิงหาคม 2026 และถูกระบุว่าเป็นรุ่น prerelease ให้ใช้ commit ที่แท็กนั้นชี้ไปคือ 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb แทนการติดตาม main เนื่องจาก branch สามารถเปลี่ยนแปลงได้ตลอดเวลาและแท็กอาจถูกย้ายไปชี้ที่อื่นได้ ทั้งสองอย่างจึงไม่สามารถระบุสถานะของซอร์สโค้ดที่คุณจะย้อนกลับมาใช้งานได้แน่นอน ให้บันทึกค่า commit ไว้ เพราะการย้อนกลับจะทำได้ก็ต่อเมื่อคุณทราบว่าเวอร์ชันใดที่ทำงานได้ปกติ

ฉันควรใส่ OpenRouter API key ไว้ที่ไหน

ให้ใส่ใน .env ในรูปแบบ OPENROUTER_API_KEY และห้ามใส่ในไฟล์ compose ที่คุณทำ commit โดยเด็ดขาด คำสั่ง compose ทั้งสองรายการในคลังซอร์สโค้ดจะส่งผ่าน --env-file .env ดังนั้นค่าดังกล่าวจะเข้าถึงคอนเทนเนอร์ได้โดยไม่ต้องเขียนลงในไฟล์ YAML ที่ถูกติดตาม คุณสามารถเว้นว่างไว้แล้วค่อยวางคีย์ในแอปในระหว่างขั้นตอนการตั้งค่าเริ่มต้นได้ ทั้งนี้ควรตั้งค่าวงเงินการใช้งานที่ผู้ให้บริการไว้ด้วย เพราะหากบอทติดลูป มันจะเรียกใช้งานโมเดลไปเรื่อยๆ จนกว่าจะมีสิ่งใดมาหยุดมัน

ฉันจำเป็นต้องมีชื่อโดเมนและ TLS หรือไม่

สำหรับการใช้งานจริงนอกเหนือจากการทดสอบเบื้องต้น จำเป็นต้องมี ไฟล์ compose สำหรับ production จะรัน Caddy และขอใบรับรองโดยอัตโนมัติ โดยที่ RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGIN และ API_URL จะต้องใช้ HTTPS origin สาธารณะเดียวกันทั้งหมด สำหรับการทดสอบครั้งแรก คุณสามารถข้ามขั้นตอนการใช้โดเมนได้ โดยรัน pnpm dev และทำ port forwarding พอร์ต 5173 ผ่าน SSH แทนการเปิดพอร์ตสาธารณะ