Releases: nubster-opensources/lightshuttle
Releases · nubster-opensources/lightshuttle
v0.4.0
v0.3.1
See diff against the previous tag for details.
v0.3.0
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): extractsContainerSpec,from_resourceresolution andSpecErrorfromlightshuttle-runtimeinto 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-neutralExportModel(reusesfrom_resourcefromlightshuttle-spec, zero drift).Emittertrait with three implementations: Compose, Kubernetes and Helm.resolvemodule: 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,TOKENorKEYare classified asSecretin 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.ymlwith 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,SecretandPersistentVolumeClaimresources plus anamespace.yaml; maps healthcheck probes to liveness/readiness probes; DNS-1123 name normalisation. - Helm chart emitter (#91): emits
Chart.yaml,values.yamland per-resourcetemplates/*.yaml; parametrised viaindex .Values.services; full parity with the Kubernetes emitter. - External validation CI job
validate-export(#92): probes tool availability with--helpbefore running; validates Compose output withdocker compose config, Kubernetes withkubeconformand Helm withhelm 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 viaManifest::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 oflightshuttle exportagainst a runnable four-service manifest.examples/04-export: runnable manifest demonstrating theexport: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:andexport:out of future-reserved; release process lists all seven crates; semver policy names thelightshuttleCLI.
Notes for upgraders
- Two new crates are published:
lightshuttle-specandlightshuttle-export. - The
export:manifest key is no longer future-reserved; it is parsed and validated. - Relative host volume paths in
volumesare 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
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 on127.0.0.1.LifecycleHandletrait andManagerHandleadapter exposing the running stack without leaking runtime types (#44).- HTTP control server wired into
upwith aGET /healthzprobe (#45). - REST API
GET /api/resourcesandGET /api/resources/{name}(#46). - WebSocket log streaming on
GET /ws/logs/{name}(#47). POST /api/resources/{name}/restartplus aGET /ws/eventslifecycle 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 theotel/opentelemetry-collectorcontainer, injects the standardOTEL_*environment variables into resources and exposes anobservability.otelmanifest section.- Orchestrator self-tracing over OTLP and a Prometheus
/metricsendpoint on the dashboard server (#52).
- Orchestrator self-tracing over OTLP and a Prometheus
restart_onelifecycle primitive onLifecycleManager, with three ordered lifecycle events (#48).lightshuttle restart <resource>CLI command that follows lifecycle events to completion, with a--detachflag (#49).lightshuttle aliascommand (install/check/uninstall) that manages the optionallshshell alias: detects bash, zsh, fish and PowerShell, refuses to shadow a conflictinglshon the PATH, and edits the startup file idempotently (#40).- Optional
dashboard.portmanifest field (#45).
Changed
- Dependency upgrades:
bollard0.18 to 0.21,schemars0.8 to 1,jsonschema0.17 to 0.46;axumgains thewsfeature (#64). The generated JSON Schema now targets draft 2020-12. - The lifecycle event channel moved from
mpsctobroadcastso multiple consumers (dashboard, CLI, metrics) can subscribe;LifecycleEventgainedserde::Serialize. LifecycleError::UnknownResourcewas renamed toLifecycleError::ResourceNotFound.
Security
- Published ports now bind to
127.0.0.1by default instead of0.0.0.0, so managed services are not exposed to the wider network; a broader bind requires an explicitaddress:host:containermapping (#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
restartclient validates that.lightshuttle/control.urlpoints 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
upor arestartno 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_manifestno longer overwrites a user resource namedlightshuttle_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
commandandhealthcheck.testare now validated statically (#76).
Documentation
docs/spec/control-api.md(REST and WebSocket surface),docs/spec/observability.md(spans and metrics) anddocs/tutorial/dashboard.md(dashboard walkthrough).
Notes for upgraders
- Two new crates are published:
lightshuttle-controlandlightshuttle-otel. - Managed services now bind to loopback by default. Use the explicit
address:host:containerport form to expose a service on another interface. LifecycleError::UnknownResourceis nowLifecycleError::ResourceNotFound. This is a breaking change for direct consumers oflightshuttle-runtime.
v0.1.0
See CHANGELOG.md for details.