Repository navigation
Trust and operations: signed releases, safe upgrades with rollback, backups that restore everything, Prometheus metrics and a status page, and Testcontainers for Java and Node.
- Signed releases: the release workflow signs
checksums.txtwith Sigstore keyless signing (cosign, GitHub OIDC; published aschecksums.txt.sigstore.json), attaches an SPDX SBOM for each binary, and records GitHub build provenance for the archives. The container image is signed with cosign and carries an SPDX SBOM attestation and build provenance. Third-party actions in the release workflow are pinned to commit SHAs. Verification commands are in SECURITY.md. homecloud upgradeverifies the release signature against the release workflow's identity before trustingchecksums.txt, and refuses unsigned releases; releases up to v0.4.1, published before signing, install only with--allow-unsigned(with a warning). The install scripts verify the signature whencosignis installed and fall back to the checksum with a message otherwise;install.ps1now verifies the checksum too.- Safer upgrades:
homecloud upgradesaves the data directory's state (state, config, credentials, master key, DynamoDB, queue files) to<data-dir>/upgrade-backups/<version>-<time>/and keeps the previous binary as<binary>.previous; the last 3 backups are kept.homecloud upgrade --rollback(server stopped) restores the previous binary and, if the new version already ran on the data, the saved state. - The data directory records the newest HomeCloud version that used it (
data-version.json), andhomecloud serverefuses to start on data written by a newer version, with a message suggestinghomecloud upgradeor--rollback(--allow-newer-dataoverrides).homecloud backupleaves upgrade backups out. - After
homecloud restoreonto a host without the containers, RDS and ElastiCache instances are recreated from their restored data volumes at start (same engine, version, class, endpoint, address, password, groups) instead of showingfailed; stopped ones stay stopped. Load balancers whose container is gone are re-provisioned, and EC2 container instances come back stopped with their volumes instead of being terminated (which deleted their volumes) (#106). - Prometheus metrics at
GET /metricson the API port: requests by API (native or AWS), service and operation (route patterns and AWS operation names, never IDs), errors by code, latency histograms, in-flight requests, authentication failures, managed containers by service and state, Docker reachability, MinIO/ECR/DNS/IMDS helper state, data directory and volume disk use, background loop last-run age, Lambda environments and cold/warm starts, process metrics and build info. It requires the IAM actionhomecloud:GetMetrics(an access key as a bearer token or HTTP basic auth, so Prometheus can scrape it);--metrics-addr 127.0.0.1:9464adds an unauthenticated listener, loopback-only unless--metrics-addr-insecure. GET /api/v1/system/status(IAM actionhomecloud:GetSystemStatus) reports each subsystem's health, versions, uptime, Docker details, disk use and recent errors; the console shows it on a new System status page with a copyable Prometheus scrape config.GET /api/v1/healthis unchanged.- docs/monitoring.md: scrape configs, a least-privilege Prometheus user, a Grafana dashboard (docs/grafana/homecloud.json) and alert rules.
- Testcontainers modules for Java (
io.github.solinode:testcontainers-homecloud,integrations/testcontainers-java) and Node.js (testcontainers-homecloudon npm,integrations/testcontainers-node): start HomeCloud from a JUnit or Node test, get the endpoint, credentials and ready AWS SDK clients or client config, and remove every container HomeCloud started on stop. Release workflows publish them to Maven Central and npm fromtestcontainers-java/v*andtestcontainers-node/v*tags.