Commit Graph
261 Commits
Author SHA1 Message Date
jarek 5f401602bb release housekeeping 2026-08-19 14:26:45 +02:00
Björn Strausmann 64aeee6c3e ci: add OpenAPI drift-gate workflow (follow-up to #1342) (#1429) 2026-08-19 10:43:23 +02:00
jarek adabaffb23 API: validating a stack's env vars no longer drops the environment id 2026-08-18 10:05:37 +02:00
jarek e9b6bf48a7 hint that op:// and pass:// references only resolve in the stack env panel 2026-08-18 10:05:37 +02:00
jarek e73c7b3d68 backup helper wait uses an unbounded deadline 2026-08-18 10:05:37 +02:00
jarek f7ca18fa0c container update notifications now fire properly 2026-08-18 10:05:37 +02:00
jarek 6fe735ad97 git stacks accept a compose/env path with a leading slash 2026-08-18 10:05:36 +02:00
jarek 9b6b6a9d3e Infisical: the project ID is optional when using a service token - it's taken from the token 2026-08-18 10:05:36 +02:00
jarek ba1a9588b9 detect newer version tags for pinned images and show them as a badge with release notes 2026-08-18 10:05:36 +02:00
jarek 088c7dc343 OpenAPI spec at /api/docs with a Scalar viewer, opt-in via FEAT_API_DOCS 2026-08-18 10:05:36 +02:00
jarek 1ad16a7c2a Compose validate - a preflight linter & validator for compose files 2026-08-18 10:05:36 +02:00
jarek 6fab8ec70a release housekeeping 2026-08-18 10:05:36 +02:00
Jarek Krochmalski 5c0fa6aa91 add the missing OpenAPI generator (scripts/generate-openapi.ts + scripts/openapi) so a clean checkout builds 2026-08-18 05:12:37 +02:00
Sergei Nesterkov 7a007bd623 feat(notifications): add Zabbix history.push provider (#1419)
* feat(notifications): add Zabbix history.push provider

* test(notifications): add Zabbix provider tests
2026-08-17 15:24:47 +02:00
Jarek Krochmalski 8f29216701 Update README.md 2026-08-17 13:26:30 +02:00
jarek 0547ca1970 adopting a stack over the API rejects a compose path not on Dockhand's filesystem 2026-08-17 09:50:35 +02:00
jarek 88fa9bcab5 backup notifications show a real title and message instead of "undefined" 2026-08-17 09:50:35 +02:00
jarek d7c0c88794 concurrent git syncs sharing an SSH credential no longer fail on a missing temp key 2026-08-17 09:50:35 +02:00
jarek da26f7f764 OpenAPI spec at /api/docs with a Scalar viewer, opt-in via FEAT_API_DOCS 2026-08-17 09:50:34 +02:00
jarek ba8670af66 detect newer version tags for pinned images and show them as a badge with release notes 2026-08-17 09:50:34 +02:00
jarek 1740fdccfa Infisical: Universal Auth (Machine Identity) as well as a static token 2026-08-17 09:50:34 +02:00
jarek ef6c22a6ea Proton Pass as a secret provider via an operator-installed pass-cli client 2026-08-17 09:50:34 +02:00
jarek 95fd26656b Bitwarden Secrets Manager as a secret provider via an operator-installed bws client 2026-08-17 09:50:34 +02:00
jarek ff006965ce release housekeeping 2026-08-17 09:50:34 +02:00
StefanSa 593659f652 Add Bitwarden Secrets Manager provider via external bws (#1416)
* add external bws Bitwarden secrets provider

* add self-hosted Bitwarden server support
2026-08-17 08:15:36 +02:00
jarek 3b43946a38 container update no longer fails on Podman for containers using userns_mode: keep-id 2026-08-16 08:15:30 +02:00
jarek 0a08c94287 optional indentation guides in the compose/YAML editor 2026-08-16 08:15:30 +02:00
jarek cda446a232 release housekeeping 2026-08-16 08:15:30 +02:00
jarek 19548772df reject duplicate secret provider name with a 400 2026-08-14 15:59:50 +02:00
jarek 5fef45e003 validate secret provider config before save 2026-08-14 14:01:36 +02:00
jarek 344ad4aadc external vault providers - live probing secrets when editing stack 2026-08-14 10:40:02 +02:00
jarek 9a416e165f point the compose timeout error at COMPOSE_TIMEOUT 2026-08-14 09:35:37 +02:00
jarek a38e973155 grouped container logs now show one merged timeline sorted by time 2026-08-14 09:35:37 +02:00
jarek a89a6e3bd4 multi-arch images no longer show false "update available" 2026-08-14 09:35:36 +02:00
jarek 32a86129d0 stack secrets from external providers (1Password, HashiCorp Vault, Infisical and Doppler) 2026-08-14 09:35:36 +02:00
jarek 78d67d2dc1 release housekeeping 2026-08-14 09:35:36 +02:00
jarek cd5d2651b3 backfill missing 0009/0010 drizzle snapshots for both dialects 2026-08-13 13:53:12 +02:00
jarek 959a426507 internal cleanups and build config 2026-08-13 10:20:30 +02:00
jarek 3c75bd4919 backup engine internals - restic timeout and stack-dir capture 2026-08-13 10:20:30 +02:00
jarek 610e46dc19 read-side backup snapshot endpoints use job polling 2026-08-13 10:20:30 +02:00
jarek 315c795058 container update no longer fails on Podman when CPU limits are set 2026-08-13 10:20:30 +02:00
jarek f1a3311c90 start, stop or restart on Hawser updates its files on the remote host, not only on redeploy 2026-08-13 10:20:29 +02:00
jarek cc0d50913a updating a compose file over the API now saves it, not just deploys it 2026-08-13 10:20:29 +02:00
jarek 16ee5d82b9 reopening the MFA setup screen while MFA is enabled no longer wipes the secret and backup codes 2026-08-13 10:20:29 +02:00
jarek ce93e92f6e support caddy-docker-proxy labels 2026-08-13 10:20:29 +02:00
jarek c91f38eddf upload a Docker image .tar through the UI (docker load) for air-gapped hosts 2026-08-13 10:20:29 +02:00
jarek f43736d94a stack secrets from external providers (1Password, HashiCorp Vault, Infisical and Doppler) 2026-08-13 10:20:29 +02:00
jarek d7f435dd5f release housekeeping 2026-08-13 10:20:29 +02:00
1ad36a83fb feat: Add pluggable secret providers (1Password, Infisical, HashiCorp Vault) (#1360)
* Add pluggable secret provider foundation

Introduces a provider-agnostic secret backend abstraction so stacks can
pull deploy-time secrets from 1Password, Infisical or HashiCorp Vault.

Providers implement the SecretProvider contract in secretproviders/shared.ts
and advertise which of the two resolution modes they support:

  - reference interpolation: a variable's value is an inline reference in
    the backend's own syntax (e.g. 1Password's op://vault/item/field)
  - bulk pull: every secret under a provider-defined selector, fetched as
    a flat key/value map

Adding a backend means dropping a file in secretproviders/ and registering
it in the index; no caller changes.

Four providers ship here: 1Password service account (references + bulk),
1Password Connect (references), Infisical (bulk) and HashiCorp Vault KV v2
(bulk). Provider config is persisted as an encrypted JSON blob in the new
secret_providers table, mirroring the existing notification_settings
type+config pattern, and stack_sources gains a nullable secret_provider_id.

Decrypted tokens stay in the provider modules for the duration of a call
and are never written to disk or returned to the client.

Co-authored-by: GooRoo <[email protected]>

* Add secret provider API routes and permissions

CRUD plus two test-connection endpoints under /api/secret-providers. The
unsaved variant validates a config posted from the provider form; the
stored variant tests a persisted provider by id.

Responses only ever carry provider summaries (id, type, name, timestamps).
The decrypted config never leaves the server.

Adds a "secrets" permission resource with view/create/edit/delete actions,
wired through the permission type, the role editor and the seeded roles,
and a secret_provider audit entity type so provider changes are logged.
Config rotations are audited as a boolean rather than a value.

* Resolve provider secrets at stack deploy time

Stacks can bind a secret provider; when one is bound, its secrets are
resolved and merged into the vars handed to docker compose.

Bulk pull is triggered by a selector variable: OP_ENVIRONMENT_ID, kept for
compatibility with the original 1Password integration, or the generic
DOCKHAND_SECRET_SELECTOR for any bulk-capable provider. The selector is
consumed by the provider and stripped before the vars reach the stack.
Values the bound provider recognises as inline references are resolved in
place, and references found only in the stack's .env file are promoted into
the secret set so they are never written back as literals.

Resolution is applied on deploy, on up, on recreate and on service update.
Explicitly configured secrets always win over bulk-pulled ones. A missing
or unsupported provider warns and leaves values untouched rather than
failing the deploy; a provider that errors mid-resolution fails it.

* Add secret provider settings UI and stack binding

A Secrets tab under settings lists configured providers and drives the
create/edit modal, which switches its fields on the selected provider type
and can test a connection before saving.

Both stack modals gain a provider selector so a stack can be bound to a
provider or left unbound. When a provider is bound, the bulk selector
variables are no longer reported as unused compose variables, since they
are consumed by the provider rather than the compose file.

---------

Co-authored-by: GooRoo <[email protected]>
Co-authored-by: Jarek Krochmalski <[email protected]>
2026-08-13 10:08:02 +02:00
jarek 905c4a004d persist restic cache and backup restore fixes 2026-08-09 13:46:03 +02:00