გაშვების გარემოს ბექენდები
PRX მხარს უჭერს მრავალ შესრულების ბექენდს ინსტრუმენტების, ბრძანებებისა და გარე პროცესების გასაშვებად. გაშვების ქვესისტემა აბსტრაჰებს შესრულების გარემოს RuntimeAdapter ტრეიტის უკან, რაც საშუალებას გაძლევთ ლოკალური პროცესის შესრულებას, Docker კონტეინერებსა და WebAssembly სენდბოქსებს შორის გადართვა აგენტის კონფიგურაციის ცვლილების გარეშე.
მიმოხილვა
როდესაც აგენტი ასრულებს ინსტრუმენტს, რომელიც გარე ბრძანების გაშვებას მოითხოვს (shell სკრიპტები, MCP სერვერები, უნარების ინტეგრაციები), გაშვების ბექენდი განსაზღვრავს, როგორ შესრულდება ეს ბრძანება:
| ბექენდი | იზოლაცია | ოვერჰედი | გამოყენების შემთხვევა |
|---|---|---|---|
| Native | პროცესის დონე | მინიმალური | დეველოპმენტი, სანდო გარემოები |
| Docker | კონტეინერის დონე | საშუალო | პროდაქშენი, არასანდო ინსტრუმენტები, რეპროდუცირებადობა |
| WASM | სენდბოქსის დონე | დაბალი | პორტატული უნარები, მაქსიმალური იზოლაცია, დანამატის სისტემა |
აგენტის ციკლი
│
├── ინსტრუმენტის გამოძახება: "shell" ბრძანებით "ls -la"
│
▼
┌───────────────────────────────────┐
│ RuntimeAdapter │
│ ┌─────────┬─────────┬─────────┐ │
│ │ Native │ Docker │ WASM │ │
│ │ Runtime │ Runtime │ Runtime │ │
│ └────┬────┴────┬────┴────┬────┘ │
└───────┼─────────┼─────────┼──────┘
│ │ │
┌────▼────┐ ┌──▼───┐ ┌──▼────┐
│ Process │ │ ctr │ │ wasmr │
│ spawn │ │ exec │ │ exec │
└─────────┘ └──────┘ └───────┘RuntimeAdapter ტრეიტი
ყველა ბექენდი RuntimeAdapter ტრეიტს ახორციელებს:
#[async_trait]
pub trait RuntimeAdapter: Send + Sync {
async fn execute(&self, command: &str, args: &[String],
env: &HashMap<String, String>, working_dir: Option<&Path>,
timeout: Duration) -> Result<ExecutionOutput>;
async fn is_available(&self) -> bool;
fn name(&self) -> &str;
}ExecutionOutput შეიცავს stdout, stderr, exit_code და duration ველებს.
კონფიგურაცია
აირჩიეთ და კონფიგურირეთ გაშვების ბექენდი config.toml-ში:
[runtime]
# ბექენდის არჩევა: "native" | "docker" | "wasm" | "auto"
backend = "auto"
# გლობალური შესრულების ტაიმაუტი (შეიძლება თითოეული ინსტრუმენტისთვის გადაფარვა).
default_timeout_secs = 60
# stdout/stderr-იდან დაფიქსირებული გამოტანის მაქსიმალური ზომა.
max_output_bytes = 1048576 # 1 MB
# გარემოს ცვლადების თეთრი სია. მხოლოდ ეს ცვლადები
# გადაეცემა შვილ პროცესებს (ყველა ბექენდისთვის).
env_whitelist = ["PATH", "HOME", "TERM", "LANG", "USER"]ავტოგამოვლენა
backend = "auto"-ისას, PRX ირჩევს გაშვების გარემოს ხელმისაწვდომობის მიხედვით:
- თუ Docker მუშაობს და ხელმისაწვდომია, Docker-ის გამოყენება
- თუ WASM გაშვების გარემო ხელმისაწვდომია, WASM-ის გამოყენება თავსებადი ინსტრუმენტებისთვის
- Native-ზე გადასვლა
ავტოგამოვლენა ერთხელ ეშვება გაშვებისას და ლოგში ჩაწერს არჩეულ ბექენდს.
Native გაშვების გარემო
Native გაშვების გარემო ბრძანებებს ლოკალურ შვილ პროცესებად უშვებს tokio::process::Command-ის გამოყენებით. ეს არის ყველაზე მარტივი და სწრაფი ბექენდი, დამატებითი დამოკიდებულებების გარეშე.
კონფიგურაცია
[runtime]
backend = "native"
[runtime.native]
# shell ბრძანებების შესრულებისთვის.
shell = "/bin/bash"
# დამატებითი გარემოს ცვლადების დაყენება.
[runtime.native.env]
RUSTFLAGS = "-D warnings"მახასიათებლები
| თვისება | მნიშვნელობა |
|---|---|
| იზოლაცია | მხოლოდ პროცესის დონე (მემკვიდრეობს მომხმარებლის ნებართვებს) |
| გაშვების დრო | < 10ms |
| ფაილურ სისტემაზე წვდომა | სრული (შეზღუდული მომხმარებლის ნებართვებითა და სენდბოქსით) |
| ქსელზე წვდომა | სრული (შეზღუდული სენდბოქსით) |
| დამოკიდებულებები | არცერთი |
| პლატფორმა | ყველა (Linux, macOS, Windows) |
უსაფრთხოების გათვალისწინებები
Native გაშვების გარემო არ უზრუნველყოფს იზოლაციას სტანდარტული Unix პროცესის საზღვრების მიღმა. ბრძანებები PRX პროცესის იგივე ნებართვებით ეშვება. ყოველთვის დააკომბინირეთ სენდბოქსის ქვესისტემასთან არასანდო ბრძანებების გაშვებისას:
[runtime]
backend = "native"
[security.sandbox]
backend = "bubblewrap"
allow_network = false
writable_paths = ["/tmp"]Docker გაშვების გარემო
Docker გაშვების გარემო ბრძანებებს ეფემერულ კონტეინერებში ასრულებს. თითოეული შესრულება ახალ კონტეინერს ქმნის, ბრძანებას უშვებს, გამოტანას ფიქსირებს და კონტეინერს ანადგურებს.
კონფიგურაცია
[runtime]
backend = "docker"
[runtime.docker]
image = "debian:bookworm-slim"
socket = "/var/run/docker.sock"
memory_limit = "256m"
cpu_limit = "1.0"
pids_limit = 100
network = "none" # "none" | "bridge" | "host"
mount_workspace = true
workspace_mount_path = "/workspace"
auto_pull = true
auto_remove = trueგაშვების დრო 500ms-2წ არის, გამოსახულებაზე დამოკიდებულებით. ფაილურ სისტემაზე წვდომა შეზღუდულია კონტეინერით და ცალსახად მიერთებული ტომებით.
უსაფრთხოება
Docker გაშვების გარემო ნაგულისხმევად ძლიერ იზოლაციას უზრუნველყოფს: ქსელის იზოლაცია (network = "none"), რესურსების ლიმიტები (მეხსიერება/CPU/PID), მხოლოდ-წაკითხვადი root ფაილური სისტემა, პრივილეგირებული რეჟიმის გარეშე და შესრულების შემდეგ კონტეინერის ავტომატური წაშლა. ინსტრუმენტისთვის სპეციფიკური გამოსახულების გადაფარვა მხარდაჭერილია [runtime.docker.tool_images]-ით.
WASM გაშვების გარემო
WASM (WebAssembly) გაშვების გარემო .wasm მოდულებად კომპილირებულ ინსტრუმენტებს ასრულებს. WASM უზრუნველყოფს პორტატულ, სენდბოქსით იზოლირებულ შესრულებას WASI-ით (WebAssembly System Interface) წვრილმარცვლოვანი შესაძლებლობების კონტროლით.
კონფიგურაცია
[runtime]
backend = "wasm"
[runtime.wasm]
# WASM გაშვების ძრავა: "wasmtime" | "wasmer"
engine = "wasmtime"
# .wasm მოდულების შემცველი დირექტორია.
module_path = "~/.local/share/openprx/wasm/"
# WASM მოდულებისთვის მინიჭებული WASI შესაძლებლობები.
[runtime.wasm.capabilities]
filesystem_read = ["/workspace"]
filesystem_write = ["/tmp"]
network = false
env_vars = ["HOME", "USER"]
# ერთი WASM გამოძახების მაქსიმალური შესრულების დრო.
timeout_secs = 30
# WASM მოდულებისთვის მაქსიმალური მეხსიერების გამოყოფა.
max_memory_mb = 128მახასიათებლები
| თვისება | მნიშვნელობა |
|---|---|
| იზოლაცია | WASM სენდბოქსი (შესაძლებლობებზე დაფუძნებული) |
| გაშვების დრო | 10-50ms |
| ფაილურ სისტემაზე წვდომა | მხოლოდ WASI-ით წინასწარ გახსნილი დირექტორიები |
| ქსელზე წვდომა | კონფიგურირებადი WASI-ით |
| დამოკიდებულებები | wasmtime ან wasmer გაშვების გარემო (პირობითი კომპილაცია) |
| პლატფორმა | ყველა (WASM პლატფორმისგან დამოუკიდებელია) |
პირობითი კომპილაცია
WASM გაშვების გარემო პირობითად კომპილირდება ფუნქციის ფლაგის უკან:
# PRX-ის აშენება WASM მხარდაჭერით
cargo build --release --features wasm-runtimeფუნქციის ფლაგის გარეშე, WASM ბექენდი ხელმისაწვდომი არ არის და backend = "auto" მას გამოტოვებს.
დანამატის სისტემა
WASM გაშვების გარემო PRX-ის დანამატის სისტემას აძლიერებს. .wasm მოდულებად გავრცელებული უნარები დინამიურად იტვირთება მშობლიური კოდის ნდობის გარეშე. დაარეგისტრირეთ WASM ინსტრუმენტები config.toml-ში [tools.custom.<name>]-ის ქვეშ type = "wasm" და module ბილიკით.
ქარხნის ფუნქცია
PRX ქარხნის ფუნქციას (create_runtime) იყენებს ბექენდის გაშვებისას ასარჩევად. იგი კონფიგურირებულ backend სტრიქონს შესაბამის RuntimeAdapter იმპლემენტაციასთან ათანხმებს და ამოწმებს, რომ ბექენდი ხელმისაწვდომია (მაგ., Docker-ის დემონი მუშაობს, WASM ძრავა კომპილირებულია).
შედარების მატრიცა
| ფუნქცია | Native | Docker | WASM |
|---|---|---|---|
| დაყენების სირთულე | არცერთი | Docker-ის დემონი | ფუნქციის ფლაგი + მოდულები |
| გაშვების შეყოვნება | < 10ms | 500ms - 2წ | 10-50ms |
| იზოლაციის სიძლიერე | დაბალი | მაღალი | მაღალი |
| რესურსების კონტროლი | OS-ის ლიმიტები | cgroups | WASM მეხსიერების ლიმიტები |
| ქსელის იზოლაცია | სენდბოქსით | ჩაშენებული | WASI შესაძლებლობა |
| ფაილური სისტემის იზოლაცია | სენდბოქსით | ჩაშენებული | WASI წინასწარ გახსნები |
| პორტატულობა | პლატფორმისთვის მშობლიური | OCI გამოსახულებები | პლატფორმისგან დამოუკიდებელი |
| ინსტრუმენტების თავსებადობა | ყველა | ყველა (გამოსახულებით) | მხოლოდ WASM-ში კომპილირებული |
უსაფრთხოების შენიშვნები
- გაშვების ბექენდი არის თავდაცვის ფენა, არა სენდბოქსის ჩანაცვლება. ორივე სისტემა ერთად მუშაობს -- გაშვების გარემო უზრუნველყოფს შესრულების გარემოს, სენდბოქსი ამატებს OS-ის დონის შეზღუდვებს.
- Docker გაშვების გარემო მოითხოვს Docker-ის სოკეტზე წვდომას, რაც თავისთავად პრივილეგირებული რესურსია. გაუშვით PRX გამოყოფილი სერვისის ანგარიშით.
- WASM მოდულებს არ აქვთ ნაგულისხმევი უფლებამოსილება. ყველა შესაძლებლობა (ფაილური სისტემა, ქსელი, გარემო) ცალსახად უნდა მიენიჭოს.
env_whitelistპარამეტრი ყველა ბექენდზე ვრცელდება. API გასაღებები და საიდუმლოებები არასოდეს გადაეცემა ინსტრუმენტის შესრულების გარემოებს.