deploy แอปแรกของคุณไปยังเซิร์ฟเวอร์ด้วย erpc worker

สร้าง HTTP API ขนาดเล็กด้วย Rust โดยใช้ erpc worker รันบนเครื่องของคุณ แล้ว deploy ไปยังเซิร์ฟเวอร์ด้วยคำสั่งสี่คำสั่ง
หน้านี้อธิบาย ERPC CLI v0.1.0-rc.4 ซึ่งเป็นเวอร์ชัน pre-release
erpc worker (ชื่อย่อ erpc w) คอมไพล์แอปของคุณเป็น native Linux binary แล้วรันบน ERPC VPS, VPS รายชั่วโมงเครื่องใหม่ หรือเซิร์ฟเวอร์ของคุณเอง ภายใต้ systemd unit ที่เสริมความปลอดภัย โดยไม่มี Docker และไม่มี runtime คั่นกลาง
release ที่ไม่ทำงานปกติหลังเริ่มจะถูก rollback กลับไปยัง release ก่อนหน้า และหลายแอปใช้เซิร์ฟเวอร์เดียวกันได้ โดยแต่ละแอปมีพอร์ตของตัวเอง ทุกอย่างเกี่ยวกับแอปอยู่ใน erpc.toml ที่ root ของแอป ซึ่งไม่มี secret อยู่ภายในและ commit ได้

ข้อกำหนดเบื้องต้น

  • บัญชี ERPC ที่ลงชื่อเข้าใช้บนเครื่องนี้ด้วย erpc login แล้ว (ลงชื่อเข้าใช้และคีย์)
  • ERPC Credit สำหรับ VPS รายชั่วโมงเครื่องใหม่ บริการรายชั่วโมงชำระด้วย ERPC Credit ซึ่งซื้อไว้ล่วงหน้า และหาก credit ไม่พอครอบคลุมการเริ่มใด การเริ่มนั้นจะถูกปฏิเสธ ดูราคาได้ที่ ราคา และ ERPC Web Dashboard
  • SSH key บนเครื่องนี้: ssh-keygen -t ed25519 หรือ erpc config set ssh_key <path>.pub สำหรับคีย์ที่คุณมีอยู่แล้ว
  • วิธี build สำหรับ Linux หากใช้ Mac หรือ Windows ต้องมี Rust target สำหรับเซิร์ฟเวอร์ (rustup target add x86_64-unknown-linux-gnu), zig (brew install zig บน macOS) และ cargo-zigbuild (cargo install cargo-zigbuild --locked) หากใช้เครื่อง Linux ประเภทเดียวกับเซิร์ฟเวอร์ (x86-64 สำหรับเซิร์ฟเวอร์ ERPC ทุกเครื่อง) ไม่ต้องมีอะไรนอกจาก cargo หากไม่มีเครื่องมือ cross-build แอปจะถูก build ด้วย toolchain ของเครื่องนี้เอง และ binary จะต้องใช้ glibc ที่ใช้ link ตอน build ซึ่ง build และ deploy จะระบุไว้ หากมีเครื่องมือเหล่านี้ แอปจะถูก build สำหรับ glibc 2.31 ขึ้นไป

การ deploy HelloWorld

HelloWorld คือ HTTP API ขนาดเล็กที่เขียนด้วย Rust ซึ่งไม่ต้องใช้คีย์ ไม่ต้องใช้ secret และไม่ต้องใช้สายข้อมูล โดยตอบ GET /, GET /hello/{name} และ GET /healthz
bash
erpc worker init --template helloworld   # makes ./hello-world
erpc worker run hello-world              # here: curl http://127.0.0.1:3000/
erpc worker deploy hello-world           # your VPS, or a new hourly one (price asked first)
erpc worker api / --dir hello-world      # {"message":"Hello, World!",…} from the server
  1. init สร้างแอปไว้ใน ./hello-world พร้อม erpc.toml ของแอป
  2. run build แอปแล้วรันบนเครื่องของคุณ เพื่อให้คุณเรียกด้วย curl ได้ก่อน
  3. deploy build แอปสำหรับเซิร์ฟเวอร์แล้ว deploy แอปนั้น สิ่งใดที่มีค่าใช้จ่ายจะแสดงให้เห็นก่อน พร้อมราคารายชั่วโมง ยอดคงเหลือของคุณ และระยะเวลาที่ credit จะใช้ได้ และเมื่ออยู่ในเทอร์มินัล จะเริ่มหลังจากตอบ yes เท่านั้น
  4. api เรียก API ของแอปที่ deploy แล้วจากเครื่องของคุณ โดย API ยังคงอยู่บน loopback ของเซิร์ฟเวอร์
erpc worker check แสดงรายการสิ่งที่แอปยังขาด และเมื่อยังขาดบางอย่าง deploy จะปฏิเสธก่อนซื้อสิ่งใด erpc worker build รันเฉพาะการ build ซึ่งเป็นวิธีดูว่า build ล้มเหลวก่อนที่จะซื้อเซิร์ฟเวอร์

