Commit Graph
326 Commits
Author SHA1 Message Date
Jarek Krochmalski e7ee9b41c7 add the emergency relocate/reset-mfa scripts the tests exercise 2026-08-27 07:41:02 +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 bf518f98aa emergency script to relocate stack paths after moving DATA_DIR 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 bc73e7ba84 ci: pin node to 24.18.1 in the openapi check so npm install builds better-sqlite3 2026-08-23 10:26:44 +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
Jarek Krochmalski 0885e8245f bump checkout action to v5 for node 24 runners 2026-08-22 09:27:23 +02:00
Jarek Krochmalski 9700412a8f updated generate-changelog-page.ts 2026-08-22 09:25:42 +02:00
Jarek Krochmalski aff8f25d2a internal cleanups and build config 2026-08-22 09:10:20 +02:00
Jarek Krochmalski 5f9e6bde3c add missing unit test suite 2026-08-22 09:09:50 +02:00
Jarek Krochmalski 7227b334f9 release housekeeping for 1.0.44 2026-08-22 09:09:42 +02:00
Jarek Krochmalski e23936b4df azure key vault as a secret provider (bulk pull or inline azurekv:// references) 2026-08-22 09:09:41 +02:00
Jarek Krochmalski a760680b8d detect newer version tags for pinned images and show them as a badge with release notes 2026-08-22 09:09:41 +02:00
Jarek Krochmalski 9977476b15 a compose stack with a restarting container shows a stop action instead of start 2026-08-22 09:09:30 +02:00
Jarek Krochmalski e68fd2fc0e 1password deploys reuse the sdk client to cut api calls 2026-08-22 09:09:30 +02:00