Skip to content

Releases: nubster-opensources/lightshuttle

v0.4.0

04 Jun 21:58
429ec77

Choose a tag to compare

See diff against the previous tag for details.

v0.3.1

03 Jun 03:33
9b3249f

Choose a tag to compare

See diff against the previous tag for details.

v0.3.0

02 Jun 12:23
b3d988f

Choose a tag to compare

Production Export release. Adds the export: manifest section and the lightshuttle export <target> command, which transpiles a manifest to Docker Compose, plain Kubernetes manifests or a Helm chart. Ships two new published crates, a full offline validation CI job and a round of documentation harmonisation.

Added

  • New crate lightshuttle-spec (#105): extracts ContainerSpec, from_resource resolution and SpecError from lightshuttle-runtime into a dedicated, dependency-light crate, enabling downstream consumers (the export crate) to perform lowering without pulling in the full runtime.
  • New crate lightshuttle-export (#87): manifest-to-artifact transpilation pipeline.
    • lower() converts a resolved manifest to a target-neutral ExportModel (reuses from_resource from lightshuttle-spec, zero drift).
    • Emitter trait with three implementations: Compose, Kubernetes and Helm.
    • resolve module: six pure helper functions shared across emitters (port defaults, image tags, DNS-1123 normalisation, healthcheck command extraction, volume mount classification, secret heuristic).
    • Secret heuristic: environment variable names containing PASSWORD, PASSWD, SECRET, TOKEN or KEY are classified as Secret in Kubernetes and Helm output.
  • export: typed manifest section with per-target overrides for Compose, Kubernetes and Helm (#86).
  • lightshuttle export <target> [--output <dir>] [--force] CLI command (#88): guards against overwriting a non-empty output directory without --force, prints a summary of emitted files.
  • Docker Compose emitter (#89): emits a docker-compose.yml with typed service model, depends_on: condition: service_healthy, top-level named volumes and loopback port bindings by default.
  • Kubernetes manifests emitter (#90): emits Deployment, Service, ConfigMap, Secret and PersistentVolumeClaim resources plus a namespace.yaml; maps healthcheck probes to liveness/readiness probes; DNS-1123 name normalisation.
  • Helm chart emitter (#91): emits Chart.yaml, values.yaml and per-resource templates/*.yaml; parametrised via index .Values.services; full parity with the Kubernetes emitter.
  • External validation CI job validate-export (#92): probes tool availability with --help before running; validates Compose output with docker compose config, Kubernetes with kubeconform and Helm with helm lint; non-blocking, runs offline.

Fixed

  • Relative host volume paths (e.g. ./data:/var/lib/data) are now resolved to absolute paths at manifest load time via Manifest::resolve_host_volume_paths(base_dir), so emitted artefacts are portable across working directories (#107).

Documentation

  • docs/spec/export.md: export: section schema, target matrix and per-target mapping rules (Compose, Kubernetes, Helm), cross-cutting rules (secret heuristic, DNS-1123 names, built images, reproducibility).
  • docs/tutorial/export.md: end-to-end walkthrough of lightshuttle export against a runnable four-service manifest.
  • examples/04-export: runnable manifest demonstrating the export: section and all three targets.
  • Full doc-set harmonisation: README and getting-started dropped pre-alpha framing and now install from crates.io; Commands table and Documentation index added to README; manifest spec moved dashboard: and export: out of future-reserved; release process lists all seven crates; semver policy names the lightshuttle CLI.

Notes for upgraders

  • Two new crates are published: lightshuttle-spec and lightshuttle-export.
  • The export: manifest key is no longer future-reserved; it is parsed and validated.
  • Relative host volume paths in volumes are now resolved at manifest load time. Manifests that relied on the raw relative form being forwarded as-is should switch to absolute paths or keep using relative paths (they will be resolved correctly from the manifest's directory).

v0.2.0

31 May 13:36
f9a6b35

Choose a tag to compare

Dashboard and observability release. Adds a local HTTP control plane with a web dashboard, live log and event streaming, a restart workflow, a bundled OpenTelemetry collector, orchestrator self-tracing and Prometheus metrics. Ships two new published crates and a round of network-surface hardening.

Added

  • New crate lightshuttle-control (#43): the local HTTP control plane and dashboard, served on 127.0.0.1.
    • LifecycleHandle trait and ManagerHandle adapter exposing the running stack without leaking runtime types (#44).
    • HTTP control server wired into up with a GET /healthz probe (#45).
    • REST API GET /api/resources and GET /api/resources/{name} (#46).
    • WebSocket log streaming on GET /ws/logs/{name} (#47).
    • POST /api/resources/{name}/restart plus a GET /ws/events lifecycle event stream (#49).
    • Server-side rendered dashboard built with Askama and HTMX, with an embedded stylesheet and HTMX bundle (#50).
  • New crate lightshuttle-otel (#51): bundles the otel/opentelemetry-collector container, injects the standard OTEL_* environment variables into resources and exposes an observability.otel manifest section.
    • Orchestrator self-tracing over OTLP and a Prometheus /metrics endpoint on the dashboard server (#52).
  • restart_one lifecycle primitive on LifecycleManager, with three ordered lifecycle events (#48).
  • lightshuttle restart <resource> CLI command that follows lifecycle events to completion, with a --detach flag (#49).
  • lightshuttle alias command (install/check/uninstall) that manages the optional lsh shell alias: detects bash, zsh, fish and PowerShell, refuses to shadow a conflicting lsh on the PATH, and edits the startup file idempotently (#40).
  • Optional dashboard.port manifest field (#45).

Changed

  • Dependency upgrades: bollard 0.18 to 0.21, schemars 0.8 to 1, jsonschema 0.17 to 0.46; axum gains the ws feature (#64). The generated JSON Schema now targets draft 2020-12.
  • The lifecycle event channel moved from mpsc to broadcast so multiple consumers (dashboard, CLI, metrics) can subscribe; LifecycleEvent gained serde::Serialize.
  • LifecycleError::UnknownResource was renamed to LifecycleError::ResourceNotFound.

Security

  • Published ports now bind to 127.0.0.1 by default instead of 0.0.0.0, so managed services are not exposed to the wider network; a broader bind requires an explicit address:host:container mapping (#65).
  • Generated resource passwords now use a cryptographically secure random source (#66).
  • The control plane sets baseline security headers (X-Content-Type-Options, X-Frame-Options) and a same-origin Content Security Policy (#73).
  • The restart client validates that .lightshuttle/control.url points at a loopback address (parsed, not prefix matched) and disables HTTP redirects (#72).

Fixed

  • Starting a resource now removes any container left over from a previous run before recreating it, so a second up or a restart no longer fails with a name conflict (#82).
  • Container log chunks now carry the Docker emission timestamp instead of the read time, and the timestamp prefix is stripped from the forwarded bytes (#68).
  • augment_manifest no longer overwrites a user resource named lightshuttle_otel (#67).
  • The tracing subscriber is installed with try_init, returning an error instead of panicking on a double install (#69).
  • The metrics pump no longer leaks a pending entry when a resource fails before becoming healthy (#71).
  • The bundled collector healthcheck no longer always reports healthy; a crash now surfaces through the container exit status (#70).
  • Database identifier length is bounded to the PostgreSQL 63 byte limit (#75).
  • Interpolation references inside command and healthcheck.test are now validated statically (#76).

Documentation

  • docs/spec/control-api.md (REST and WebSocket surface), docs/spec/observability.md (spans and metrics) and docs/tutorial/dashboard.md (dashboard walkthrough).

Notes for upgraders

  • Two new crates are published: lightshuttle-control and lightshuttle-otel.
  • Managed services now bind to loopback by default. Use the explicit address:host:container port form to expose a service on another interface.
  • LifecycleError::UnknownResource is now LifecycleError::ResourceNotFound. This is a breaking change for direct consumers of lightshuttle-runtime.

v0.1.0

26 May 05:31
24122b6

Choose a tag to compare

See CHANGELOG.md for details.