เลือกเทมเพลต

erpc worker init ถามเพียงเรื่องเดียว คือจะสร้างอะไร โดยเลือกด้วยปุ่มลูกศร
  • HelloWorld คือเทมเพลตที่ควรใช้เริ่มต้น
  • HFT และ pumpfun-bot ในตอนนี้สร้างจากเทมเพลต pumpfun ทั้งคู่ ซึ่งเป็นบอทเทรด pump.fun (PumpSwap) ที่ port มาจาก ValidatorsDAO/solana-stream
--template hft (หรือ helloworld, pumpfun-bot หรือ id ของเทมเพลต) จะข้ามการเลือก และ --name ใช้ตั้งชื่อแอป หากไม่ระบุชื่อ แอปจะได้ชื่อตามสิ่งที่เลือก (hello-world, hft-bot, pumpfun-bot) เมื่อมีไดเรกทอรีชื่อนั้นอยู่แล้ว คนที่เลือกเองจะได้ -2, -3 ต่อไปเรื่อย ๆ ส่วนสคริปต์ (--yes, --json, ไม่มีเทอร์มินัล) จะได้ error เมื่อไม่มีใครให้ถามและไม่มี --template สิ่งที่จะถูกสร้างคือ HelloWorld
บอทเทรดต้องมีคีย์และการตั้งค่าบางอย่างก่อนจึงจะรันได้ ลำดับเป็นดังนี้:
bash
erpc login                             # once per machine: the session in 1Password or the keychain
erpc worker init                       # pick with the arrow keys; makes ./<name> with erpc.toml
cd <name>
erpc worker key new                    # the trading key, in 1Password, the keychain or the keystore; prints the public key to fund
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
erpc worker check                      # what erpc.toml describes, and what is missing
erpc worker run --grpc --ip <IPV4>     # build and run here, with an hourly gRPC line letting this machine in
erpc worker run --check --grpc --ip <IPV4>   # the same, stopped once healthy
erpc worker deploy --new-vps --grpc    # a new hourly VPS and gRPC line, prices asked first
init จะแสดงลำดับนี้สำหรับแอปที่สร้างขึ้น ส่วน คีย์และ secret อธิบายว่าคีย์และ secret ถูกเก็บไว้ที่ใด

เลือกเซิร์ฟเวอร์

deploy จะใช้รายการแรกที่เข้าเงื่อนไขจากรายการต่อไปนี้:
  1. เซิร์ฟเวอร์ที่ [env.<name>] ของแอประบุไว้อยู่แล้ว
  2. --vps <id> ซึ่งเป็น ERPC VPS ในบัญชีของคุณ
  3. --new-vps คือ VPS รายชั่วโมงที่ถูกที่สุดในภูมิภาคที่ใกล้เครื่องนี้ที่สุดตามเขตเวลาของเครื่อง (--region และ --plan ใช้เลือกเป็นอย่างอื่น)
  4. --host <address> คือเซิร์ฟเวอร์ของคุณเอง ได้แก่ Ubuntu หรือ Debian ที่มี systemd, nftables, sudo และ Python 3 ที่ /usr/bin/python3 โดยเข้าถึงในฐานะ root หรือผู้ใช้ที่ใช้ sudo ได้โดยไม่ต้องใส่รหัสผ่าน
  5. หากไม่ใช่กรณีข้างต้นและอยู่ในเทอร์มินัล จะแสดงรายการ VPS ที่กำลังทำงานในบัญชีของคุณ โดยมี "start a new one" อยู่ท้ายรายการ
บนเซิร์ฟเวอร์ของคุณเอง ไฟร์วอลล์ของ worker จะ drop การเชื่อมต่อขาเข้าทุกรายการยกเว้น SSH และพอร์ตของแอป ดังนั้นเซิร์ฟเวอร์ที่ให้บริการอย่างอื่นอยู่จึงไม่ใช่เซิร์ฟเวอร์ที่ควรใช้

deploy โดยไม่มีคนอยู่ที่เทอร์มินัล

