Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions coolify-rs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/target/
152 changes: 152 additions & 0 deletions coolify-rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions coolify-rs/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[workspace]
resolver = "3"
members = [
"crates/coolify-core",
"crates/coolify-docker",
"crates/coolify-ssh",
"crates/coolify-benchmarks",
]

[workspace.package]
edition = "2024"
rust-version = "1.91"
license = "Apache-2.0"

[workspace.dependencies]
coolify-core = { path = "crates/coolify-core" }
coolify-docker = { path = "crates/coolify-docker" }
coolify-ssh = { path = "crates/coolify-ssh" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
thiserror = "2.0"
10 changes: 10 additions & 0 deletions coolify-rs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Coolify Rust Rewrite Slice

This workspace is an initial Rust rewrite slice for the v4 backend migration. It is intentionally small and buildable:

- `coolify-core`: domain models that mirror selected Laravel models.
- `coolify-ssh`: typed SSH pool configuration and command telemetry primitives.
- `coolify-docker`: zero-copy Docker manifest parsing for Engine API responses.
- `coolify-benchmarks`: reproducible parser benchmark harness for the Docker slice.

The slice establishes ownership, validation, structured errors, and benchmark boundaries before larger API or queue rewrites are added.
24 changes: 24 additions & 0 deletions coolify-rs/benchmarks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Benchmark Notes

Run from this directory:

```bash
cargo run -p coolify-benchmarks --release
```

This first slice benchmarks Docker manifest parsing because large Docker Engine responses are a known migration pressure point. The parser uses `serde_json::from_slice` with borrowed string fields, so digest and media-type payloads are not copied into owned strings.

Current PHP baseline from the bounty specification:

- Docker API calls add roughly 35 ms overhead above the raw socket path.
- Target Rust overhead is under 10 ms above raw socket.

The benchmark reports per-manifest parse latency so future PRs can compare parser overhead before wiring the full Unix socket client.

Local validation on Apple Silicon with Rust 1.91.1:

```text
docker_manifest_iterations=25000
docker_manifest_total_ms=22
docker_manifest_ns_per_parse=882
```
9 changes: 9 additions & 0 deletions coolify-rs/crates/coolify-benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[package]
name = "coolify-benchmarks"
version = "0.1.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true

[dependencies]
coolify-docker.workspace = true
40 changes: 40 additions & 0 deletions coolify-rs/crates/coolify-benchmarks/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use coolify_docker::summarize_manifest;
use std::time::Instant;

const MANIFEST: &[u8] = br#"{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:config",
"size": 7023
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:layer-one",
"size": 32654
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:layer-two",
"size": 16724
}
]
}"#;

fn main() {
let iterations = 25_000_u32;
let started = Instant::now();

for _ in 0..iterations {
summarize_manifest(MANIFEST).expect("benchmark fixture parses");
}

let elapsed = started.elapsed();
let nanos_per_parse = elapsed.as_nanos() / u128::from(iterations);

println!("docker_manifest_iterations={iterations}");
println!("docker_manifest_total_ms={}", elapsed.as_millis());
println!("docker_manifest_ns_per_parse={nanos_per_parse}");
}
13 changes: 13 additions & 0 deletions coolify-rs/crates/coolify-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "coolify-core"
version = "0.1.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true

[dependencies]
serde.workspace = true
thiserror.workspace = true

[dev-dependencies]
serde_json.workspace = true
Loading