Commit Graph
261 Commits
Author SHA1 Message Date
Jarek Krochmalski 4d09c9c76f local-path backup destinations validate the configured path 2026-09-02 15:52:44 +02:00
Jarek Krochmalski 46a137316f faster incremental backups when multiple stacks share one repository 2026-09-02 15:52:44 +02:00
Jarek Krochmalski 002f53ce78 optional stacks_dir flat layout for local stacks 2026-09-02 15:52:44 +02:00
Jarek Krochmalski 3fa75c9702 drop the unused hawser stacks-dir column and layout 2026-09-02 15:52:44 +02:00
Jarek Krochmalski 5af4e69eb2 tighten permission checks and input validation across the api 2026-09-02 15:52:44 +02:00
Badal Singhandxd003 77686da02a feat(stacks): optional STACKS_DIR layout with Hawser display paths (#1482)
When STACKS_DIR is set, local managed stacks are stored in a flat
$STACKS_DIR/<stackName>/ layout instead of $DATA_DIR/stacks/<env>/<stack>/.
Existing stacks are not moved automatically and continue to resolve from
their existing locations. Invalid or unwritable STACKS_DIR values produce a
warning and fall back to $DATA_DIR/stacks instead of aborting startup. With
this layout, local stack names must be unique across environments.

Hawser agents report their remote stacks directory on hello. That path is
persisted on the environment as hawser_stacks_dir so compose APIs and the UI
can show host paths rather than Dockhand staging paths. Staging paths are
remapped to and from the remote stack dir for compose files, backups, and
environment settings. Backup restore may write under either the default
staging root or the configured STACKS_DIR.

Co-authored-by: xd003 <[email protected]>
2026-08-31 18:54:27 +02:00
Jarek Krochmalski ee4632a7b7 stacks page: env-var counts from sources, icon batching, and an in-order restart 2026-08-27 19:48:35 +02:00
Jarek Krochmalski a9b1998aad allow secret-less webhook triggers behind an env flag 2026-08-27 16:32:06 +02:00
Jarek Krochmalski 9a1f11c9b7 require the git permission for repository deploy/sync/test 2026-08-27 16:32:06 +02:00
Jarek Krochmalski cc48b1e14b bump svelte to 5.56.10 2026-08-27 16:32:05 +02:00
Jarek Krochmalski 0816672222 harden authentication and authorization on the user API 2026-08-27 11:31:35 +02:00
Jarek Krochmalski 5adb374c0d keepass secret provider fails closed when a group cannot be listed 2026-08-27 08:10:03 +02:00
Jarek Krochmalski d34a7733f7 validate and canonicalize outbound request hosts 2026-08-27 07:34:38 +02:00
Jarek Krochmalski 0d516be4dd sort by Disk I/O and Net I/O - the header cycles read/write and down/up 2026-08-27 07:34:38 +02:00
Jarek Krochmalski b1e7518096 release housekeeping 2026-08-27 07:34:38 +02:00
Jarek Krochmalski c7eb8542a1 pausing or resuming a backup schedule no longer clears the retention policy 2026-08-27 07:34:37 +02:00
Jarek Krochmalski e82b1aea89 optional Webhook column on the stacks list with a git stack's webhook id and copy-URL button 2026-08-27 07:34:37 +02:00
Jarek Krochmalski b04bc504f9 option to disable the session timeout 2026-08-27 07:34:37 +02:00
Jarek Krochmalski ef390e94ec internal cleanups and build config 2026-08-27 07:34:37 +02:00
Jarek Krochmalski fdca208795 git stacks can now set a custom icon 2026-08-27 07:34:37 +02:00
Jarek Krochmalski 58f712d432 environment API uses a write-only model for the tls key and hawser token 2026-08-27 07:34:37 +02:00
Jarek Krochmalski 9264a53a44 compose validate flags a service with no healthcheck and a defined-but-unused named volume 2026-08-27 07:34:37 +02:00
Jarek Krochmalski 909e9934d3 compose generated from a container now captures network config and resource limits 2026-08-27 07:34:37 +02:00
Jarek Krochmalski bd42cfaa1b coalesce concurrent secret-provider probes 2026-08-27 07:34:37 +02:00
Jarek Krochmalski fa1987add6 KeePassXC as a secret provider - pull secrets from a .kdbx via keepassxc-cli, bulk or inline refs 2026-08-27 07:34:37 +02:00
Jarek Krochmalski 674d80b178 release 1.0.44 2026-08-25 12:58:22 +02:00
Jarek Krochmalski a4e2637ea5 release housekeeping 2026-08-25 05:42:29 +02:00
Jarek Krochmalski d5d979aa5d hide tls certificate fields for backends that never use tls 2026-08-25 05:42:29 +02:00
Jarek Krochmalski 730ad8ff82 fix the container backups tab crashing when a container has a mount 2026-08-23 19:00:40 +02:00
Jarek Krochmalski 8ae0b4367e release housekeeping 2026-08-23 12:08:30 +02:00
Jarek Krochmalski 49d71c01b6 generate a compose file from any container - save as new or append to existing stack 2026-08-23 12:08:30 +02:00
Jarek Krochmalski c71d066835 release housekeeping 2026-08-23 11:00:36 +02:00
Jarek Krochmalski 9a7ef9c12c MQTT notification channel - publish events to a broker 2026-08-23 11:00:36 +02:00
Jarek Krochmalski 40524e0d8d release housekeeping 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 4af255ebc9 clarify stack env-var api docs (git vs internal storage, secret masking) 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 4ba349113d branch selector on git stack, with per-stack branch override 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 534ecf4564 fix switching an Infisical provider back to a static token 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 114f21385a sort IPv6 subnets and addresses numerically instead of randomly 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 2791e8c36d keep specific images from being pruned with a dockhand.prune=false label 2026-08-23 10:21:00 +02:00
Jarek Krochmalski 70491423dc Pushover notifications can target specific devices 2026-08-23 10:20:59 +02:00
Jarek Krochmalski 7692758467 TLS backup repositories with a private CA and optional mutual TLS 2026-08-23 10:20:59 +02:00
Jarek Krochmalski f6ffadbacb stack and container icons - pick an icon per stack or per container (survives recreation), plus automatic app logos on containers 2026-08-23 10:20:59 +02:00
Jarek Krochmalski 30fb770a9f compose validate: recognize socket proxies and add exposure/volume/deploy rules 2026-08-22 17:11:57 +02:00
Jarek Krochmalski b165e4608a branch selector on git stack, with per-stack branch override 2026-08-22 17:11:57 +02:00
Jarek Krochmalski 3795cecf50 git-branch-lookup: docblock says two guards, matching the code 2026-08-22 16:24:04 +02:00
Jarek Krochmalski 40f6076b8d Proton Pass inline references accept vault and item names, not just ids (pass://vault/item/field) 2026-08-22 16:22:18 +02:00
Jarek Krochmalski f1e4af3267 Infisical secret references now resolve to their value instead of the raw reference 2026-08-22 16:22:18 +02:00
Jarek Krochmalski 68821f4d92 branch selector on git stack, with per-stack branch override 2026-08-22 16:22:18 +02:00
Jarek Krochmalski 94f8f52f52 release housekeeping for 1.0.44 2026-08-22 16:22:18 +02:00
Bartosz S. 28bb291c32 feat: add branch selection to Git Stack modal with branches API endpoint (#1343)
* feat: add branch selection to Git Stack modal with branches API endpoint

- Add branch dropdown in create mode (fetches branches from new API endpoint)
- Add branch field in edit mode for existing Git stacks
- Remove redundant branch badge next to repository URL in edit mode
- Add POST /api/git/branches endpoint to list available branches
- Export buildGitEnv, buildRepoUrl, execGit from git.ts for reuse

* cla: recheck with correct author email

* fix: harden git branches endpoint and fix credential resolution

* feat(git-stacks): per-stack branch override

Add a per-stack 'branch' column to git_stacks so each stack can deploy
from a branch different from its repository's default.

- Migration 0012 (drizzle + drizzle-pg): add nullable 'branch' column
- resolveStackBranch() in git.ts: effective branch = per-stack override,
  else repository default; wired into sync/deploy/test paths
- db.ts: persist/read branch; GitStackData.branch is string | null
- API routes (preview-env, stacks create/update): honor explicit branch
  override with partial-update semantics (null/empty clears the override)
- UI: GitStackModal shows a 'Repository default' sentinel + per-stack
  selector; GitSourceBadge displays effective branch with a '(per-stack)'
  marker; stacks page passes through the per-stack branch
- tests/git-stack-branch.test.ts: unit coverage for resolveStackBranch
  and effective-branch display semantics

* feat(git-branches): security hardening per PR #1343 maintainer review

Adopts the three security recommendations from the maintainer review on
the git-branch-stack feature:

1. SSRF guard (assertSafeBranchTarget)
   New src/lib/server/git-branch-lookup.ts rejects repository URLs that
   point at private/loopback/link-local addresses before any git
   subprocess is spawned. Covers IPv4 (127/8, 169.254/16, 10/8,
   172.16/12, 192.168/16, 100.64/10, 0/8), IPv6 (::1, fe80::/10,
   fc00::/7, ::), IPv4-mapped IPv6 (::ffff:a.b.c.d), and a 25-entry
   hostname denylist (localhost, metadata.google.internal,
   host.docker.internal, etc.). Raw-URL parse only — no DNS resolution,
   avoiding TOCTOU/rebinding. Runs on BOTH the url and repositoryId
   paths (a stored repo's URL could also point internal).

2. Credential-exfiltration guard (assertCredentialUrlPair)
   A raw url paired with a stored credentialId is only allowed when the
   credential is plausibly for that host. SSH and none credentials are
   always allowed (no secret to leak). Password credentials: allowed
   when the username equals the URL host, or when the credential name
   (or its hyphen/underscore-separated segments) equals the host or its
   first label (e.g. "github-pat" → github.com). Inference-based — no
   new DB column. The repositoryId path is not subject to this guard
   (the pairing is the user's own stored config).

3. Timeout on git subprocesses
   execGit now accepts a timeoutMs parameter (default GIT_TIMEOUT_MS =
   20s, env-overridable). On timeout the process is killed with SIGKILL
   and the caller receives { timedOut: true, code: 124 }. Applied to all
   execGit call sites (clone, pull, fetch, ls-remote, etc.) so a dead
   or black-holed remote cannot stall a request indefinitely.

OpenAPI: @openapi JSDoc block added to the branches endpoint; spec
regenerated via the upstream generator (359/359 coverage, all 6 gates
pass). /api/git/branches POST entry added to openapi.generated.json.

Svelte5: fix-svelte-optional-params.sh applied to 7 .svelte files
(x?: T → x: T = undefined) to work around esbuild's rejection of
TS-only optional-parameter syntax in lang="ts" script tags.

Tests: 59 tests in tests/git-branches.test.ts covering SSRF (blocked
IPs, boundary cases), credential affinity (allowed/rejected cases),
endpoint pipeline ordering, and parseRepoHost edge cases.

Rebased onto upstream/main (a485c85) — zero conflicts; GitStackModal.svelte
had not drifted since the branch was created.

* fix(git): close SSRF/RCE/exfil gaps across all git URL+credential endpoints (PR #1343 re-review)

1. SSRF: replace hand-rolled assertSafeBranchTarget with shared URL()-based
   isSafeNotificationUrl — blocks decimal/octal/hex/short-form IPv4 and
   v4-mapped IPv6 encodings (all six maintainer bypass payloads now blocked).
   ALL schemes (http/https/ssh/git/scp-like) now judge the CANONICALIZED
   host through that single check: non-http(s) schemes can't be passed to
   URL() as-is, so the parsed host (port-stripped, IPv6 bracketed only
   when it contains a colon) is run through isSafeNotificationUrl under
   an https:// scheme. Closes the ssh/git encoded-IP bypass (decimal
   2130706433, hex 0x7f000001, short-form 127.1 over ssh://, git:// and
   scp-like all resolve to 127.0.0.1 and are now blocked).
2. Credential affinity: drop the dead second rule — with rule (i) being
   username === host, the single-label variant was identical and unreachable.
3. listRemoteBranches + testRepositoryConfig call assertSafeRepoUrl explicitly
   so the ext::/file:: transport denylist holds on every path into a git
   subprocess, not only via buildRepoUrl.
4. preview-env: assertSafeRepoTarget (SSRF+RCE) + repoFilePath containment for
   composePath/envFilePath (path traversal) + assertCredentialHostMatch
   (exfil).
5. repositories/test: assertSafeRepoTarget + assertCredentialHostMatch.

Tests: 134 across 3 files (git-branches, preview-env-security,
repositories-test-security) — lock the six http(s) encoding bypasses, the
four ssh/git encoded-IP payloads at unit and endpoint level, the subdomain
attack, single-label username, path traversal, and the endpoint pipelines.

Verified safe (no change): backup/destinations/test, registries/test,
environments/test, git/repositories CRUD, git/stacks, git/repositories/[id]/test.

* fix(git): address branch stack review feedback

- scope remote branch lookup timeout to ls-remote only
- require git:edit permission for preview-env
- clarify SSRF policy while preserving private LAN Git hosts
- support free-text branch selection for new repositories
- share production branch resolution logic with tests and UI
- add testable preview-env request pipeline
2026-08-22 10:20:43 +02:00