สคริปต์ หรือเอเจนต์อย่าง erpc ai ไม่มีเทอร์มินัลให้ตอบ แต่มี flag สองตัวที่ช่วยให้ทำงานได้เช่นเดียวกัน:
bash
erpc worker deploy hello-world --new-vps --yes                     # no key: all the way, unattended
erpc worker deploy pump-sniper --new-vps --grpc --yes --prepare    # a bot: everything but its key
erpc worker deploy pump-sniper                                     # then you, at a terminal: the key, and the start
  • --yes ตอบรับราคาของบริการรายชั่วโมงแต่ละรายการที่คำสั่งระบุ (--new-vps, --grpc, --shreds, --unlimited) และยังตอบการเข้าสู่ระบบครั้งแรกในเซิร์ฟเวอร์ที่ erpc ยังไม่ได้ตั้งให้เข้าได้ด้วยคีย์เท่านั้น ซึ่งเป็นเซิร์ฟเวอร์ใหม่ หรือเซิร์ฟเวอร์ที่ระบุด้วย --vps <ID>: erpc จะเข้าสู่ระบบหนึ่งครั้งด้วยรหัสผ่านของเซิร์ฟเวอร์ ใส่คีย์ของคุณ แล้วปิดการเข้าสู่ระบบด้วยรหัสผ่าน หากไม่มี --yes และไม่มีเทอร์มินัล การเริ่มจะถูกปฏิเสธก่อนซื้อสิ่งใด โดยมี exit status 3
  • การเลือกระหว่างเซิร์ฟเวอร์ของคุณยังคงต้องอาศัยคน ให้ระบุเซิร์ฟเวอร์ด้วย --new-vps, --vps <ID> หรือ --host
  • --prepare ทำทุกอย่างที่ไม่ต้องใช้ทั้งคีย์เทรดและ secret และไม่เริ่ม หยุด หรือรีสตาร์ทสิ่งใดเลย erpc worker deploy ครั้งถัดไปในเทอร์มินัลจะส่งมอบคีย์และ secret แล้วเริ่มแอป คีย์เทรดจะถูกอ่านเฉพาะเมื่อมีคนอยู่ที่เทอร์มินัลเท่านั้น

เชื่อมต่อแอปของคุณกับ gRPC, Shreds และ Unlimited RPC

สายข้อมูลรายชั่วโมงของ ERPC อนุญาตเซิร์ฟเวอร์ตามที่อยู่ของเซิร์ฟเวอร์ และไม่รับ token โดย deploy มี flag หนึ่งตัวต่อสายข้อมูลหนึ่งสาย สำหรับเริ่มสายนั้นให้เซิร์ฟเวอร์ และแอปจะได้รับ endpoint ของสายข้อมูลนั้นเป็นการตั้งค่า:
Flagสายข้อมูลสิ่งที่แอปได้รับ
--grpcGeyser gRPCGRPC_ENDPOINT
--shredsShreds (Shredstream gRPC)SHREDS_ENDPOINT
--unlimitedUnlimited RPC ในภูมิภาคของเซิร์ฟเวอร์SOLANA_SEND_RPC_ENDPOINT
  • สายข้อมูลแต่ละสายจะเป็นแพ็กเกจที่ถูกที่สุดในกลุ่มของตัวเอง เว้นแต่ --grpc-plan, --shreds-plan หรือ --unlimited-plan จะระบุแพ็กเกจไว้
  • Unlimited RPC รันบนเซิร์ฟเวอร์เฉพาะที่ใช้เวลาเตรียมนานถึง 45 นาที โดยให้บริการ sendTransaction และ method สำหรับอ่านข้อมูลอีกจำนวนไม่มาก แต่ไม่ให้บริการ getProgramAccounts หรือ getTokenAccountsByOwner ส่วน endpoint ของ Unlimited RPC เป็น HTTP ธรรมดา (ไม่มี TLS) และอนุญาตเฉพาะที่อยู่ที่อยู่ใน whitelist เท่านั้น

สายข้อมูลสำหรับการรันบนเครื่องของคุณ

erpc worker run รับ --grpc และ --shreds ได้เช่นกัน เพื่อทดลองแอปที่นี่กับข้อมูลจริงก่อนนำไปไว้บนเซิร์ฟเวอร์
  • ที่อยู่: สายข้อมูลจะอนุญาตที่อยู่ IPv4 สาธารณะของเครื่องนี้ ซึ่งคุณส่งด้วย --ip โดย erpc จะไม่ค้นหาที่อยู่นี้เอง
  • การซื้อ: สายข้อมูลใหม่จะถูกซื้อเฉพาะในเทอร์มินัล หลังจากแสดงราคาแล้วเท่านั้น run ไม่มี --yes
  • การยุติ: เมื่อการรันจบลง สายข้อมูลรายชั่วโมงแต่ละสายจะถูกยุติหลังจากถามก่อน --keep-lines จะเก็บสายข้อมูลไว้ และยังคงถูกเรียกเก็บเงิน หากการรันจบลงด้วยวิธีอื่น (ปิดเทอร์มินัล หรือกด Ctrl-C ครั้งที่สอง) สายข้อมูลจะยังคงอยู่และถูกเรียกเก็บเงิน
  • ตัวเลข: สิ่งที่แอปวัดได้ที่นี่รวมระยะทางจากเครื่องนี้ไปยังสายข้อมูลไว้ด้วย จึงช้ากว่าแอปเดียวกันที่รันบนเซิร์ฟเวอร์ที่อยู่ใกล้สายข้อมูล

ขั้นตอนถัดไป